gpt4 book ai didi

Java SimpleDateFormat.getTimeZone().getID() 返回 Asia/Jerusalem 而不是 Asia/Kolkata

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:16 27 4
gpt4 key购买 nike

SimpleDateFormat 的 getTimeZone().getID() 方法返回 Asia/Jerusalem 而不是 Asia/Kolkata 格式为 EEE MMM dd HH:mm:ss z yyyy .实际上,在我的开发机器中,它按预期返回 Asia/Kolkata。但在其他一些机器(生产环境)中,它返回 Asia/Jerusalem 而不是 Asia/Kolkata。知道是什么原因造成的以及如何解决它。源代码如下:

String input = "Mon Jun 12 13:29:47 IST 2017";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
sdf.parse(input);
TimeZone timeZone = sdf.getTimeZone();
System.out.println(timeZone.getID());

最佳答案

Any idea what causes this…

这是一个众所周知的三字母和四字母时区缩写问题。 IST 的第三种解释是爱尔兰标准时间(欧洲/都柏林)。我不知道是什么导致一个 JVM 更喜欢一种解释而不是另一种解释。至少在一种情况下,我看到它比其他解释更喜欢其默认时区设置。所以如果你的开发机器有亚洲/加尔各答时区设置而你的生产机器没有,这可能是解释。但是,我不会将此作为确定的事实,而且我希望编写足够健壮的代码以在具有不同时区设置的计算机和 JVM 上运行。

…and how to resolve it.

理想的解决方案:避免获取包含三个或四个字母时区缩写的日期时间字符串。首选与 UTC 的时区偏移量和/或大陆/城市形式的时区名称。我承认这并不总是可能的。

给定你的输入字符串,因为 SimpleDateFormatTimeZone 已经过时,现代 Java 日期和时间 API 对程序员更友好,你也用标记了你的问题ZonedDateTime 类是现代 API 的一部分,让我们先采用现代解决方案:

    DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss ")
.appendZoneText(TextStyle.SHORT, Collections.singleton(ZoneId.of("Asia/Kolkata")))
.appendPattern(" uuuu")
.toFormatter(Locale.ROOT);
ZonedDateTime dateTime = ZonedDateTime.parse(input, dtf);
System.out.println(dateTime.getZone());

它打印:

Asia/Kolkata

我传递给 appendZoneText() 的第二个参数是一组首选时区。在 the documentation它说“如果被解析的纹理区域名称不唯一,将使用匹配的首选区域 ID。”这就是我们在这里所追求的。

在我的计算机上,我还能够使用过时的类解决您的代码中的问题。我在解析之前插入了以下行。

    sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));

但是,旧类的文档比较模糊,所以我不太确定这个解决方案是否总是有效。

顺便说一句,无论您使用旧类还是现代类,我都建议您始终为解析提供明确的语言环境。 “Mon”和“Jun”是英文的,因此除非您指定语言环境,否则解析将无法在具有非英语语言环境设置的计算机上运行。让我猜猜,您的日期字符串不是英语,因为它来自英语语言环境,而只是因为英语是计算中的通用语言。如果是这样,我认为 Locale.ROOT 是合适的。我已经在我的代码中使用它了。要在您的中使用它,请将其作为参数添加到构造函数中:

    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ROOT);

Locale.ENGLISH 适用于其他英语语言环境。

关于Java SimpleDateFormat.getTimeZone().getID() 返回 Asia/Jerusalem 而不是 Asia/Kolkata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44796563/

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