我想在Java中将日期字符串“Fri Sep 21 15:23:59 CEST 2012”转换为“2012-09-21T15:23:59”。 我用SimpleDateFormat和以下代码尝试了这个:
try {
String dateString = "Fri Sep 21 15:23:59 CEST 2012";
SimpleDateFormat input = new SimpleDateFormat("EEE MM dd HH:mm:ss z YYYY");
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = input.parse(dateString);
System.out.println(output.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
但是输入解析给了我一个java.text.ParseException。我在http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html阅读了文档,但我无法找到错误。
哪个格式字符串解决了此字符串的输入解析?
答案 0 :(得分:8)
使用
"EEE MMM dd HH:mm:ss z YYYY"
注意 3 MMM
答案 1 :(得分:1)
四点:
SimpleDateFormat
。MM
是指两位数的月份数;对于三个月的缩写,您需要MMM
。这可能是你得到ParseException的原因(虽然错误的语言环境也可能会给你一个)。Y
是针对一周的。这个错误很容易被忽视,因为一周和日历年通常只有接近新年的几天。对于日历年,您必须使用小写y
s。以下是如何处理新的日期和时间类:
String dateString = "Fri Sep 21 15:23:59 CEST 2012";
DateTimeFormatter input = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss z uuuu",
Locale.ROOT);
try {
LocalDateTime date = LocalDateTime.parse(dateString, input);
System.out.println(date.toString());
} catch (DateTimeParseException dtpe) {
System.err.println(dtpe.getMessage());
}
打印:
2012-09-21T15:23:59
请填写适当的区域设置,而不是Locale.ROOT
。 uuuu
是签名年份:0对应于1 BC,-1到2 BC等。如果您确定年份是AD(当前时代),则可以使用yyyy
。
您会注意到所需的格式来自LocalDateTime.toString()
,不需要任何明确的格式化。不过有另一种选择:
ZonedDateTime date = ZonedDateTime.parse(dateString, input);
System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
使用ZonedDateTime
而不是LocalDateTime
的优点是它保留了日期字符串中的时区信息。如果您以后有需要,请选择此选项。
this question的答案解释了日历年和基于周的年份之间的差异。
如果您不能使用或不想使用较新的类,则SimpleDateFormat
使用的正确模式字符串位于Reimeus’ answer。我仍然建议明确地给出语言环境,例如:
SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",
Locale.UK);
输出格式可能不需要区域设置,因为它不包含文本/单词,只包含数字。
答案 2 :(得分:0)
您可以使用:
SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");