gpt4 book ai didi

java - IST 映射到 java.time 库中的错误 ZoneId

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:47 26 4
gpt4 key购买 nike

我正在尝试从格式为 (yyyy-MM-dd HH:mm z) 的字符串中解析 ZonedDateTime。输入字符串 (2019-08-29 00:00 IST) 生成 UTC 时间戳。

调试使我到达了 IST 的 ZoneId 被映射到的地步大西洋/雷克雅未克没有意义。它应该被映射为亚洲。

timestamp = ZonedDateTime.parse(timeInput, DATE_WITH_TIMEZONE_FORMATTER)
.toInstant().toEpochMilli()

在哪里

DateTimeFormatter DATE_WITH_TIMEZONE_FORMATTER = DateTimeFormatter
.ofPattern(DATE_TIME_WITH_TIMEZONE_PATTERN).withChronology(IsoChronology.INSTANCE);

我是不是漏掉了什么?

最佳答案

首先,如果有任何方法可以避免,请不要依赖三个字母的时区缩写。它们是模棱两可的,可能更常见。当你说 IST 应该映射到亚洲时,它仍然让 Asia/Tel_Aviv 和 Asia/Kolkata 之间的选择开放(加上这两个的别名,Asia/Jerusalem 和 Asia/Calcutta)。在世界其他地方,IST 可能意味着爱尔兰夏令时,显然也意味着冰岛标准时间(或类似的东西;它当然有意义)。这不是我第一次看到 IST 被识别为大西洋/雷克雅未克。

如果您无法避免必须解析 IST,请通过 DateTimeFormatterBuilder 的双参数 appendZoneText 方法来控制解释。它接受一组首选区域:

DateTimeFormatter DATE_WITH_TIMEZONE_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm ")
.appendZoneText(TextStyle.SHORT, Collections.singleton(ZoneId.of("Asia/Kolkata")))
.toFormatter(Locale.ENGLISH);

在我放置 Asia/Kolkata 的位置替换您的首选区域。其余的应该不会造成麻烦:

    String timeInput = "2019-08-29 00:00 IST";
ZonedDateTime zdt = ZonedDateTime.parse(timeInput, DATE_WITH_TIMEZONE_FORMATTER);
System.out.println("Parsed ZonedDateTime: "+ zdt);
long timestamp = zdt
.toInstant().toEpochMilli();
System.out.println("timestamp: " + timestamp);

输出:

Parsed ZonedDateTime: 2019-08-29T00:00+05:30[Asia/Kolkata]
timestamp: 1567017000000

链接: Time Zone Abbreviations – Worldwide List (您会注意到 IST 在列表中出现了 3 次,而且许多其他缩写词也含糊不清)。

关于java - IST 映射到 java.time 库中的错误 ZoneId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57733849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com