如何将Java中的“Fri Sep 21 15:23:59 CEST 2012”转换为“2012-09-21T15:23:59”?

时间:2012-09-21 14:40:28

标签: java datetime

我想在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阅读了文档,但我无法找到错误。

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

3 个答案:

答案 0 :(得分:8)

使用

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

注意 3 MMM

答案 1 :(得分:1)

四点:

  • 如果可以的话,您更愿意使用Java 8中引入的较新的日期和时间类(并且还向后移植到Java 6和7)而不是旧的SimpleDateFormat
  • 您应确保提供的语言区域与星期几和日期字符串中的月份一致。
  • 虽然从the documentation不清楚,但我认为模式字符串中的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.ROOTuuuu是签名年份: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");