Java : DATE_EXCEPTION 不可解析的日期 : "2017-06-28 08:30 AM" (偏移量 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.access$1100(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; dr

使用现代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"处于小写字母。始终指定预期/所需的语言环境,而不是隐式依赖当前默认环境,该默认环境可以通过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 ) ;

请参阅此代码在IDEONE.com上进行直播。

ldt.tostring((:2017-06-28T08:30


关于java.time

Java.Time框架内置在Java 8及更高版本中。这些课程取代了麻烦的旧旧日期时间类,例如java.util.DateCalendar,&SimpleDateFormat

现在处于维护模式的Joda Time项目建议迁移到Java.Time类。

要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获取许多示例和解释。规格是JSR 310。

从哪里获得Java.Time课程?

  • Java SE 8 Java SE 9 ,然后
    • 内置。
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6 Java SE 7
    • 大部分Java.Time功能都回到Java 6&7在 Threeten-Backport
  • Android
    • threetenabp project aptapts threeten-backport (上面提到(Android专门。
    • 参见如何使用Threetenabp…

最新更新