java.text.ParseException:不可解析的日期:";下午1时19分;
我只是试着解析一个简单的时间!这是我的密码:java.text.ParseException:不可解析的日期:";下午1时19分;,java,simpledateformat,Java,Simpledateformat,我只是试着解析一个简单的时间!这是我的密码: String s = "01:19 PM"; Date time = null; DateFormat parseFormat = new SimpleDateFormat("hh:mm aa"); try { time = parseFormat.parse(s); } catch (ParseException e) { //
String s = "01:19 PM";
Date time = null;
DateFormat parseFormat = new SimpleDateFormat("hh:mm aa");
try {
time = parseFormat.parse(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我得到一个例外:
java.text.ParseException: Unparseable date: "01:19 PM"
at java.text.DateFormat.parse(Unknown Source)
我认为应该是
“h:mm a”
而不是“hh:mm a”
根据规则,您应该使用以下格式字符串:“h:mm a”
但是,您的格式字符串也是正确的,因为我在执行代码时没有遇到错误。请尝试以下格式:“K:ma”
还要检查文档:另外,请检查您的区域设置,您的问题似乎是特定于区域设置的。此方法有效:
public static void main(String[] args) throws Exception {
String s = "01:19 PM";
Date time = null;
DateFormat parseFormat = new SimpleDateFormat("hh:mm a", Locale.ENGLISH);
System.out.println(time = parseFormat.parse(s));
}
输出:
Thu Jan 01 13:19:00 KST 1970
模式字母
a
是Am/pm标记,但它是特定于区域设置的。显然,AM
和PM
在英语语言环境中有效,但在匈牙利语言环境中无效
您将获得ParseException
,因为您设置了非英语语言环境,并且在您的语言环境中PM
无效
// This is OK, English locale, "PM" is valid in English
Locale.setDefault(Locale.forLanguageTag("en"));
new SimpleDateFormat("hh:mm aa").parse("01:19 PM");
// This will throw Exception, Hungarian locale, "PM" is invalid in Hungarian
Locale.setDefault(Locale.forLanguageTag("hu"));
new SimpleDateFormat("hh:mm aa").parse("01:19 PM");
要解决此问题,可以在构造函数中指定区域设置
:
// No matter what is the default locale, this will work:
new SimpleDateFormat("hh:mm aa", Locale.US).parse("01:19 PM");
LocalTime
现代答案使用类
这将问题01:19 PM
的字符串转换为LocalTime
等于13:19
我们仍然需要提供区域设置。由于AM/PM标记在英语以外的其他语言环境中几乎不被使用,我认为Locale.English
是一个相当安全的赌注。请用你自己的代替
2014年,当这个问题被提出时,旧类Date
和SimpleDateFormat
的现代替代品,即现代Java日期和时间API已经问世。今天,我认为旧班早已过时,热情地推荐使用现代的。一般来说,它们对程序员更友好,使用起来也更方便
仅举一件简单的小事,如果我们无法在一个默认区域设置不识别AM和PM的系统上提供区域设置,现代格式化程序将为我们提供一个异常,消息文本“01:19 PM”无法在索引6处解析。索引6显示的是PM
,所以我们已经在路上了。是的,我知道有一种方法可以从过时类抛出的异常中获取索引,但是大多数程序员从未意识到,因此没有使用它
更重要的是,新的API提供了一个类LocalTime
,它为我们提供了我们想要的和需要的东西:只是一天中没有日期的时间。这使我们能够更精确地建模数据。关于堆栈溢出,有许多问题是由混淆引起的,而混淆又是由以下事实引起的:日期
必然包括日期和时间,而有时您只需要其中一个。我得到了同样的例外!感谢您的回复您使用的是什么版本的Java?您的代码在Java8中工作。JDK7在这里也不例外!!!只是为了确认提问者:我还使用Java 1.7.0_55得到了异常。您的语言环境是什么?是的,我的语言环境是希腊语!K
和h
都是有效的,只是K
在0..11
范围内,h
在1..12
范围内。同样的例外情况!:(可能您的区域设置有问题?我已将该字段添加到SDF构造函数中。是的,这是一个特定于区域设置的问题,请参阅我的答案。此答案现在已过时,使用的是现在遗留的、由java.time类取代的麻烦的旧类。请参阅中的现代解决方案。)。
LocalTime time = null;
DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
try {
time = LocalTime.parse(s, parseFormatter);
} catch (DateTimeParseException dtpe) {
System.out.println(dtpe.getMessage());
}