奇怪的事情发生在最绝望的时候。
我在这行代码中遇到了一些奇怪的事情
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
的位置。
这是一个区域设置问题。 AM
和 PM
虽然源自拉丁语,但在英语中却被称为“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
导入日期和时间类。
链接
- Oracle tutorial: Date Time解释如何使用
java.time
。 - Java Specification Request (JSR) 310 ,其中首次描述了 java.time。
- ThreeTen Backport project ,
java.time
向 Java 6 和 7 的向后移植(对于 JSR-310,为 ThreeTen)。 - ThreeTenABP , Android 版 ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
关于java - 新的 SimpleDateFormat ("hh:mm a", Locale.getDefault()).parse ("04:30 PM")给出 Unparseable 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53313558/