java.text.ParseException:无法解析的日期:“01:19 PM”

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

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) 

这有效:

  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 

模式字母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"); 

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:19

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

已经在2014年提出这个问题时,旧类DateSimpleDateFormat的现代替代品已经出现,现代Java日期和时间API。 今天我认为旧课程已经过时,并热烈推荐使用现代课程。 他们通常表现出更加友好的程序员和方便的工作。

仅仅为了一个简单的小事,如果我们无法在具有无法识别AM和PM的默认语言环境的系统上给出语言环境,那么现代格式化程序将给出一个例外,消息Text '01:19 PM' could not be parsed at index 6 。 索引6是它所说的PM ,所以我们已经开始了。 是的,我知道有一种方法可以使索引脱离过时类抛出的exception,但是大多数程序员从来都不知道,因此没有使用它。

更重要的是,新的API提供了一个LocalTime类,它为我们提供了我们想要和需要的东西:只是没有日期的时间。 这使我们能够更精确地建模数据。 由于Date必然包括日期和时间(有时您只想要一个或另一个)这一事实导致混淆导致Stack Overflow上存在许多问题。

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

根据官方文档,你应该使用这个格式字符串: "h:mm a"

但是你的格式字符串也是正确的,因为我没有执行代码时出错。

试试这种格式: "K:ma"

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