计算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定义的表单中的字符串表示forms。

使用date4j库:

 int numDaysBetween = oneDate.numDaysFrom(anotherDate); 

有简单的方法来实现它。 我们可以使用带有循环的Calendar.add方法。 例如如下,

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date beginDate = dateFormat.parse("2013-11-29"); Date endDate = dateFormat.parse("2013-12-4"); Calendar beginCalendar = Calendar.getInstance(); beginCalendar.setTime(beginDate); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); 

beginDate和endDate之间的减去天数,以及下面的代码,

 int minusDays = 0; while (true) { minusDays++; // Day increasing by 1 beginCalendar.add(Calendar.DAY_OF_MONTH, 1); if (dateFormat.format(beginCalendar.getTime()). equals(dateFormat.format(endCalendar).getTime())) { break; } } System.out.println("The substractation between two days is " + (minusDays + 1)); 

玩的开心! @。@

我不同意Java没有计算日期之间差异的机制的说法。

Java专为全球使用而设计。 它的设计使得没有日期概念,只有“以毫秒为单位的时间”的概念。 在特定公约下对特定地点的时间和日期这样的普遍时间的任何解释仅仅是投影或观点。

日历类用于将这种绝对时间转换为日期。 如果确实需要,您还可以添加或减去日期组件。 在两次之间提供组件术语差异的唯一方法是生成日历和特定日历。 因此,您可能会争辩说标准库不包含足够聪明的格里高利历,我同意它会留下一些不足之处。

话虽如此,有很多这种function的实现,我看到其他人提供了一些例子。

Java的日期实现很差。 如果您发现Joda-Time太复杂,请尝试我对开源的贡献: http : //calendardate.sourceforge.net/javadoc/index.html