为什么 org.joda.time.LocalDate 是没有时区的日期?

dis*_*ame 5 time timestamp date jodatime

我觉得这个名字org.joda.time.LocalDate有点混乱。文档说:

LocalDate 是一个不可变的日期时间类,表示没有时区的日期。

相比之下org.joda.time.DateTime说道:

ADateTime根据时区计算其字段。

我总是把这两个混淆,所以我希望有人能告诉我为什么这些名字应该有意义。


这是我的直觉:本地日期或时间对象将代表一个时间点,但与location 相关。因此它应该包含时区信息,因为时区还为您提供某种位置信息。无论如何,与没有时区的情况相比,您对某人所在位置的了解要多一些。

日期时间,至少听起来是这样,应该只代表日期和时间。从这个意义上说,它只是long自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来的值。


那么为什么实际上是相反的呢?每次我与时间戳有关时,这种命名都会让我感到困惑。有人可以解释一下吗?

更新:

用户发布的有趣链接:https : //sourceforge.net/p/threeten/mailman/message/29962542/

Bas*_*que 6

术语

您的直觉与 Joda-Time 和 java.time 使用的术语相反。

这两个框架都有一个命名LocalDate为表示没有时间和时区的仅日期值的类。“本地”的意思是“可以是任何地方,而不是任何特定的地方”。

“本地……”课程只是一个时期的粗略概念。他们不在时间线上。在您应用时区或从 UTC 偏移以获得时间线上的实际时刻之前,它们没有真正的意义。当您看到“Local”时,您会认为:“在我们应用时区之前,这个值没有任何意义”。

例如,我们说今年圣诞节是 2016-12-25。但在任何特定时刻,世界各地的日期都不相同。例如,巴黎比蒙特利尔更早地迎来新的一天。因此,要获得巴黎圣诞节开始的时刻,您必须应用Europe/Paris时区并获得当天的第一个时刻。第一个时刻将DateTime在 Joda-Time 和java.time 中由ZonedDateTime(或OffsetDateTime) 表示。

例如,在 java.time 中:

LocalDate xmas2016 = LocalDate.of( 2016 , 12 , 25 );
ZonedDateTime xmas2016FirstMomentMontreal = xmas2016.atStartOfDay( ZoneId.of( "America/Montreal" ) );
Run Code Online (Sandbox Code Playgroud)

时间

在 java.time 框架中,UTC 时间线上的一个时刻由Instant类表示。

Instant now = Instant.now();
Run Code Online (Sandbox Code Playgroud)

应用时区ZoneId, 以获取ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Run Code Online (Sandbox Code Playgroud)

如果您所拥有的只是UTC 偏移量而不是完整时区,则不要使用OffsetDateTime而不是ZonedDateTime.

你可以这样想:

Instant + ZoneId -> ZonedDateTime

Instant + ZoneOffset ->OffsetDateTime

此信息已在 StackOverflow 上讨论了数百次。请搜索以了解更多信息并查看许多示例代码。