java.text.ParseException:Unparseable date:" 01:19 PM"

时间:2014-08-27 10:06:21

标签: 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) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我得到了这个例外:

java.text.ParseException: Unparseable date: "01:19 PM"
    at java.text.DateFormat.parse(Unknown Source)

6 个答案:

答案 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标记,但特定于区域设置。显然,AMPM在英语区域设置中有效,但例如在匈牙利语区域设置中无效。

您获得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.ENGLISHDate的现代替代品已经淘汰,现代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
另外,检查您的语言环境,您的问题似乎是特定于语言环境。