我认为名字org.joda.time.LocalDate
有点令人困惑。文档说:
LocalDate
是一个不可变的日期时间类,表示没有时区的日期。
比较org.joda.time.DateTime
说:
DateTime
计算相对于时区的字段。
我总是把这两个混淆,所以我希望有人能告诉我为什么这些名字应该有意义。
这是我的直觉:本地日期或时间对象代表一个时间点,但与位置有关。因此,它应包含时区信息,因为时区还为您提供某种位置信息。无论如何,你对某些人的位置比对那个时区更了解。
日期时间,至少听起来像,应该只代表一个日期和时间。从这个意义上说,它只是自1970年1月1日星期四00:00:00世界协调时间(UTC)以来的long
值。
那为什么它实际上是相反的呢?每当我与时间戳有关时,这个命名都会让我感到困惑。有人可以解释一下吗?
更新
user发布的有趣链接:https://sourceforge.net/p/threeten/mailman/message/29962542/
答案 0 :(得分:4)
你的直觉与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框架中,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上覆盖了数百次。请搜索以了解更多信息,并查看许多示例代码。