Warm tip: This article is reproduced from serverfault.com, please click

date-Java SimpleDateFormat ParseException为12小时格式

(date - Java SimpleDateFormat ParseException for 12 hr format)

发布于 2020-11-29 01:23:12

尝试将日期字符串解析为java.util.Date时出现异常。

这是我在做什么

String format = "yyyy-MM-dd hh:mm a";
String strDateTime = "2016-03-04 11:30 am";

SimpleDateFormat sdformat = new SimpleDateFormat(format);
        try {
            Date date = sdformat.parse(strDateTime);
            System.out.println(sdformat.format(date));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

并得到了这个

java.text.ParseException: Unparseable date: "2016-03-04 11:30 am"
    at java.base/java.text.DateFormat.parse(DateFormat.java:396)
    at testing.MainClass.main(MainClass.java:18)

我已经做了很多次了,而且模式看起来也很正确。可能是我没有看到我在这里做错了什么,我正在使用Java 8,而我在eclipse中的执行环境也是8。直到今天,这段代码仍能正常工作。

但是,如果我将日期字符串更改为am =>, "2016-03-04 11:30 a.m."
它将成功解析输出: 2016-03-04 11:30 a.m.

此行为与LocalDateTime相同。

java.time.format.DateTimeParseException: Text '2016-03-04 11:30 am' could not be parsed at index 17
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2050)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:493)
    at testing.MainClass.main(MainClass.java:27)

SimpleDateFormat我在互联网上看到的所有示例仅使用“ am / pm”,而不是“ am / pm”。在这里我可能做错了什么。-谢谢

Questioner
jaimin kansara
Viewed
0
Aron 2020-11-29 09:49:42

我认为这是一个语言环境问题-在en_US语言环境中,你的代码可以成功运行。你可以使用类似以下的循环来打印出与每个语言环境关联的AM / PM标记文本:

for (Locale locale : SimpleDateFormat.getAvailableLocales()) {
    SimpleDateFormat sdformat = new SimpleDateFormat(format, locale);
    String[] amPmStrings = sdformat.getDateFormatSymbols().getAmPmStrings();
    System.out.println("Locale " + locale + ": " + amPmStrings[0] + ", " + amPmStrings[1]);
}

这表明,例如,en_CA语言环境使用你描述的格式:

Locale en_CA: a.m., p.m.

如果要使用“ am”和“ pm”(或“ AM”和“ PM”,它似乎不区分大小写),则可以en_US在创建格式化程序时强制使用语言环境:

SimpleDateFormat sdformat = new SimpleDateFormat(format, Locale.US);