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。
Duration & Period
另一条路线是Duration 和Period 类。第一个用于较短的时间跨度(小时、分钟、秒),第二个用于较长的时间(年、月、日)。
Duration d = Duration.between( zdtA , zdtB );
通过调用toString 在standard ISO 8601 format 中生成一个字符串。格式为PnYnMnDTnHnMnS,其中P 标记开头,T 分隔两部分。
String output = d.toString();
在 Java 9 及更高版本中,调用 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-11T03:07:50.639-05:00[美国/蒙特利尔]/2016-12-11T06:14:50.639-05:00[美国/蒙特利尔]
PT3H7M
见live code in IdeOne.com。
Interval & LocalDateRange
ThreeTen-Extra 项目为 java.time 类添加了功能。其中一个方便的类是Interval,将时间跨度表示为时间轴上的一对点。另一个是LocalDateRange,用于一对LocalDate 对象。相比之下,Period 和Duration 类各自代表一个时间跨度,因为没有附加到时间线。
Interval 的工厂方法采用一对 Instant 对象。
Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );
您可以从Interval 获取Duration。
Duration d = interval.toDuration();
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。