Java:DATE_EXCEPTION无法解析日期:"2017-06-28 08:30 AM"(偏移17处)

Ter*_*nce 1 java string android simpledateformat java.util.date

我想java.util.Date通过解析一个String日期来获取一个Object:"2017-06-28 08:30 AM".这个解析在我的Android应用程序中使用.这在许多Android版本中没有任何解析异常.像7.0,4.4.2和5.1.但这不适用于Android6.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)
Run Code Online (Sandbox Code Playgroud)

这是我的SimpleDateFormat,

SimpleDateFormat currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a")
Run Code Online (Sandbox Code Playgroud)

我也尝试过这种格式,

SimpleDateFormat currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm aaa")
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*que 6

TL;博士

使用现代java.time类时没问题.

LocalDateTime.parse( 
    "2017-06-28 08:30 AM" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" , Locale.US ) 
)
Run Code Online (Sandbox Code Playgroud)

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 ) ;
Run Code Online (Sandbox Code Playgroud)

请参阅IdeOne.com上的代码.

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


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

  • @ OleV.V.你是对的.我在此撤回我的反对意见,并申请当之无愧的支持. (2认同)