java.time
Java 早期版本中麻烦的旧日期时间类和 Joda-Time 库现在都是遗留的,被 java.time 类所取代。
格式化模式
DateTimeFormatter 的格式化模式代码与旧的 SimpleDateFormat 类相似,但不相同。研究 JavaDoc。
OffsetDateTime
GMT-05:00 类型的项目是与 UTC 的偏移量,因此我们将其处理为 OffsetDateTime。您可以解析为ZonedDateTime,以便将这些对象与其他输入产生的对象混合在一起,但这会误导阅读您的代码的人。
ZonedDateTime
UTC实际上是一个时区的名称,所以我们处理为ZonedDateTime。
需要明确的是,GMT 和 UTC 在传统商业应用程序方面实际上是相同的。但是这里的用法不同。加号或减号表示与 UTC 的偏移量,但不是完整的时区。 UTC 文本单独是一个区域名称,一个恰好是零偏移量的特定区域,但某种字符串也可以有一个区域名称 America/Montreal 或 Europe/Paris。
查看时刻的不同方式的类:
示例代码
List<CharSequence> inputs = new ArrayList<> ( 4 );
inputs.add ( "Mon Jul 28 11:39:29 GMT-05:00 2014" );
inputs.add ( "Mon Jul 28 13:39:29 GMT+02:00 2014" );
inputs.add ( "Thu Jul 17 00:02:02 UTC 2014" );
inputs.add ( "Fri Jul 18 14:47:01 UTC 2014" );
inputs.add ( "garbage-in garbaage-out" );
inputs.add ( "Fri Jan 23 12:34:56 UTC 2099" ); // Future.
Instant now = Instant.now (); // Capture the current moment in UTC.
DateTimeFormatter fGMT = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss OOOO uuuu" );
DateTimeFormatter fUTC = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" );
for ( CharSequence input : inputs ) {
if ( input.length () == "Mon Jul 28 11:39:29 GMT-05:00 2014".length () ) {
OffsetDateTime odt = OffsetDateTime.parse ( input , fGMT );
if ( odt.toInstant ().isAfter ( now ) ) {
System.out.println ( "input: " + input + " is future." );
} else {
System.out.println ( "input: " + input + " is past or present." );
}
} else if ( input.length () == "Thu Jul 17 00:02:02 UTC 2014".length () ) {
ZonedDateTime zdt = ZonedDateTime.parse ( input , fUTC );
if ( zdt.toInstant ().isAfter ( now ) ) {
System.out.println ( "input: " + input + " is future." );
} else {
System.out.println ( "input: " + input + " is past or present." );
}
} else {
System.err.println ( "ERROR - Unexpected input: " + input );
}
}
输入:2014 年 7 月 28 日星期一 11:39:29 GMT-05:00 是过去还是现在。
输入:2014 年 7 月 28 日星期一 13:39:29 GMT+02:00 过去或现在。
输入:Thu Jul 17 00:02:02 UTC 2014 过去或现在。
输入:过去或现在是 2014 年 7 月 18 日星期五 14:47:01 UTC。
输入:1 月 23 日星期五 12:34:56 UTC 2099 是未来。
见this code run live at IdeOne.com。
日期时间数学
增加时间似乎会分散您对问题核心问题的注意力。所以我在上面的例子中忽略了这个话题。
但做起来很简单。上面的类有plus… 和minus… 方法,用于加减小时数、分钟数等。
OffsetDateTime odtLater = odt.plusHours( 1 );
ZonedDateTime zdtLater = zdt.plusMinutes( 90 );
您可以将一段时间定义为Duration。
Duration d = Duration.ofMinutes( 90 ) ;
ZonedDateTime zdtLater = zdt.plus( d );
java.time 类使用immutable objects。因此,操作的结果是一个新对象,其值基于原始对象。
关于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 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。