Java 8:计算两个ZonedDateTime之间的差异

我正在尝试编写一种方法来打印两个ZonedDateTime之间的时差 ,关于时区之间的差异。

我找到了一些解决方案,但所有这些解决方案都是用LocalDateTime编写的。

您可以使用ChronoUnit 之间的方法。

此方法将这些时间转换为相同的区域(来自第一个参数的区域),然后调用直到Temporal接口中声明的方法:

static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){ return unit.between(d1, d2); } 

由于ZonedDateTimeLocalDateTime都实现了Temporal接口,因此您还可以为这些日期时间类型编写通用方法:

 static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){ return unit.between(d1, d2); } 

但请记住,为混合的LocalDateTimeZonedDateTime调用此方法会导致DateTimeException

希望能帮助到你。

TL;博士

小时,分钟,秒:

 Duration.between( zdtA , zdtB ) 

多年,几个月,几天:

 Period.between( zdtA.toLocalDate() , zdtB.toLocalDate() ) 

细节

Michal S的回答是正确的,显示了ChronoUnit

DurationPeriod

另一种途径是DurationPeriod类。 使用第一个用于较短的时间跨度(小时,分钟,秒),第二个用于较长的时间(年,月,日)。

 Duration d = Duration.between( zdtA , zdtB ); 

通过调用toString生成标准ISO 8601格式的String。 格式为PnYnMnDTnHnMnS ,其中P标记开头, T分隔两个部分。

 String output = d.toString(); 

在Java 9及更高版本中,调用to…Part方法来获取各个组件。 我的另一个答案讨论过。

示例代码

 ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdtStart = ZonedDateTime.now( z ); ZonedDateTime zdtStop = zdtStart.plusHours( 3 ).plusMinutes( 7 ); Duration d = Duration.between( zdtStart , zdtStop ); 

2016-12-11T03:07:50.639-05:00 [美国/蒙特利尔] /2016-12-11T06:14:50.639-05:00 [美/蒙特利尔]

PT3H7M

查看IdeOne.com中的实时代码 。

IntervalLocalDateRange

ThreeTen-Extra项目为java.time类添加了function。 其中一个方便的类是Interval ,它将Interval跨度表示为时间轴上的一对点。 另一个是LocalDateRange ,用于一对LocalDate对象。 相反, PeriodDuration类表示附加到时间轴的时间跨度。

Interval的工厂方法采用一对Instant对象。

 Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() ); 

您可以从Interval获取Duration Interval

 Duration d = interval.toDuration(); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

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