我从服务器收到此标准日期时间:
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)
答案 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"));
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design 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_Paulo
或Europe/Berlin
。
避免使用3个字母的缩写(例如CET
或PST
),因为它们是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