无法转换日期 - LocalDate 减去一天

问题描述 投票:0回答:1

我对日期及其从 Date 到 LocalDate 的传递有疑问,主要错误在于年份为 1700 年的日期。 我尝试过两个不同的日期,每当年份是 1700 年时,它就会让我少一天。

Date dto = ...;
Instant inst = dto.toInstant();         
LocalDate localDate = LocalDate.ofInstant(inst, ZoneId.systemDefault());

Date dto 这是一个检索查询日期的变量。但该方法仅获取 dto 变量作为输入参数。

Tue Dec 14 00:00:00 CET 1700 -> Date
1700-12-13T23:00:00Z -> Instant
1700-12-13 -> LocalDate

Sat Jan 01 00:00:00 CET 1994 -> Date
1993-12-31T23:00:00Z -> Instant
1994-01-01 -> LocalDate

我用:

jackson.time-zone: ${TZ:Europe/Madrid}

今年有什么问题吗?

java date java-11 localdate
1个回答
3
投票

这是因为无论谁制作了

Date
ZoneId.systemDefault()
,对于 1700 年马德里偏移量与 UTC 的偏移量都有不同的看法。

无论是谁制作了

Date
,都错误地认为马德里在 1700 年 12 月 14 日是 UTC+1,因此它制作了一个代表 1700 年 12 月 14 日午夜 UTC+1 区域(“CET”)的
Date
。 ):

Tue Dec 14 00:00:00 CET 1700

这有一个相应的

Instant
,因为我们可以使用这些信息来精确定位某个时间点。这就是
toInstant
给你的。
Instant.toString
始终以 UTC(更具体地说是 ISO 8601 格式)显示,因此您会看到:

1700-12-13T23:00:00Z

1700-12-14T00:00:00+01:00 确实与 1700-12-13T23:00:00Z 是同一时间点。

当您执行

LocalDate.ofInstant
时,您将使用
ZoneId.systemDefault()
ZoneId.systemDefault()
认为马德里有 UTC-0:14:44 的偏移量。这是因为马德里一直遵守当地时间,并且直到 1900 年代才标准化时区。

因此,

LocalDate.ofInstant
从 1700-12-13T23:00:00Z 中减去 14 分 44 秒来计算偏移量 -0:14:44 处的日期,你瞧,它是 1700-12-13 .

如果可能的话,我建议您不要使用

Date
。如果您正在做的事情与时间完全相关,您应该直接与
LocalDate
合作。

© www.soinside.com 2019 - 2024. All rights reserved.