我对日期及其从 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}
今年有什么问题吗?
这是因为无论谁制作了
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
合作。