CANADA country/locale 和 MM/dd/yyyy hh:mm 日期解析问题

Date parse issue with CANADA country/locale and MM/dd/yyyy hh:mm a date

我目前正在使用以下代码解析日期

   Date outDate = null;
   SimpleDateFormat formatter = null;
   formatter = new SimpleDateFormat(dateFormat,locale);
   outDate = formatter.parse(dt);

我知道它解析日期的旧方法。我面临的问题是,一旦我使用 CANADA country/locale,上面的代码就不起作用了。 以下是日期和格式 -

date - 02/05/2021 01:17 PM format - MM/dd/yyyy hh:mm a locale - en_CA

该代码适用于所有格式和国家,但只有在我使用加拿大区域设置和格式 (MM/dd/yyyy hh:mm a) 后,我才没有得到输出日期。

语言环境 new Locale("en","CA") 的正确格式是:

"02/05/2021 01:17 p.m."

只需将输入日期中的 PM 更改为 p.m.(您的情况是 dt)。 另一种解决方案可能是更改 dateFormat,或从 SimpleDateFormat.

中删除语言环境

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,为您的日期和时间工作。事实证明,加拿大英语使用 a.m.p.m. 而不是 AMPM 与您输入的一样。

如果您想接受不带点的大写 AMPM — 好吧,加拿大英语不会那样做(至少在您和我试过了)。因此使用例如 Locale.ENGLISH。像这样定义格式化程序:

private static final DateTimeFormatter FORMATTER
        = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.ENGLISH);

现在解析是一行:

    String dt = "02/05/2021 01:17 PM";
    LocalDateTime dateTime = LocalDateTime.parse(dt, FORMATTER);
    System.out.println(dateTime);

输出为:

2021-02-05T13:17

如果您想使用加拿大英语语言环境,则必须使您的输入字符串适合它。让我们首先将格式化程序修改为所需的语言环境:

private static final DateTimeFormatter FORMATTER
        = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.CANADA);

要了解语言环境如何期望写入日期,让我们首先使用格式化程序格式化一些日期和时间:

    System.out.println(LocalDateTime.now(
            ZoneId.systemDefault()).format(FORMATTER));

06/08/2021 08:28 p.m.

啊——所以 p.m.(我打赌 a.m. 也是)用小写字母和点。我们可以做到:

    String dt = "02/05/2021 01:17 p.m.";

现在它解析得很好:

2021-02-05T13:17

警告:加拿大语言环境中用于 AM 和 PM 的字符串可能因 Java 版本而异,我没有检查过。

Link

Oracle tutorial: Date Time 解释如何使用 java.time.