在同一时区的两个区域中,相同的 unix 时间戳具有不同的结果

Same unix timestamp in two regions which are in the same timezone has different result

此代码将 datetime 转换为 unix 时间戳,但在同一时区的 Mexico_City 和芝加哥检查结果时得到不同的结果。

结果是:

2020 年 4 月 3 日星期五 08:45:18(上午)在时区 America/Mexico 城市 (CST) 和

2020 年 4 月 3 日,星期五 09:45:18(上午)在时区 America/Chicago (CDT)

如何解决这个问题?

https://www.epochconverter.com/timezones?q=1585925118&tz=America%2FMexico_City https://www.epochconverter.com/timezones?q=1585925118&tz=America%2FChicago

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
LocalDateTime dateTime = LocalDateTime.parse(2020-04-03 09:45:18, formatter);
ZoneId zoneId = ZoneId.of("CST", ZoneId.SHORT_IDS)
ZoneOffset zoneOffset = zoneId.getRules.getOffset(LocalDateTime.now)
ldt.toInstant(ZoneOffset.of(String.valueOf(zoneOffset))).toEpochMilli //1585925118000

不同时区

您的结果表明:

Friday April 03, 2020 08:45:18 (am) in time zone America/Mexico City (CST) and

Friday April 03, 2020 09:45:18 (am) in time zone America/Chicago (CDT)

提到了两个时区,而不是一个:America/Mexico 城市和 America/Chicago。两个时区与 UTC 的标准偏移量相同,-06:00,并且都使用夏令时(夏令时,DST),但它们是不同的时区。

你的结果是正确的

今年(2020)夏令时从America/Chicago的3月8日开始。因此,在您的示例日期 4 月 3 日,观察到了夏令时。这一天在 America/Mexico_City 观察到 不是 夏令时。那里的夏令时直到 4 月 5 日才开始。这种差异解释了为什么墨西哥的时间是 8:45 而芝加哥的时间是 9:45。使用底部的链接验证两个时区的夏令时转换日期。

什么是时区?

时区,顾名思义,是地球上的一个区域,但这个概念还包括该区域的人们观察到的与 UTC 的历史、现在和已知的未来偏移。

每个时区都有一个唯一的 ID,格式为 region/city,您使用的 Epoch 转换器的输出中也使用了该格式。

CST 不是时区。 CST 是一个不明确的缩写。如评论中所述,它可能指的是中部标准时间古巴标准时间中国标准时间 .您打算使用 Central Standard Time,但即使这样也是模棱两可的:它可能指的是 North American Central Standard Time 或 Australian Central Standard Time。虽然北美中部标准时间是独一无二的、明确的,但它不是一个时区。它是 America/Chicago 和 America/Winnipeg 时区(以及更多时区)在一年中观察标准时间的相对几个月中使用的时间。在一年中的其余时间,上述时区使用中部夏令时。但是,是的,CST 也在一年中的某些时候在墨西哥城使用。

在 Java 中 ZoneId.of("CST", ZoneId.SHORT_IDS) 给你 America/Chicago 时区,因为 SHORT_IDS 被定义为这样做。此定义仅用于一个目的:为您提供一种与现在早已过时的 TimeZone class 所提供的行为兼容的行为。除非 CST 由于历史原因在您的程序中使用并且不能(轻易)放弃,否则您不应该使用它或 SHORT_IDS。如果这是您想要的时区,请使用 ZoneId.of("America/Chicago")

链接