如何将ISO8601日期(字符串)转换为日期?

use*_*778 2 java parsing date iso8601

我正在解析XML文件.在这个文件中有一个包含日期字符串的标记"2008-11-10T05:51:33Z",我想将此字符串转换为java.util.Date object.

如何才能做到这一点?

Jon*_*eet 9

使用java.text.DateFormat - 或者更有可能的是SimpleDateFormat.

或者,使用其无限更好的API 去Joda Time.小心Java内置API - DateFormats不是线程安全的.(它们在Joda Time中,几乎在所有地方都使用不可变类型.)

Joda Time API的示例(未经测试 - 除了可能的时区位之外应该没问题):

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd'T'HH:mm:ssZ");
DateTime dt = fmt.parse("2008-11-10T05:51:33Z");
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

tl;博士

Instant.parse( "2008-11-10T05:51:33Z" ) 
Run Code Online (Sandbox Code Playgroud)

使用 java.time

现代方法使用 java.time 类。避免麻烦的旧日期时间类,例如DateCalendar因为它们现在被 java.time 类取代。

ISO 8601

您的输入字符串符合 ISO 8601 标准,用于格式化表示日期时间值的字符串。java.time 类在解析/生成字符串时默认使用标准格式,因此无需指定格式模式。

Z上月底是短期的Zulu,并指UTC。

Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。

Instant instant = Instant.parse( "2008-11-10T05:51:33Z" ) ;
Run Code Online (Sandbox Code Playgroud)

java.util.Date

最好避免旧的遗留类java.util.Date。但是,如果必须,您可以通过调用添加到旧类的新方法来转换为 java.time 或从 java.time 转换。这里我们使用Date.from.

java.util.Date d = java.util.Date.from( instant ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

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

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

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多