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. 而不是 AM 和 PM 与您输入的一样。
如果您想接受不带点的大写 AM
和 PM
— 好吧,加拿大英语不会那样做(至少在您和我试过了)。因此使用例如 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.
我目前正在使用以下代码解析日期
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. 而不是 AM 和 PM 与您输入的一样。
如果您想接受不带点的大写 AM
和 PM
— 好吧,加拿大英语不会那样做(至少在您和我试过了)。因此使用例如 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.