输入有英文的工作日和月份名称,因此可能是语言环境问题。SimpleDateFormat
如果您未指定,则使用系统的默认语言环境 - 检查java.util.Locale.getDefault()
系统中的值,可能不是en
(英语)。
如果你设置了语言环境,事情应该会起作用:
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
formatter.parse("Mon Dec 14 13:25:00 CET 2015"));
新的 Java 日期/时间 API
旧的类(Date
和Calendar
)SimpleDateFormat
有很多问题和设计问题,它们正在被新的 API 取代。
如果您使用的是Java 8,请考虑使用新的 java.time API。与旧的 API 相比,它更容易、错误更少且不易出错。
如果您使用的是Java <= 7,则可以使用ThreeTen Backport,这是 Java 8 的新日期/时间类的一个很好的向后端口。对于Android,还有ThreeTenABP(更多关于如何使用它的信息)。
下面的代码适用于两者。唯一的区别是包名(在 Java 8 中是java.time
,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是org.threeten.bp
),但类和方法名是相同的。
一个很大的区别是新 API 使用IANA 时区名称(始终采用格式Continent/City
,例如America/Sao_Paulo
或Europe/Berlin
)。避免使用 3 个字母的缩写(如CET
or PST
),因为它们模棱两可且不标准。
您可以通过调用获取可用时区列表(并选择最适合您系统的时区)ZoneId.getAvailableZoneIds()
。在您的情况下,CET
是“中欧时间”的快捷方式,但有 30 多个不同的地区(或时区)使用CET
缩写:
欧洲/卢布尔雅那,欧洲/罗马,大西洋/Jan_Mayen,欧洲/柏林,非洲/休达,非洲/阿尔及尔,欧洲/苏黎世,欧洲/奥斯陆,欧洲/阿姆斯特丹,波兰,欧洲/斯德哥尔摩,欧洲/梵蒂冈,欧洲/布达佩斯,欧洲/直布罗陀, 欧洲/布拉迪斯拉发, 欧洲/圣马力诺, 欧洲/马德里, 欧洲/萨格勒布, 欧洲/哥本哈根, 欧洲/马耳他, 欧洲/布鲁塞尔, 欧洲/维也纳, 欧洲/布辛根, 欧洲/瓦杜兹, 欧洲/华沙, 欧洲/布拉格,欧洲/斯科普里,欧洲/波德戈里察,欧洲/巴黎,非洲/突尼斯,欧洲/萨拉热窝,欧洲/地拉尼,欧洲/卢森堡,欧洲/安道尔,欧洲/贝尔格莱德,北极/朗伊尔城,欧洲/摩纳哥
我为此测试选择了一个,但可以自由选择最适合您系统的一个。
// create formatter (this is thread-safe, while SimpleDateFormat isn't)
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// pattern for date/time
.appendPattern("EEE MMM dd HH:mm:ss ")
// timezone (use Europe/Berlin as prefered value for CET)
.appendZoneText(TextStyle.SHORT, Collections.singleton(ZoneId.of("Europe/Berlin")))
// year
.appendPattern(" yyyy")
// use English locale to parse weekday and month name
.toFormatter(Locale.ENGLISH);
// ZonedDateTime is a date and time with a timezone
ZonedDateTime z = ZonedDateTime.parse("Mon Dec 14 13:25:00 CET 2015", fmt);
System.out.println(z); // 2015-12-14T13:25+01:00[Europe/Berlin]
输出将是:
2015-12-14T13:25+01:00[欧洲/柏林]
如果您想要自定义格式,也可以使用格式化程序:
System.out.println(z.format(fmt)); // Mon Dec 14 13:25:00 CET 2015
输出将是:
2015 年 12 月 14 日星期一 13:25:00 CET