我为这种解析感到疯狂。代码如下:try { String if_modified_since = "Sat Sep 23 23:08:37 CST 2017"; DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss zzz yyyy"); DateTime dt_if_modified_since = DateTime.parse(if_modified_since, dateTimeFormatter); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }错误消息是: java.lang.IllegalArgumentException:无效格式:“ CST 2017年9月23日星期六23:08:37”我试过了:dateTimeFormatter.withLocale(Locale.US);没用如何解决? 最佳答案 我正在使用Joda-Time 2.9.9,并且您的代码运行良好(“ CST”已解析为America/Chicago时区)。但这对于所有版本和时区都是not guaranteed to work all the time,甚至我得到的结果也有争议,因为芝加哥当前处于夏令时,所以应该是“ CDT”(甚至javadoc说到模式:无法解析时区名称('z')。这是因为短时区名称(例如“ CST”和“ EST”)为ambiguous and not standard。 “ CST”可以是Central Standard Time,Cuba Standard Time和China Standard Time。在某些API中,某些名称会映射到任意默认值,但不能保证所有名称都适用。即使我们仅考虑美国的CST,也有不止一个地区(超过一个时区)使用它。唯一明确的名称是IANA timezones names(始终采用z格式,例如Region/City或America/Chicago),并且您应该尽可能使用它们。考虑到您的输入(Europe/Berlin)和您发布问题的时间(以及当前美国中部地区处于夏令时这一事实,因此they're actually in "CDT"),我的猜测是此输入涉及中国(但我可能错误,因此您必须验证此输入在哪个时区生成。无论如何,如果您任意选择与“ CST”相对应的时区,则可以解析此Sat Sep 23 23:08:37 CST 2017,并使用String创建格式器。我还使用org.joda.time.format.DateTimeFormatterBuilder将语言设置为英语(以解析月份和星期几)。如果不指定语言环境,它将使用JVM默认值,并且不能保证始终使用英语:String if_modified_since = "Sat Sep 23 23:08:37 CST 2017";// map of my arbritrary choices for timezonesMap<String, DateTimeZone> preferredZones = new HashMap<String, DateTimeZone>();// CST maps to a Chinese timezonepreferredZones.put("CST", DateTimeZone.forID("Asia/Shanghai"));DateTimeFormatter fmt = new DateTimeFormatterBuilder() // date/time .appendPattern("EEE MMM dd HH:mm:ss ") // zone name - use my map of arbitrary choices .appendTimeZoneShortName(preferredZones) // year .appendPattern(" yyyy") // create formatter with English locale .toFormatter().withLocale(Locale.US);DateTime dt = DateTime.parse(if_modified_since, fmt);如我所说,我选择了java.util.Locale时区,但是您必须检查输入对应的正确时区是什么。您可以通过调用Asia/Shanghai获得所有可用区域的列表(并选择最适合您的区域)。Java新的日期/时间APIJoda-Time处于维护模式,并且已被新的API取代,因此,我不建议使用它来启动新项目。即使在joda's website中,它也说:“请注意,Joda-Time被认为是一个很大的“完成”项目。没有计划进行重大增强。如果使用Java SE 8,请迁移到java.time(JSR-310)。” 。如果您不能(或不想)从Joda-Time迁移到新的API,则可以忽略此部分。如果您使用的是Java 8,请考虑使用new java.time API。 less bugged and less error-prone than the old APIs更容易。如果您使用的是Java ThreeTen Backport,这是Java 8的新日期/时间类的很好的反向端口。对于Android,您还需要ThreeTenABP(有关如何使用here的更多信息)。下面的代码对两者都适用。唯一的区别是包名称(在Java 8中为DateTimeZone.getAvailableIDs(),在ThreeTen Backport(或Android的ThreeTenABP)中为java.time),但类和方法名称相同。该代码与Joda的代码非常相似,并且您还必须对时区做出任意选择(由于“ CST”含糊不清)。首先,我创建一个格式化程序,然后将输入解析为org.threeten.bp(表示时区中的日期和时间的类):String if_modified_since = "Sat Sep 23 23:08:37 CST 2017";// set of preferred zonesSet<ZoneId> preferredZones = new HashSet<ZoneId>();// my arbitrary choice for CSTpreferredZones.add(ZoneId.of("Asia/Shanghai"));DateTimeFormatter fmt = new DateTimeFormatterBuilder() // date/time .appendPattern("EEE MMM dd HH:mm:ss ") // zone name - use my arbitrary choices .appendZoneText(TextStyle.SHORT, preferredZones) // year .appendPattern(" yyyy") // create formatter with English locale .toFormatter(Locale.US);ZonedDateTime z = ZonedDateTime.parse(if_modified_since, fmt);请注意,我不需要说“ CST是亚洲/上海”。 API查找短名称(CST),并使用ZonedDateTime作为参考(因此选择了Set),它在所有使用该短名称的区域中决定使用哪个区域。 10-07 22:11