为了账号安全,请及时绑定邮箱和手机立即绑定

用Java计算日期差

用Java计算日期差

翻阅古今 2019-11-04 10:24:26
我觉得很有趣,Java(或java.util库)没有内置函数来计算日期差。我想从另一个减去一个日期,以获得它们之间的经过时间。做这个的最好方式是什么?我知道简单的方法是将时间差以毫秒为单位,然后将其转换为天。但是,我想知道这是否在所有情况下都有效(带夏令时等)。
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我知道简单的方法是将时间差以毫秒为单位,然后将其转换为天。但是,我想知道这是否在所有情况下都有效(夏令时等)。


如果您的时间是从UTC日期得出的,或者它们仅仅是在同一系统上两次调用System.getCurrentTimeMillis()的时间差,则您将获得有效的毫秒数,与任何时区问题无关。(这就是为什么所有内容都应使用UTC作为存储格式的原因-从UTC->当地时间开始要容易得多;如果尝试采用其他方式,则需要将本地时区与当地时间一起存储-或尝试推断,g!)


至于将其转换为几天,您应该可以除以86400000...。但要注意,每隔一年左右偶尔会有一次leap秒。


查看完整回答
反对 回复 2019-11-04
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


这两个框架都使用Half-Open方法,其中开始是包含在内的,而结尾是排斥的。有时标注为[)。通常,这是定义时间跨度的最佳方法。


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使用捆绑的库令人惊讶的解决办法的建议由梅诺尔德:使用Duration中发现了类javax.xml.datatype中的包。


乔达时代

这是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。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 671 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信