3

我想在 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上的文档,但我找不到错误。

哪个格式字符串解决了这个字符串的输入解析?

4

3 回答 3

8

利用

"EEE MMM dd HH:mm:ss z YYYY"

3MMM

于 2012-09-21T14:41:42.627 回答
1

四点:

  • 如果可以,您将更喜欢使用 Java 8 中引入的较新的日期和时间类(也向后移植到 Java 6 和 7)而不是旧的SimpleDateFormat.
  • 您应该确保您提供的语言环境与日期字符串中的星期几和月份的语言一致。
  • 虽然从文档中不清楚,但我相信MM模式字符串中的意思是两位数的月份数;对于您需要的三个字母的月份缩写MMM。这可能就是让你得到 ParseException 的原因(尽管错误的语言环境也可能给你一个)。
  • 大写Y字母代表周年。这个错误很容易被忽视,因为一周年和日历年通常只有接近新年的几天不同。对于日历年,您必须使用小写字母ys。

以下是如何使用新的日期和时间类:

    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,等等。yyyy如果您确定年份是 AD(当前时代),则可以使用。

您会注意到您想要的格式直接来自LocalDateTime.toString(),不需要任何明确的格式。不过,还有另一种选择:

        ZonedDateTime date = ZonedDateTime.parse(dateString, input);
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

使用ZonedDateTime而不是它的优点LocalDateTime是它保留了日期字符串中的时区信息。如果您以后有任何机会需要它,请选择此选项。

此问题的答案中解释了日历年和基于周的年之间的区别。

如果您不能使用或不想使用较新的类,则要使用的正确模式字符串SimpleDateFormatReimeus 的答案中。不过,我仍然建议明确给出语言环境,例如:

        SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",
                Locale.UK);

输出格式可能不需要语言环境,因为它不包含文本/单词,仅包含数字。

于 2017-04-19T23:16:38.123 回答
0

您可以使用:

SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
于 2012-09-21T14:45:04.150 回答