【问题标题】:Java SimpleDateFormat ParseException for 12 hr format [duplicate]12小时格式的Java SimpleDateFormat ParseException [重复]
【发布时间】: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。 直到今天这段代码运行良好。

但是,如果我将日期字符串更改为 a.m. => "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”而不是“a.m./p.m”。 我在这里做错了什么。 -谢谢

【问题讨论】:

  • 您的代码在 Oracle JDK 15.0.1 下为我成功运行。 SimpleDateFormat 的 Javadoc 也不在 'am' 和 'pm' 中显示点。也就是说:我不知道!您使用的是哪个 JDK/JVM(即 Oracle、OpenJDK、IBM J9 ......)?而且,你的语言环境是什么?我是 en_US。
  • 我使用oracle jdk
  • 我怀疑是语言环境问题。如果您明确指定美国语言环境,它是否有效? SimpleDateFormat sdformat = new SimpleDateFormat(format, Locale.US);
  • 如果我使用 Locale 则 SimpleDateFormat 有效,但 LocalDateTime 无效
  • 仅供参考,DateSimpleDateFormat 都是糟糕的日期时间类,多年前已被 JSR 310 中定义的现代 java.time 类取代。跨度>

标签: java date parsing simpledateformat


【解决方案1】:

我认为这是一个语言环境问题 - 在 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);

【讨论】:

  • 你是绝对正确的。我的本地环境不会引发错误。仅加拿大网络服务器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多