计算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
您提供字符串表示形式。