java - 如何获取当前日期时间——date() 和 calendar()

标签 java date datetime time date-arithmetic

我希望小时和分钟将从当前日期开始,即 2016 年 10 月 10 日结束

package com.mkyong.date;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDifferentExample
{
    public static void main(String[] args)
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        //get current date time with Date()
        Date date = new Date();
        System.out.println(dateFormat.format(date));
        //get current date time with Calendar()
        Calendar cal = Calendar.getInstance();
        System.out.println(dateFormat.format(cal.getTime()));
        String dateStart = "01/14/2012 09:29:58";
        String dateStop = "01/15/2012 10:31:48";
        //HH converts hour in 24 hours format (0-23), day calculation
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date d1 = null;
        Date d2 = null;
        try
        {
            d1 = format.parse(dateStart);
            d2 = format.parse(dateStop);
            //in milliseconds
            long diff = d2.getTime() - d1.getTime();
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
            System.out.print(diffDays + " days, ");
            System.out.print(diffHours + " hours, ");
            System.out.print(diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

结果:

2016/08/15 18:54:03
2016/08/15 18:54:03
1097 Days1 Hours 1 Minute 50 Second 
My want to result for example :
100 days 5 hours 2 minutes 

最佳答案

避免使用旧的日期时间类

您正在使用与最早版本的 Java 捆绑在一起的麻烦的旧遗留日期时间类。请改用 java.time 类。

解析

您的输入字符串几乎是标准的 ISO 8601 格式。用 T 替换中间的 SPACE。默认情况下,java.time 类使用 ISO 8601 格式解析/生成字符串。因此无需指定格式模式。

String startInput = "01/14/2012 09:29:58".replace( " " , "T" );
String stopInput = "01/15/2012 10:31:48".replace( " " , "T" );

本地日期时间

您的输入缺少任何关于与 UTC 或时区的偏移量的信息。所以我们解析为 LocalDateTime 对象。

LocalDateTime startLdt = LocalDateTime.parse( startInput );
LocalDateTime stopLdt = LocalDateTime.parse( stopInput );

如果您进一步使用这些类型,您将获得基于通用 24 小时制的结果,同时忽略夏令时 (DST) 等异常情况。

如果您知道此数据的上下文是特定时区,请应用该时区以获取 ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime start = startLdt.atZone( zoneId );
ZonedDateTime stop = stopLdt.atZone( zoneId );

如果您希望当前时刻作为开始或结束,请调用now。传递所需/预期的时区,而不是依赖 JVM 当前的默认时区。

ZonedDateTime now = ZonedDateTime.now( zoneId );

时长

Duration类表示时间跨度,总秒数加上纳秒分辨率的几分之一秒。

Duration duration = Duration.between( start , stop );

奇怪的是,在 Java 8 中,此类缺少获取构成此时间跨度的天数、小时数等的方法。 Java 9 adds to…Part methods .

long days = duration.toDaysPart();
int hours = duration.toHoursPart();
int minutes = duration.toMinutesPart();

在 Java 9 之前,您可以自己计算。

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。

许多 java.time 功能在 ThreeTen-Backport 中被反向移植到 Java 6 和 7并进一步适应AndroidThreeTenABP .

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuarter 等。

关于java - 如何获取当前日期时间——date() 和 calendar(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38958719/

相关文章:

java - spring TransactionTemplate 和 SimpleJdbcTemplate 是线程安全的吗?

大量客户端的java心跳实现

c# - 如何从周数和工作日 C# 获取日期

iphone - iPhone两次之间的时差

python - 如何在 Python/Pandas 中将变量设置为 "Today' s"date

scala - 如何在 spark scala 的数据框列中验证日期格式

datetime - 程序集 A86 - 获取并显示时间

java - 从 jar 访问资源

java - 字符串模式匹配

java - 如何将单元格值设置为日期并应用默认 Excel 日期格式?