Java 8:计算两个分区日期时间之间的差值

ff29svar  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(203)

我正在尝试编写一个方法来打印两个ZonedDateTime之间的时差,这与时区之间的差异有关。
我找到了一些解决方案,但它们都是为使用LocalDateTime而编写的。

olqngx59

olqngx591#

您可以使用ChronoUnit中的方法 between
此方法将这些时间转换为相同区域(第一个参数中的区域),然后调用Temporal接口中声明的 until 方法:

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

sbtkgmzw

sbtkgmzw2#

TL;医生

小时、分钟、秒:

Duration.between( zdtA , zdtB )  // Represent a span-of-time in terms of days (24-hour chunks of time, not calendar days), hours, minutes, seconds. Internally, a count of whole seconds plus a fractional second (nanoseconds).

年,月,日:

Period.between(                  // Represent a span-of-time in terms of years-months-days. 
    zdtA.toLocalDate() ,         // Extract the date-only from the date-time-zone object. 
    zdtB.toLocalDate() 
)

详情

Answer by Michal S正确,显示为ChronoUnit

一米一米一和一米二米一

另一种方法是DurationPeriod类,第一种用于较短的时间跨度(小时、分钟、秒),第二种用于较长的时间跨度(年、月、天)。

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

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

String output = d.toString();

在Java9和更高版本中,调用to…Part方法来获取各个组件,在another Answer of mine中讨论。

示例代码

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月11日星期三03:07:50.639 - 05:00 [美洲/蒙特利尔]/2016年12月11日星期六06:14:50.639 - 05:00 [美洲/蒙特利尔]
PT3H7M型
参见live code in IdeOne.com

一米十一米十一

ThreeTen-Extra项目为java.time类添加了功能。它的一个方便的类是Interval,用于将时间跨度表示为时间线上的一对点。另一个是LocalDateRange,用于表示一对LocalDate对象。相比之下,PeriodDuration类中的每一个都将时间跨度表示为 * not * attached to the timeline。
Interval的工厂方法接受一对Instant对象。

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

您可以从Interval获得Duration

Duration d = interval.toDuration();

大约 * java.时间 *

java.time框架内置于Java 8及更高版本中,这些类取代了麻烦的旧legacy日期-时间类,如java.util.DateCalendarSimpleDateFormat
Joda-Time项目(现在在maintenance mode中)建议迁移到java.time类。
要了解更多信息,请参阅Oracle Tutorial。并搜索堆栈溢出以获取许多示例和解释。规范是JSR 310
您可以直接与数据库交换 * java. time * 对象。使用与JDBC 4.2兼容的JDBC driver或更高版本。不需要字符串,也不需要java.sql.*类。
从哪里获得java. time类?

      • Java SE 8**、Java SE 9Java SE 10及更高版本
  • 内置。
  • 标准Java API的一部分,捆绑了实现。
  • Java 9添加了一些次要特性和修复。
      • Java SE 6Java SE 7**
  • 大多数java.time功能都是在ThreeTen-Backport中向后移植到Java 6和7的。
  • Android
  • 较新版本的Android捆绑了 * java. time * 类的实现。
  • 对于早期的Android(〈26),ThreeTenABP项目会对ThreeTen-Backport进行调整(如上所述)。

ThreeTen-Extra项目使用附加类扩展了java.time。该项目是将来可能添加到java.time的试验场。您可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

4dc9hkyq

4dc9hkyq3#

这将为您提供两个ZonedDateTimes之间的分钟数。

int minutes = (int) (end.toEpochSecond() - start.toEpochSecond()) / 60;

相关问题