- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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 的时区偏移量和/或大陆/城市形式的时区名称。我承认这并不总是可能的。
给定你的输入字符串,因为 SimpleDateFormat
和 TimeZone
已经过时,现代 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/
我正在使用 Java 8, 在我们的代码的前面,我们使用 sdf.setTimeZone(TimeZone.getTimeZone("PDT")); 转换为失败的美国太平洋地区(没有抛出任何错误,但转
TimeZone.getTimeZone("US/Mountain") 和 TimeZone.getTimeZone("MST") 返回不同的结果。这个java类中的MST不代表“山区标准时间”吗?
我有以下指令: TimeZone zone = TimeZone.getTimeZone("Asia/Toyo"); 显然,它应该返回 null,但它会返回默认的时区,这不是我的情况所需的行为。来自
对于下面的代码,我得到了不同的输出 TimeZone t = TimeZone.getTimeZone("GMT-8"); // Also tried UTC-8 and GMT-8:00 //Ti
setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); echo $dt->getTimezone()->getName().'';
我正在不同时区测试我的应用程序。我手动将物理手机的时区更改为英国伦敦,即 GMT+00:00 但是,当我使用 myCalendar.getTimeZone().getDisplayName(true,
当我在 ideone 上运行此代码时: https://ideone.com/sm2SHC我在标准输出中收到 10800000,当我在本地运行它时,我可以看到 7200000。 产生此输出的代码是:
为什么不TimeZone.getTimeZone()如果给定无效时区 ID,方法会抛出错误?相反,它返回“如果无法理解给定的 ID,则返回 GMT 区域”。这个决定背后的理由是什么? 最佳答案 我不确
它返回 GMT 的默认时区。 使用带有“z”作为时区的 SimpleTimeFormat,打印“PDT”。但是“PDT”不在从 TimeZone.getAvailableIDs() 返回的列表中。真奇
本文整理了Java中org.apache.xmlrpc.XmlRpcConfig.getTimeZone()方法的一些代码示例,展示了XmlRpcConfig.getTimeZone()的具体用法。这
我正在将时间从 CST 转换为本地时间,但 getTimeZone 似乎无法正常工作。 String cstTime = "2013-06-21 14:00:00"; SimpleDa
如果函数的输入是“”(空字符串),但我正在获取 GMT 时区,则需要 TimeZone.getTimeZone() 的无/假输出。请帮忙解决这个问题? 最佳答案 如果我理解你的问题,当时区String
在 Java 中是否有任何替代 TimeZone.getTimeZone() 的方法,因为 getTimeZone() 是同步的,导致我的程序/应用程序缩小。 public static synchr
java.util.TimeZone.getTimeZone(id)是一种根据 id 获取时区的方法。当我使用这个类时,我用反编译器打开它并注意到它是同步的。由于它是 static,这意味着没有两个线
本文整理了Java中org.eclipse.persistence.internal.oxm.XMLConversionManager.getTimeZone()方法的一些代码示例,展示了XMLCon
对于时区 API - https://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html#getTimeZone(java.lang.S
将我的运行时升级到 Java 7 后,我发现速度非常慢......而且我的程序将所有时间都花在 SimpleDateFormat 构造函数中。如此处的一篇精彩帖子所述:http://coffeedri
我想获取洛杉矶的时区信息,现在10/10/2017是夏令时,但是我通过两种方式获取洛杉矶的时区得到了不同的结果。 public class TimeZoneDemo2 { public stati
我真的对使用 Calendar.getInstance(TimeZone.getTimeZone("UTC")) 方法调用得到的结果感到困惑,它正在返回 IST 时间。 这是我使用的代码 Calend
SimpleDateFormat 的 getTimeZone().getID() 方法返回 Asia/Jerusalem 而不是 Asia/Kolkata 格式为 EEE MMM dd HH:mm:s
我是一名优秀的程序员,十分优秀!