Java 8:计算两个 ZonedDateTime 之间的差异tl;博士详 Duration & Period Interval & LocalDateRange 关于 java.time
我正在尝试编写一种方法来打印两个ZonedDateTime之间的时差,关于时区之间的差异。
我找到了一些解决方案,但所有这些都是为与LocalDateTime一起使用而编写的。
我正在尝试编写一种方法来打印两个ZonedDateTime之间的时差,关于时区之间的差异。
我找到了一些解决方案,但所有这些都是为与LocalDateTime一起使用而编写的。
您可以从 ChronoUnit 使用中间的方法。
此方法将这些时间转换为同一区域(从第一个参数开始的区域),然后调用直到在 Temporal 接口中声明的方法:
static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
return unit.between(d1, d2);
}
由于ZonedDateTime和LocalDateTime都实现了Temporal接口,因此您也可以为这些日期时间类型编写通用方法:
static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
return unit.between(d1, d2);
}
但请记住,对混合的LocalDateTime和ZonedDateTime调用此方法会导致DateTimeException。
希望它有帮助。
对于小时、分钟、秒:
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()
)
Michal S的答案是正确的,显示了ChronoUnit
。
Duration
& Period
另一条路线是持续时间
和期间
类。第一个用于较短的时间跨度(小时,分钟,秒),第二个用于较长的时间跨度(年,月,天)。
Duration d = Duration.between( zdtA , zdtB );
通过调用 以标准 ISO 8601 格式生成字符串。格式是标记开头并分隔两个部分的位置。toString
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
Interval
& LocalDateRange
ThreeTen-Extra 项目向 java.time 类添加了功能。它的一个方便的类是间隔
,它将时间跨度表示为时间轴上的一对点。另一个是LocalDateRange
,用于一对LocalDate
对象。相比之下,& 类分别表示未附加到时间轴的时间跨度。Period
Duration
的工厂方法采用一对对象。Interval
Instant
Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );
您可以从 中获取 .Duration
Interval
Duration d = interval.toDuration();
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。