Joda DateTimeFormat 时区列表

Joda DateTimeFormat list of timezones

我刚刚发现 CET 不是 Joda 时间的有效时区:

DateTimeFormatter DATE_TIME_FORMATTER  = 
    DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss.SSS z");

DateTime.parse("25/11/2016 11:50:00.000 CET", DATE_TIME_FORMATTER)`     
  -> java.lang.IllegalArgumentException: Invalid format: "25/11/2016 11:50:00.000 CET" is malformed at "CET"`

DateTime.parse("25/11/2016 11:50:00.000 PST", DATE_TIME_FORMATTER)`     
  -> OK

官方时区列表是什么? CET 是 java.util.Calendar 的有效值,但在 Joda 中显然不是。 documentation 不多说了。

您引用的文档还说:

Zone names: Time zone names ('z') cannot be parsed.

否则,如果您使用 DateTimeFormatterBuilder,那么您可以使用它的方法 appendTimeZoneName(Map<String,DateTimeZone>) with specifying a lookup-map. By default, this lookup-map is given by the helper method DateTimeUtils.getDefaultTimeZoneNames(),它只会产生一些位于美国的时区的英文名称:

•UT - UTC 
•UTC - UTC 
•GMT - UTC 
•EST - America/New_York 
•EDT - America/New_York 
•CST - America/Chicago 
•CDT - America/Chicago 
•MST - America/Denver 
•MDT - America/Denver 
•PST - America/Los_Angeles 
•PDT - America/Los_Angeles 

解决方案: 定义包含字符串 "CET" 的自己的查找映射,或使用更好的时区名称解析库(例如:Java-8 又名 java.time-package 做得更好)。