【问题标题】:java.text.ParseException: Unparseable date: "01:19 PM"java.text.ParseException:无法解析的日期:“01:19 PM”
【发布时间】:2014-08-27 10:06:21
【问题描述】:

我只是尝试解析一个简单的时间!这是我的代码:

   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)

【问题讨论】:

  • 您使用的是什么版本的 Java?您的代码适用于 Java 8。
  • 这里 jdk 7 也不例外!!!
  • 只是为了确认提问者:我也使用 Java 1.7.0_55 得到了异常。
  • 你的语言环境是什么?
  • 是的,我的语言环境是希腊语!

标签: java simpledateformat


【解决方案1】:

这行得通:

  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

【讨论】:

  • 您的语言环境可能有问题?我已将该字段添加到 SDF 构造函数中。
  • 是的,这是一个特定于语言环境的问题,请参阅我的回答。
  • 这个答案现在已经过时了,使用了现在遗留的麻烦的旧类,被 java.time 类所取代。在correct Answer by Ole V.V. 中查看现代解决方案。
【解决方案2】:

模式字母a 是上午/下午标记,但它是特定于区域的。显然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");

【讨论】:

    【解决方案3】:

    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 转换为等于13:19LocalTime

    我们仍然需要提供语言环境。由于在英语以外的其他语言环境中几乎不使用 AM/PM 标记,我认为Locale.ENGLISH 是一个相当安全的选择。请自行替换。

    当这个问题在 2014 年被问到时,旧类 DateSimpleDateFormat 的现代替代品已经推出,现代 Java 日期和时间 API。今天,我认为旧课程早已过时,并强烈建议改用现代课程。它们通常被证明对程序员更加友好和方便。

    仅仅为了一件简单的小事,如果我们未能在默认语言环境无法识别 AM 和 PM 的系统上提供语言环境,现代格式化程序会给我们一个异常消息Text '01:19 PM' could not be parsed at index 6。索引 6 是 PM 的位置,所以我们已经在路上了。是的,我知道一种方法可以从过时的类抛出的异常中获取索引,但是大多数程序员从来没有意识到,因此没有使用它。

    更重要的是,新的 API 提供了一个 LocalTime 类,它为我们提供了我们想要和需要的东西:只是没有日期的一天中的时间。这使我们能够更精确地对数据进行建模。 Stack Overflow 上存在许多问题,这些问题是由于 Date 必须同时包含日期和时间而引起的混淆,而有时您只需要其中一个。

    【讨论】:

      【解决方案4】:

      我认为应该是"h:mm a" 而不是"hh:mm aa"

      【讨论】:

      • 我遇到了同样的异常!感谢您的回复
      【解决方案5】:

      根据official documentation,您应该使用此格式字符串:"h:mm a"

      但您的格式字符串也是正确的,因为执行您的代码时我没有收到任何错误。

      【讨论】:

        【解决方案6】:

        试试这个格式:"K:m a"

        也检查文档:SimpleDateFormat
        另外,请检查您的语言环境,您的问题似乎是特定于语言环境的。

        【讨论】:

        • Kh都有效,只是K0..11的范围内,h1..12的范围内。
        • 同样的例外! :(
        猜你喜欢
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多