Java 12 小时格式的 SimpleDateFormat ParseException
Java SimpleDateFormat ParseException for 12 hr format
我在尝试将日期字符串解析为 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)
我已经做过很多次了,模式看起来是正确的。可能是我没有看到我在这里做错了什么
我用的是Java8,我在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”。
我在这里做错了什么。
-谢谢
我认为这是一个区域设置问题 - 在 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);
我在尝试将日期字符串解析为 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)
我已经做过很多次了,模式看起来是正确的。可能是我没有看到我在这里做错了什么 我用的是Java8,我在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”。
我在这里做错了什么。
-谢谢
我认为这是一个区域设置问题 - 在 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);