java - 新的 SimpleDateFormat ("hh:mm a", Locale.getDefault()).parse ("04:30 PM")给出 Unparseable 异常

标签 java android time simpledateformat datetime-parsing

奇怪的事情发生在最绝望的时候。

我在这行代码中遇到了一些奇怪的事情

Date time = new SimpleDateFormat("hh:mm a", Locale.getDefault()).parse("04:30 PM");

正在给予

"Unparseable date: \"04:30 PM\" (at offset 6)"

仅适用于 Android 6.0 和 Android 6.0.1 设备,在生产应用中(在 Google Play 商店中)。

PS:我无法在 Android 6.0 模拟器和 HTC Desire 10 Pro Android 6.0.1 上重新生成此错误。 任何在本地重新生成此错误或如何解决该错误的帮助将不胜感激。

编辑日期:2018 年 11 月 15 日 出现此异常的设备。

OS Version: 3.4.0-10662519 (G900FXXS1CQD8) OS API Level: 23 Device: klte Model (and Product): SM-G900F (kltexx) Manufacturer: samsung Other TAGS: release-keys SD Card state: mounted http.agent = Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-G900F Build/MMB29M)

OS Version: 3.10.84 (v1AJW-0) OS API Level: 23 Device: idol4 Model (and Product): 6055K (6055K) Manufacturer: TCL Other TAGS: release-keys SD Card state: mounted http.agent = Dalvik/2.1.0 (Linux; U; Android 6.0.1; 6055K Build/MMB29M)

OS Version: 3.10.84-g05b37ae (16293194481ff) OS API Level: 23 Device: p1 Model (and Product): LG-H818 (p1_global_com) Manufacturer: LGE Other TAGS: release-keys SD Card state: mounted http.agent = Dalvik/2.1.0 (Linux; U; Android 6.0; LG-H818 Build/MRA58K)

最佳答案

字符串的偏移 6 就是 PM 的位置。

这是一个区域设置问题。 AMPM 虽然源自拉丁语,但在英语中却被称为“AM”,而在许多其他语言中则不然。因此,这些缩写在很多语言环境中都无法被识别。在您的代码中,您使用 Locale.getDefault(),如果它返回非英语区域设置,您可能会收到错误。尝试使用 Locale.ENGLISH 来代替。或者,确保您获得默认语言环境的正确格式和语言的字符串。

java.time

如果您正在应用程序中对时间或日期进行大量工作,并且对于任何针对 Java 8 或更高版本或 Android API 级别 26 或更高级别进行编程的人:您使用的类,Date和 SimpleDateFormat 始终存在设计问题,尤其是后者通常很麻烦。幸运的是,两者现在都已经过时了,并被现代 Java 日期和时间 API java.time 所取代。所以用这个代替:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
    LocalTime time = LocalTime.parse("04:30 PM", timeFormatter);
    System.out.println(time);

输出:

16:30

LocalTime 是一天中的时间,没有日期和时区,似乎比老式的 Date 类更能满足您的需求。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在旧版和新版 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保使用子包从 org. Threeten.bp 导入日期和时间类。

链接

关于java - 新的 SimpleDateFormat ("hh:mm a", Locale.getDefault()).parse ("04:30 PM")给出 Unparseable 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53313558/

相关文章:

java - 如何从java中的文本文件中提取列

Android:解析未知的 JSON 标签

java - 如何在android中使用类获取用户位置获取空指针异常

c - 在Windows中获取纳秒级执行时间

javascript - 如何在 JavaScript 中比较时间(仅小时)?

java - 在Java中从src文件夹打开文本文件时出错

java - Simplexml valuerequired 异常

java - java读取不同编码的文本文件

android - 向自定义 TextView 添加文本是不可见的

c++ - 假设 time_t 以秒为单位有多安全?