加拿大国家/地区和年月日hh:MM日期的日期分析问题



我目前正在用下面的代码解析日期

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

我知道它解析日期的老方法。我面临的问题是,一旦我使用加拿大国家/地区,上述代码就无法工作。以下是日期和格式-

日期-2021年5月2日下午01:17格式-MM/dd/yyyy hh:MM区域设置-en_CA

该代码适用于所有格式和国家/地区,但只有当我使用加拿大语言环境和格式(MM/dd/yyyy hh:MM a(时,我才能获得输出日期。

java.time

我建议您使用现代java日期和时间API java.time来进行日期和时间工作。此外,事实证明,加拿大英语在输入中使用a.mp.mAM,而不是PM

如果你想接受不带点的大写AMPM,那么加拿大英语不能做到这一点(至少在你和我尝试过的Java版本中没有(。因此,例如使用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.

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

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

现在它解析得很好:

2021-02-05T13:17

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

链接

Oracle教程:日期时间解释如何使用java.Time.

区域设置new Locale("en","CA")的正确格式是:

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

只需将输入日期中的PM更改为p.m.(在您的情况下为dt(。另一种解决方案可以是更改dateFormat,或者从SimpleDateFormat中删除区域设置。

相关内容

  • 没有找到相关文章

最新更新