0

我从服务器收到这个标准日期时间:

2015 年 12 月 14 日星期一 13:25:00 CET

我使用此代码将其转换为日期:

DateFormat formatter;
//"Mon Dec 14 13:25:00 CET 2015
formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");

但这给了我错误:

java.text.ParseException:无法解析的日期:“Mon Dec 14 13:25:00 CET 2015”(偏移量 20)

4

1 回答 1

0

输入有英文的工作日和月份名称,因此可能是语言环境问题。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

旧的类(DateCalendarSimpleDateFormat很多问题设计问题,它们正在被新的 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_PauloEurope/Berlin)。避免使用 3 个字母的缩写(如CETor 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

于 2017-07-03T12:48:01.190 回答