Java8:计算两个ZoneDateTime之间的差异

Java8:计算两个ZoneDateTime之间的差异,java,date,datetime,java-8,timezone,Java,Date,Datetime,Java 8,Timezone,我正试图写一个方法来打印两个ZoneDateTimes之间的时差,关于时区之间的差异 我找到了一些解决方案,但所有这些解决方案都是为使用LocalDateTime而编写的,您可以在中使用方法。 此方法将这些时间转换为相同的区域(从第一个参数开始的区域),然后调用直到在Temporal接口中声明的方法: static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){ retu

我正试图写一个方法来打印两个ZoneDateTimes之间的时差,关于时区之间的差异

我找到了一些解决方案,但所有这些解决方案都是为使用LocalDateTime

而编写的,您可以在中使用方法。

此方法将这些时间转换为相同的区域(从第一个参数开始的区域),然后调用直到在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 )  // 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() 
)
细节 这是正确的,显示

持续时间
期间
另一条路线是和类。第一个用于较短的时间跨度(小时、分钟、秒),第二个用于较长的时间跨度(年、月、日)

通过调用
toString
在中生成字符串。格式为
PnYnMnDTnHnMnS
,其中
P
标记开始,而
T
分隔两部分

String output = d.toString();
在Java9和更高版本中,调用
to…Part
方法来获取各个组件。在中讨论

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

PT3H7M

Interval
&
LocalDateRange
该项目向java.time类添加了功能。它的一个方便的类是将时间跨度表示为时间轴上的一对点。另一个是,对于一对对象。相比之下,
期间
持续时间
类各自表示一个时间跨度,而不是附加到时间轴上

Interval
的工厂方法采用一对
即时
对象

Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );
您可以从
间隔
获取
持续时间

Duration d = interval.toDuration();


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(发布一个具体的例子,说明你想要实现什么,并得到什么结果。Michał的答案正是我所期望的。非常感谢!你在哪里看到一个
      方法,持续时间为两个瞬间?我只看到
      公共静态持续时间(长量,临时单位)
      @BrianGordon已修复,将
      替换为之间的。谢谢。Duration与ZonedDateTime一起工作,Period与LocalDate一起工作。调用方法toLocalDate()需要在我们的zdt对象上完成。@guillaumeguerin您是对的。修复了我的代码示例。谢谢。哦,非常感谢,您的示例非常好!!!!有没有办法在两个zdt的ZoneId不同的两个zdt类型之间获得差异?@stanlick Yes:
      Duration.between(zdtA,zdtB)
      如中所示。我想
      between
      方法只是在这两个对象上调用
      ZonedDateTime::toInstant()
      Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );
      
      Duration d = interval.toDuration();