Simpledateformat错误 - 无法解析的日期2015年12月14日13:25:00 CET 2015

时间:2016-04-20 07:26:14

标签: java simpledateformat date-parsing parseexception unparseable

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

  

2015年12月14日13:25:00 CET 2015

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

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

但它给了我错误:

  

java.text.ParseException:Unparseable date:" Mon Dec 14 13:25:00 CET 2015" (抵消20)

1 个答案:

答案 0 :(得分: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)有lots of problemsdesign issues,它们将被新API取代。< / p>

如果您使用的是 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs

如果您使用的是 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,有ThreeTenABP(更多关于如何使用它here)。

以下代码适用于两者。 唯一的区别是包名称(在Java 8中为java.time,在ThreeTen Backport(或Android的ThreeTenABP)中为org.threeten.bp),但类和方法名称是相同的

一个很大的区别是新API使用IANA timezones names(始终采用Continent/City格式,如America/Sao_PauloEurope/Berlin。 避免使用3个字母的缩写(例如CETPST),因为它们是ambiguous and not standard

您可以致电ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区)。在您的情况下,CET是“中欧时间”的快捷方式,但有超过30个不同的区域(或时区)使用CET缩写:

  

Europe / Ljubljana,Europe / Rome,Atlantic / Jan_Mayen,Europe / Berlin,Africa / Ceuta,Africa / Algiers,Europe / Zurich,Europe / Oslo,Europe / Amsterdam,Poland,Europe / Stockholm,Europe / Vatican,Europe /布达佩斯,欧洲/直布罗陀,欧洲/布拉迪斯拉发,欧洲/ San_Marino,欧洲/马德里,欧洲/萨格勒布,欧洲/哥本哈根,欧洲/马耳他,欧洲/布鲁塞尔,欧洲/维也纳,欧洲/布林根,欧洲/瓦杜兹,欧洲/华沙,欧洲/布拉格,欧洲/斯科普里,欧洲/波德戈里察,欧洲/巴黎,非洲/突尼斯,欧洲/萨拉热窝,欧洲/地拉那,欧洲/卢森堡,欧洲/安道尔,欧洲/贝尔格莱德,北极/朗伊尔城,欧洲/摩纳哥

我选择了一个用于此测试,但可以自由选择最适合您系统的测试。

// 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 2015