【问题标题】:Why Joda DateTimeFormatter cannot parse timezone names ('z')为什么 Joda DateTimeFormatter 无法解析时区名称('z')
【发布时间】:2011-05-28 18:00:05
【问题描述】:

来自DateTimeFormatter javadoc

区域名称:时区名称 ('z') 无法解析。

因此时区解析如下:

System.out.println(new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy").parse("Fri Nov 11 12:13:14 JST 2010"));

无法在 Joda 中完成:

DateTimeFormatter dtf = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss z yyyy");
System.out.println(dtf.parseDateTime("Fri Nov 11 12:13:14 JST 2010"));
//Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "Fri Nov 11 12:13:14 JST 2010" is malformed at "JST 2010"
//at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:673)

【问题讨论】:

  • 我只想说“F#$% JodaTime!”好吧,不是真的;它救了我好几次。但我真的希望他们更新他们的文档。我花了一个小时试图弄清楚为什么这不起作用。 DateTimeFormat 的 Javadoc 具有“z -- 时区文本 -- 太平洋标准时间;PST”。但是,稍后在同一页面上的几段,“区域名称:时区名称('z')无法解析。”走的路 JodaTime... 把它放在小字上。没什么大不了。我刚刚失去了 5 年的生命和大部分头发。 ;)
  • @TheAwnryBear - 并且......希望......学到了一些教训:1)时区缩写是邪恶的,2)您需要正确阅读 javadoc :-)。跨度>
  • 呵呵,斯蒂芬同意了。 :) 我倾向于吝啬,这在 95-99% 的时间里都有效……然后你会遇到像 Joda 文档这样的情况。 :P

标签: java jodatime


【解决方案1】:

我认为原因是“z”时区名称是传统的(非标准化的)且模棱两可的;即,根据您的原籍国,它们的含义不同。例如,“PST”可以是“太平洋标准时间”或“巴基斯坦标准时间”。

如果您有兴趣,this site 会列出大量时区名称。不难发现有歧义的情况。

【讨论】:

  • 顺便说一句,巴基斯坦标准时间是 PKT ;) timeanddate.com/library/abbreviations/timezones/asia/pkt.html
  • @Kaitsu - 根据我链接到的网站,PST 也是巴基斯坦标准时间。这就是问题所在 - 名称不是标准化的。 JodaTime 的设计者采取了明智的观点,即由于它们没有标准化,而且模棱两可,因此没有明智的方法来支持它们,使其在国际环境中发挥作用。
  • 它至少可以解析“UTC”和“GMT”之类的东西?因为这些很常见。
  • @chakrit - 非常常见!= 标准,如果您开始接受其中的一些,就会遇到模棱两可的问题。
  • 时区的表示标准是什么?
【解决方案2】:

可能是因为某些时区缩写不明确,解析器无法知道是哪个时区。

当然,它也可能是您在使用 Joda 一段时间后发现的微小、奇怪的刻度和缺失的功能之一。

【讨论】:

    【解决方案3】:

    缩写时区确实不明确,Joda 进一步取消了对它们的支持,如 DateTimeZone javadoc 中所述:

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2017-08-31
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多