计算Java中的日期差异

Java(或java.util库)没有内置函数来计算日期差异,我觉得很有趣。 我想从另一个日期减去一个日期以获得它们之间的时间间隔。 做这个的最好方式是什么?

我知道简单的方法是以毫秒为单位来计算时间的差异,然后将其转换为几天。 但是,我想知道这是否适用于所有情况(夏令时等)。


我知道简单的方法是以毫秒为单位来计算时间的差异,然后将其转换为几天。 但是,我想知道这是否适用于所有情况(夏令时等)。

如果您的时间来自UTC日期,或者它们只是在同一系统上测量的两次System.getCurrentTimeMillis()调用之间的差异,则您将得到有效的毫秒数作为差异,与任何时区问题无关。 (这就是为什么一切应该使用UTC作为存储格式 - 从UTC->当地时间更容易;如果您尝试以其他方式进行,那么您需要将本地时区和本地时间一起存储 - 或试图推断它,gack!)

至于把它变成几天,你应该能够除以86400000 ......而且要注意的是每隔一年左右偶尔会有一次闰秒。


如果你看看开源的话,Java不会错过很多东西:尝试Joda-Time。


在Java 8中使用Joda-Time或新的java.time包。

这两个框架都使用半开放方法,其中开始是包容性的,而结尾是排他性的。 有时标注为[) 。 这通常是定义时间跨度的最佳方法。

java.time

内置于Java 8及更高版本中的java.time框架有一个Period类,用于将时间跨度表示为若干年,若干个月和若干天。 但是这堂课只限于整整一天,没有小时,分钟和秒的表示。

请注意,我们指定了一个时区,这对确定日期至关重要。 例如,巴黎的一个新的日子早于蒙特利尔。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );

那么:2001-01-01。 现在:2015-09-07。 期间:P14Y8M6D。 天数:5362

整天来说,夏令时(DST)是无关紧要的。

如果您想要计算总天数,请使用包含一些计算方法的ChronoUnit枚举。 注意计算返回很长时间。

long days = ChronoUnit.DAYS.between( then, now );  // "5362" seen above.

我询问了如何在java.time中完成一整段时间,包括小时,分钟,秒。 在Java 8中不可能。Meno Hochschild建议使用捆绑库的一个令人惊讶的解决方法:使用javax.xml.datatype包中的Duration类。

乔达时间

以下是Joda-Time 2.3中的一些示例代码。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );

调用toString将以ISO 8601标准定义的形式PnYnMnDTnHnMnS您提供字符串表示形式。

链接地址: http://www.djcxy.com/p/18591.html

上一篇: Calculating difference in dates in Java

下一篇: Timezone Date parsing