Answer by leonbloy 是正确且至关重要的。我只是在翻译替换 Joda-Time 项目的 java.time 类。
java.time
特定时刻
时间轴上的特定时刻:
这些都替换了 Joda-Time 中的 Instant 和 DateTime 类。这些 java.time 类都具有nanoseconds 的分辨率,而 Joda-Time 使用的毫秒数。
午夜与一天的开始
对于午夜,Joda-Time 项目得出的结论是“午夜”是一个模糊且没有成效的概念。与午夜相关的课程和午夜在后来的 Joda-Time 版本中都被弃用了,取而代之的是“一天中的第一刻”的实用概念。
java.time 类使用“一天中的第一刻”方法学习了相同的课程。在 java.time 类上查找 atStartOfDay 方法,例如 LocalDate。
永远不要假设一天从 00:00 开始。夏令时 (DST) 等异常情况意味着一天可能从 01:00 等其他时间开始。
ZonedDateTime zdt =
LocalDate.of( 2017 , Month.MARCH , 12 ) // Instantiate a date-only value without time zone.
.atStartOfDay( ZoneId.of( "America/Havana" ) ) ; // Cuba jumps from 00:00 to 01:00 on Spring DST cut-over.
例如,看看古巴是如何在其春季 DST 转换的凌晨 1 点开始新的一天的。
zdt: 2017-03-12T01:00-04:00[美国/哈瓦那]
未分区
要表示大约 26-27 小时范围内可能时刻的模糊概念,但不是时间线上的实际时刻,请使用 LocalDateTime。此类故意缺少任何与 UTC 或时区的偏移量。
LocalDateTime ldt = LocalDateTime.of( 2017 , Month.JANUARY , 23 , 1 , 2 , 3 , 0 ) ;
如果您的业务环境暗示特定时区,您可以应用它来获取ZonedDateTime。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ; // Determine a specific point on timeline by providing the context of a time zone.
关于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。