【问题标题】:Unparsable date Exception Simple Date Format [duplicate]无法解析的日期异常 Simpledateformat [重复]
【发布时间】:2016-06-29 06:51:52
【问题描述】:

我正在尝试使用 SimpleDateFormat 将字符串解析为日期对象。 下面是我的代码

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm.sss");
Date parsedDate = formatter.parse("2016-06-28T14:10:23.374Z");
System.out.println(parsedDate.toString());

这给了我以下异常

Exception in thread "main" java.text.ParseException: Unparseable date: "2016-06-28T14:10:23.374Z"
at java.text.DateFormat.parse(DateFormat.java:368)
at com.bac.rds.dolphin.test.Main.main(Main.java:60)

我对这个问题的理解是,我在 SDF 中使用的格式字符串可能不合适。我对 SimpleDateFormat 不太熟悉,感谢任何帮助以使其正常工作。

编辑

已将我的格式字符串更新如下

yyyy-MM-dd'T'HH:mm:ss.SSS

此格式字符串能够将字符串解析为日期对象。但是,当我尝试在格式字符串的末尾包含 Z 以指定时区时,Z 也存在于我拥有的日期字符串中。它给出了解析异常。

下面是抛出解析异常的格式

yyyy-MM-dd'T'HH:mm:ss.SSSZ

为什么会有这种行为?

【问题讨论】:

  • 看看你的模式——它不以 Z 结尾,但值是。同样,您的模式使用hh,它是一天中 1-12 小时的格式说明符,但您的值的值为 14。您是否阅读了SimpleDateFormat 文档来检查您的模式的每个部分?
  • 看看这个文档来了解解析方法:docs.oracle.com/javase/7/docs/api/java/text/…
  • 另外,您正在尝试将毫秒解析为秒,并且没有解析秒的模式。
  • @JonSkeet .. 浏览文档后更改了格式字符串 .. 仍然出现错误 .. 请查看我对问题的编辑
  • 查看Z 格式说明符的含义。您应该改用X,或者像引用T 一样引用Z,并在格式化程序中将时区设置为UTC。

标签: java date simpledateformat


【解决方案1】:

试试这个

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date parsedDate = formatter.parse("2016-06-28T14:10:23.374Z");
System.out.println(parsedDate.toString());

输出是

Tue Jun 28 14:10:23 IST 2016

【讨论】:

  • 所以你解析 10 分钟和 23 秒,但输出是 16 分钟和 14 秒。这听起来不对,是吗?
  • @ErwinBolwidt 你知道为什么吗?
  • 小写的 s 将解析秒,你已经在你的模式中输入了两次。大写的 S 解析毫秒。
  • 还是错了。如果您在模式中转义字母 Z,那么您必须在 SimpleDateFormat-object 上将时区设置为 UTC (GMT0),以便以正确的方式处理输入的字母 Z(旧 Java 的方式- 7) 之前的版本。或者更好地使用模式符号 X(在 Java-7 中可用)。
  • 仅供参考,非常麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2019-12-04
  • 2013-05-23
相关资源
最近更新 更多