Java:DATE_EXCEPTION 无法解析的日期:“2017-06-28 08:30 AM”(在偏移量 17 处)

Java : DATE_EXCEPTION Unparseable date : "2017-06-28 08:30 AM" (at offset 17)

我想通过解析字符串日期获得一个 java.util.Date 对象:“2017-06-28 08:30 AM”。此解析用于我的 Android 应用程序。这在许多 Android 版本中没有任何解析异常。像 7.0、4.4.2 和 5.1。但这在 Android 6.0 中不起作用。

这是我的错误日志 SimpleDateFormat,

W/System.err: java.text.ParseException: Unparseable date: "2017-06-28 08:30 AM" (at offset 17)
at java.text.DateFormat.parse(DateFormat.java:579)
at biz.spsolutions.peopleedge.RosterClockInActivity.setData(RosterClockInActivity.java:531)
at biz.spsolutions.peopleedge.RosterClockInActivity.onCreate(RosterClockInActivity.java:391)
at android.app.Activity.performCreate(Activity.java:6877)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3208)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3351)
at android.app.ActivityThread.access00(ActivityThread.java:222)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1796)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7230)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

这是我的 SimpleDateFormat,

SimpleDateFormat currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a")

我也试过这种格式,

SimpleDateFormat currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm aaa")

如何处理这个异常?有什么想法吗?

tl;博士

使用现代 java.time 类.

没问题
LocalDateTime.parse( 
    "2017-06-28 08:30 AM" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" , Locale.US ) 
)

2017-06-28T08:30

使用java.time

您使用的是麻烦的旧日期时间 类,现在已经过时,已被 java.time 类 取代。对于 Android,请参阅下面的最后一个项目符号。

请注意,我将 Locale.US 指定为格式化程序的一部分。语言环境决定了用于确定大写等问题的文化规范。我怀疑您的 JVM 当前默认设置可能设置为期望 "AM/PM" 为小写的语言环境。始终指定 expected/desired 语言环境,而不是隐式依赖当前默认语言环境,该语言环境可以随时通过 JVM 应用程序中的任何代码更改。有关详细信息,请参阅

String input = "2017-06-28 08:30 AM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" , Locale.US ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

看到这个code run live at IdeOne.com

ldt.toString(): 2017-06-28T08:30


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

在哪里获取java.time类?