我只想解析一个简单的时间!这是我的代码:
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)
答案 0 :(得分:5)
这有效:
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));
}
OUPUTS:
Thu Jan 01 13:19:00 KST 1970
答案 1 :(得分:5)
模式字母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");
要解决此问题,可以在构造函数中指定Locale
:
// No matter what is the default locale, this will work:
new SimpleDateFormat("hh:mm aa", Locale.US).parse("01:19 PM");
答案 2 :(得分:2)
LocalTime
使用LocalTime
类的现代答案。
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());
}
这会将问题01:19 PM
中的字符串转换为等于LocalTime
的{{1}}。
我们仍然需要提供语言环境。由于在英语以外的其他语言环境中,AM / PM标记很难用于实践,我认为13:19
是一个相当安全的选择。请替换你自己的。
在2014年提出这个问题时,旧类Locale.ENGLISH
和Date
的现代替代品已经淘汰,现代Java日期和时间API。今天我认为旧课程已经过时,并热烈推荐使用现代课程。他们通常表现出更加友好的程序员和方便的工作。
仅仅为了一个简单的小事,如果我们未能在具有无法识别AM和PM的默认语言环境的系统上提供语言环境,现代格式化程序将使用消息SimpleDateFormat
向我们提供异常。索引6是Text '01:19 PM' could not be parsed at index 6
所在的位置,所以我们已经开始了。是的,我知道 是一种从过时类抛出的异常中获取索引的方法,但大多数程序员从未意识到这一点,因此没有使用它。
更重要的是,新API提供了一个类PM
,它可以为我们提供我们想要和需要的内容:只是没有日期的时间。这使我们能够更精确地建模数据。由于LocalTime
必然包括日期和时间(有时您只想要一个或另一个)这一事实导致混淆导致Stack Overflow上存在许多问题。
答案 3 :(得分:1)
我认为应该是"hh:mm aa"
而不是"h:mm a"
答案 4 :(得分:0)
根据official documentation,您应该使用以下格式字符串:"h:mm a"
但是你的格式字符串也是正确的,因为我在执行你的代码时没有错误。
答案 5 :(得分:0)
请尝试以下格式:"K:m a"
检查文档:SimpleDateFormat
另外,检查您的语言环境,您的问题似乎是特定于语言环境。