简单的Java日期计算

时间:2009-03-13 16:01:19

标签: java date-arithmetic

我想在Java中进行简单的日期计算。例如,计算日期之间的天数差异(具有0时间分量)。当然你可以做一个简单的毫秒减法,除以每天的毫秒数,这可以正常工作 - 直到夏令时进入场景。 我意识到,对于“天差”的不同解释是可能的,特别是,是否应该考虑时间成分。为简单起见,我们假设我们有一个0时间组件。

这种计算似乎是一种非常普遍的需求,我觉得讨论这个问题的不同方法很好。

5 个答案:

答案 0 :(得分:11)

我会看一下Joda日期/时间库,特别是ReadableInterval 类。

在Java中操作日期/时间时,Joda让生活变得更轻松,我相信它是新Java JSR 310 wrt的基础。日期/时间。即它(或类似的东西)将出现在未来的Java版本中。

答案 1 :(得分:3)

看起来Date,Calendar和DateUtils将完成您正在寻找的所有内容。 http://commons.apache.org/lang/api/org/apache/commons/lang/time/DateUtils.html

DateUtils允许截断或舍入时间,因此您只能处理日期。你还提到了夏令时。主要的问题是当有人说他们在DST改变的那天01:30做了一些事情...... 01:30是什么时候?第一个还是第二个?幸运的是,这可以由Calendar类处理,因为它存储时区和DST偏移量。有关所有内容的详细信息,请查看以下内容: http://www.xmission.com/~goodhill/dates/deltaDates.html

答案 2 :(得分:2)

更简单的选择是使用Joda中的Days,Weeks,Months和Years类。

这样,你可以做一些简单的事情:

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays();

答案 3 :(得分:1)

Here is an article讨论在java中使用日期/日历工具来计算经过的时间。

答案 4 :(得分:1)

使用java.time

现代方法是使用java.time类,取代了麻烦的旧遗留日期时间类。

  

计算日期之间的天数差异(具有0时间分量)

LocalDate类表示没有时间且没有时区的仅限日期的值。

ChronoUnit枚举有一些方便的方法,例如between

在定义时间范围时,java.time类使用半开放方法,其中开头是包含,而结尾是独占

LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 23 );
LocalDate stop = LocalDate.of( 2017 , Month.FEBRUARY , 17 );
long daysBetween = ChronoUnit.DAYS.between( start , stop );

您可以使用Period类将该时间跨度表示为对象。

Period p = Period.between( start , stop );

关于java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore