Java 如何转换;2012年9月21日星期五15:23:59 CEST“;至;2012-09-21T15:23:59;在爪哇?

Java 如何转换;2012年9月21日星期五15:23:59 CEST“;至;2012-09-21T15:23:59;在爪哇?,java,datetime,Java,Datetime,我想用Java将日期字符串“Fri Sep 21 15:23:59 CEST 2012”转换为“2012-09-21T15:23:59”。 我使用SimpleDataFormat和以下代码尝试了这一点: try { String dateString = "Fri Sep 21 15:23:59 CEST 2012"; SimpleDateFormat input = new SimpleDateFormat("EEE MM dd HH:mm:ss z YYYY"); S

我想用Java将日期字符串“Fri Sep 21 15:23:59 CEST 2012”转换为“2012-09-21T15:23:59”。 我使用SimpleDataFormat和以下代码尝试了这一点:

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。我已在上阅读了文件,但找不到错误

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

使用

"EEE MMM dd HH:mm:ss z YYYY"
注意3
MMM
您可以使用:

SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
四点:

  • 如果可以的话,您会更喜欢使用Java8中引入的较新的日期和时间类(也可以向后移植到Java6和Java7),而不是旧的
    SimpleDataFormat
  • 您应该确保在日期字符串中提供的区域设置与星期几和月份的语言一致
  • 虽然不清楚,但我相信模式字符串中的
    MM
    表示两位数的月数;对于三个字母的月份缩写,您需要
    MMM
    。这可能就是导致ParseException的原因(尽管错误的区域设置也可能会导致)
  • 大写字母
    Y
    s表示周和年。这个bug很容易在很长一段时间内被忽略,因为一周一年和一个日历年通常只在临近新年的几天内有所不同。对于日历年,您必须使用小写字母
    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年,-1到公元前2年,等等。如果您确定年份是AD(当前纪元),则可以使用
yyyy

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

        ZonedDateTime date = ZonedDateTime.parse(dateString, input);
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
使用
ZonedDateTime
而不是
LocalDateTime
的优点是它保留了日期字符串中的时区信息。如果有任何机会,你会需要这个以后,去这个选项

日历年和基于周的年之间的差异在对的回答中进行了解释

如果无法使用或不想使用较新的类,则要与
simpleDataFormat
一起使用的正确模式字符串位于中。尽管如此,我仍然建议明确给出区域设置,例如:

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

输出格式可能不需要区域设置,因为它不包含文本/单词,只包含数字。

除非在应用程序中的任何地方都使用UTC,否则您可能需要重新考虑从日期中删除时区信息。这可能会导致您或您的用户感到困惑。大写字母
Y
也不正确(它给出周数所属的周年,即52周或53周年,而不是日历年,尽管它们经常重合)。使用小写字母
y