Java:DATE“异常不可解析日期:”;2017-06-28 08:30“上午”;(在偏移量17处)

Java:DATE“异常不可解析日期:”;2017-06-28 08:30“上午”;(在偏移量17处),java,android,string,simpledateformat,java.util.date,Java,Android,String,Simpledateformat,Java.util.date,我想通过解析字符串Date获得一个java.util.Date对象:“2017-06-28 08:30 AM”。这种解析在我的Android应用程序中使用。这在许多Android版本中都可以正常工作,没有任何解析异常。比如7.0、4.4.2和5.1。但这在安卓系统中不起作用 这是我的错误日志和SimpleDateFormat W/System.err: java.text.ParseException: Unparseable date: "2017-06-28 08:30 AM" (at of

我想通过解析字符串Date获得一个
java.util.Date
对象:“2017-06-28 08:30 AM”。这种解析在我的Android应用程序中使用。这在许多
Android
版本中都可以正常工作,没有任何解析异常。比如7.0、4.4.2和5.1。但这在安卓系统中不起作用

这是我的错误日志和
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 currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a")
这是我的
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 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-28 08:30

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

请注意,我指定
Locale.US
作为格式化程序的一部分。区域设置决定了用于确定资本化等问题的文化规范。我怀疑JVM当前的默认值可能设置为期望“AM/PM”为小写的区域设置。始终指定预期/期望的区域设置,而不是隐式地依赖当前默认区域设置,该默认区域设置可以随时由JVM应用程序中的任何代码更改。有关详细信息,请参阅

看这个

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


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
tl;博士 使用现代java.time类时没有问题

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

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

请注意,我指定
Locale.US
作为格式化程序的一部分。区域设置决定了用于确定资本化等问题的文化规范。我怀疑JVM当前的默认值可能设置为期望“AM/PM”为小写的区域设置。始终指定预期/期望的区域设置,而不是隐式地依赖当前默认区域设置,该默认区域设置可以随时由JVM应用程序中的任何代码更改。有关详细信息,请参阅

看这个

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


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

试试这个
2017-06-28 08:30 am
@屏障检查,如果有帮助的话。@M D:好的,我会试着告诉你你的区域设置是什么?(如果不是英语,AM/PM不代表任何意思)你的两种格式在我的电脑上都有效(除了你缺少一个分号)。尽管如此,我还是希望做一些修改:(1)在
新的SimpleDateFormat(“yyyy-MM-dd-hh:MM-a”,locale.ENGLISH)中给出显式的区域设置;这可能会解决你的问题。(2) 给出明确的时区:
currentFormat.setTimeZone(TimeZone.getTimeZone(“亚洲/哈尔滨”)。(3) 最好,获取并使用。试试这个
2017-06-28 08:30 am
@屏障检查,如果有用的话。@M D:好的,我会试着告诉你你的区域设置是什么?(如果不是英语,AM/PM不代表任何意思)你的两种格式在我的电脑上都有效(除了你缺少一个分号)。尽管如此,我还是希望做一些修改:(1)在
新的SimpleDateFormat(“yyyy-MM-dd-hh:MM-a”,locale.ENGLISH)中给出显式的区域设置;这可能会解决你的问题。(2) 给出明确的时区:
currentFormat.setTimeZone(TimeZone.getTimeZone(“亚洲/哈尔滨”)。(3) 最好的,获取并使用。@DawoodibnKareem(a)注意,我在回答中确实展示了
Locale
的用法。(b) 根本没有理由使用旧的
日期
/
日历
/
SimpleDateFormat
类这种糟糕透顶的东西。我声称避免这些课程是解决所有此类问题的正确方法。(c) 我将特别提到区域设置可能是问题的原因。@DawoodibnKareem,我明白你的意思。我也同意你的观点,OP的问题很可能与语言环境有关。答案确实为输入字符串提供了正确的区域设置,因此解决了问题。在堆栈溢出问题上,用另一种方法解决问题是受欢迎的,它帮助了成千上万的用户,通常比他们预期的要好。虽然这可能不是人们所要求的答案,但它仍然很可能是OP想要的答案。@OleV.V。你说得对。我特此撤回我的反对意见,并进行当之无愧的投票。@DawoodibnKareem(a)注意,我在回答中确实使用了
Locale
。(b) 根本没有理由对我使用这种可怕的方式