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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么org.joda.time.LocalDate是没有时区的日期?相关的知识,希望对你有一定的参考价值。

我认为org.joda.time.LocalDate这个名字有点令人困惑。文件说:

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

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

DateTime根据时区计算其字段。

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


这是我的直觉:本地日期或时间对象将代表一个时间点,但与位置有关。因此它应该包含时区信息,因为时区也为您提供某种位置信息。在任何情况下,你都知道更多关于某些人的位置而不是那个时区。

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


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

更新:

有趣的链接发布了userhttps://sourceforge.net/p/threeten/mailman/message/29962542/

答案

Terminology

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

两个框架都有一个名为LocalDate的类,用于表示没有时间且没有时区的仅限日期的值。 “本地”意味着“可以是任何地方,而不是任何特定地点”。

“本地......”课程只是一个时间的粗略概念。他们不在时间表上。在应用时区或从UTC偏移以获取时间轴上的实际时刻之前,它们没有任何实际意义。当你看到“本地”时会想:“在我们应用时区之前,这个值才真正有意义”。

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

例如,在java.time中:

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

java.time

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

Instant now = Instant.now();

应用时区ZoneId来获得ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

如果您拥有的是从UTC而不是全时区的偏移,那么使用OffsetDateTime而不是ZonedDateTime

你可以这样思考:

Instant + ZoneId - > ZonedDateTime

Instant + ZoneOffset - > OffsetDateTime

StackOverflow上已经覆盖了这些信息数百次。请搜索以了解更多信息并查看许多示例代码。

以上是关于为什么org.joda.time.LocalDate是没有时区的日期?的主要内容,如果未能解决你的问题,请参考以下文章

Redis 为什么面试都问我却不懂?因为它快吗?它为什么快?

CodeBlocks中这是为啥啊

为什么选择容器技术,又为什么选择了kubernetes?

Full GC为什么那么慢?为什么老年代垃圾回收效率比新生代低很多?为什么Minor gc速度比Major GC慢?

转载 JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要动静分离?

如何回答「为什么想做产品经理」面试核心问题3