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());
}