使用 Java 1.6 接收带有包含 ISO 8601 格式化日期的字符串的 ParseException

Posted

技术标签:

【中文标题】使用 Java 1.6 接收带有包含 ISO 8601 格式化日期的字符串的 ParseException【英文标题】:Receiving ParseException with String containing ISO 8601 Formatted Date using Java 1.6 【发布时间】:2014-08-28 00:20:41 【问题描述】:

当我尝试将 ISO 8601 格式的字符串解析为 Java 日期类型时,不断收到 ParseException。

String myDateString = "2014-07-04T22:59:36Z";  
TimeZone timeZone = TimeZone.getTimeZone("UTC");
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.US);
dateFormat.setTimeZone(timeZone);
Date formattedDate = dateFormat.parse(myDateString);

不断返回 ParseException:

Unparseable date: "2014-07-04T22:59:36Z"

我可能做错了什么?

【问题讨论】:

您应该使用X(未引用)而不是'Z'。你需要 :ss 几秒钟 -- "yyyy-MM-dd'T'HH:mm:ssX" Trouble parsing a certain Date format, I keep getting ParseException 的可能重复项 【参考方案1】:

您的日期格式中缺少秒数:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);

【讨论】:

【参考方案2】:

tl;博士

对于 Java 6 和 7,将 ThreeTen-Backport 库添加到您的项目中。对于 Java 8 及更高版本,java.time 是内置的。

Instant.parse( "2014-07-04T22:59:36Z" )

java.time

现代方法是使用 java.time 类来取代麻烦的旧旧日期时间类,例如 SimpleDateFormatDateCalendar

虽然内置于 Java 8 及更高版本,但可以向后移植到 Java 6 和 Java 7。 (见下文)

Instant

Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。

java.time 类默认使用 ISO 8601 格式。所以无需指定格式模式Instant 类可以直接解析你的输入字符串。

Instant instant = Instant.parse( "2014-07-04T22:59:36Z" );

要生成标准 ISO 8601 格式的字符串,只需调用 toString

String output = instant.toString();

2014-07-04T22:59:36Z


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

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

从哪里获得 java.time 类?

Java SE 8SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6SE 7 ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。 Android ThreeTenABP 项目专门为 android 适配 ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和more。

【讨论】:

以上是关于使用 Java 1.6 接收带有包含 ISO 8601 格式化日期的字符串的 ParseException的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有时区的情况下解析 ISO8061 至今

Java字符编码,ISO到UTF的转换

1.6_03:计算书费(noip)

关于java中 get提交方式的乱码问题

C# PCSC-sharp 发送/接收带有数据的自定义命令

带有 SOAP XML JAX-WS(WAS Portal 7)服务的 Java 1.6 Maven 项目对 Tomcat Liferay 6.2 GA6 无法访问端点