【问题标题】:Java : DATE_EXCEPTION Unparseable date : "2017-06-28 08:30 AM" (at offset 17)Java:DATE_EXCEPTION 无法解析的日期:“2017-06-28 08:30 AM”(偏移量 17)
【发布时间】:2017-06-28 04:10:23
【问题描述】:

我想通过解析字符串日期来获得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")

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

【问题讨论】:

  • 试试这个2017-06-28 08:30 am
  • @MD:好的,我会尽力通知你
  • 您的语言环境是什么? (如果不是英语,AM/PM 没有任何意义)
  • 您的两种格式都可以在我的计算机上使用(除了您缺少分号)。不过,我应该更喜欢一些更改: (1) 给出明确的语言环境,如new SimpleDateFormat("yyyy-MM-dd hh:mm a", Locale.ENGLISH);这可能会解决您的问题。 (2) 给出明确的时区:currentFormat.setTimeZone(TimeZone.getTimeZone("Asia/Harbin"));。 (3) 最好,获取ThreeTenABP 并使用Basil Bourque’s answer。

标签: java android string simpledateformat java.util.date


【解决方案1】:

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”为小写的语言环境。始终指定预期/期望的语言环境,而不是隐式依赖当前的默认语言环境,该语言环境可以随时由 JVM 应用程序中的任何代码更改。如需更多信息,请参阅other Question。

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 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

从哪里获得 java.time 类?

【讨论】:

  • @DawoodibnKareem (a) 请注意,我确实在我的回答中展示了Locale 的使用。 (b) 根本没有理由使用旧的 Date/Calendar/SimpleDateFormat 类的血腥可怕的混乱。我声称避免这些课程是每个此类问题的正确解决方案。 (c) 我将添加一个关于语言环境可能导致问题的具体说明。
  • @DawoodibnKareem,我明白你的意思。我也同意你的观点,OP 的问题很可能与语言环境有关。答案 确实 为输入字符串提供了正确的语言环境,从而解决了问题。 Stack Overflow 上欢迎以不同于预期的方式解决问题,并帮助了成千上万的用户,通常比他们预期的要好。虽然这可能不是所要求的答案,但它仍然很可能是 OP 想要的答案。
  • @OleV.V.你是对的。我在此撤回我的反对意见,并给予当之无愧的支持。
猜你喜欢
  • 2017-11-19
  • 2015-10-31
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多