我对日期及其从 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
I use:
jackson.time-zone: ${TZ:Europe/Madrid}
今年的问题是什么?
这是因为无论是谁生产了这个Date
and ZoneId.systemDefault()
早在 1700 年,对于马德里与 UTC 的偏移量有不同的看法。
谁生产了那个Date
错误地认为马德里在 1700-12-14 是 UTC+1,所以它产生了Date
表示 UTC+1(“CET”)区域内 1700 年 12 月 14 日午夜:
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。这是因为马德里一直在观察当地时间, and 直到 1900 年代才标准化时区.
所以,LocalDate.ofInstant
从 1700-12-13T23:00:00 减去 14 分 44 秒来计算偏移量 -0:14:44 处的日期,你瞧,它仍然是 1700-12-13。
我建议你不要使用Date
如果可能的话。如果你正在做的事情与时间有关,你应该与LocalDate
直接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)