简而言之
Duration.between( // Represent a span of time, unattached to the timeline.
earlier , // `Instant` class represents a moment in UTC with a resolution as fine as nanoseconds. Current moment captured in microseconds, depending on capability of host computer hardware and operating system.
Instant.now()
) // Returns a `Duration` object. Call `to…Part` methods to get the days, hours, minutes, seconds as separate numbers.
java.time
使用现代的java.time类比早期版本的Java中捆绑的麻烦的旧日期时间类要容易得多。
获取当前时刻的UTC时间。Instant
类表示UTC时间线上的一个时刻,其分辨率为纳秒(最多九个小数位)。
在Java 8中,当前时刻以毫秒为单位捕获。在Java 9及更高版本中,由于对Clock
进行了新的实现,您可能会看到以更精细的粒度捕获当前时刻。在macOS Sierra上的Oracle Java 9 JDK中,我以微秒(六位小数秒)获取当前时刻。
Instant earlier = Instant.now() ;
…
Instant later = Instant.now() ;
计算经过的时间,作为与时间轴无关的时间跨度。对于以小时-分钟-秒为刻度(并将一天视为与日历无关的24小时时间块),请使用{{link1:Duration
}}。对于以年-月-日为刻度,请使用Period
。
Duration d = Duration.between( earlier , later )
生成一个字符串是
标准 ISO 8601 格式,
PnYnMnDTnHnMnS
,其中
P
表示开始,
T
将年-月-日与时-分-秒分开。
String output = d.toString() ; // Standard ISO 8601 format.
我强烈建议使用标准格式而不是问题中所见的格式。我曾经看到过时间格式引起了很多混乱和歧义,因为它可能被误认为是一段时间而不是一段时间跨度。ISO 8601格式明智地设计以避免这种歧义。但如果您坚持使用,在Java 9及更高版本中,您可以通过调用to...Part
方法来请求Duration
的部分。
long days = d.toDaysPart() ;
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
然后按照您的需求将其组装成一个字符串。
关于java.time
Java.time框架是在Java 8及更高版本中内置的。这些类替代了老旧的传统日期时间类,例如{{link3:java.util.Date
}}、 {{link4:Calendar
}}和{{link5: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
和 更多。
java.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的老旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程。 - Basil Bourque