将ISO 8601日期时间格式的字符串转换为Java Date

Rya*_*yan 1 java date

我正在尝试将字符串转换为ISO 8601日期时间格式。目前,此代码

String s1 = "2001-05-03T00:00:00+00:00"; Date firstAvailableDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").parse(s1);

给我这个结果

2001-05-03T00:00:00.000+0000

但是,此输出缺少时区中的冒号。所需的输出是:

2001-05-03T00:00:00.000+00:00

根据https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html,在时区中使用“ XXX”应在最终日期中输出一个冒号,但对我而言不是。

我想念什么?

我已经研究过此解决方案,但不想使用Joda-Time,因为它可能会在将来在两种日期类型之间移动时引起复杂性。

Bas*_*que 5

tl; dr

OffsetDateTime.parse( "2001-05-03T00:00:00+00:00" )
Run Code Online (Sandbox Code Playgroud)

避免使用旧的日期时间类

切勿使用SimpleDateFormatDateCalendar等,这些可怕班学生被取代年前java.time类。

ISO 8601

尝试将字符串转换为ISO 8601日期时间格式

String s1 = "2001-05-03T00:00:00+00:00"

您的问题很困惑。您的输入字符串标准ISO 8601格式。在T中间分隔开来时,分,秒的年,月,日,并+00:00在最后表示偏移从-UTC的零小时零分钟,即,UTC本身。所有标准,都正确。

也许您正在混合表示日期时间值的字符串和包含日期时间值的日期时间对象。日期时间对象没有“格式”;它具有自己的内部定义的日期时间值表示。仅文本具有格式。日期时间类可以将格式化的字符串解析为输入,而日期时间类可以将格式化的字符串生成为输出,但是在日期时间之内根本没有格式。

OffsetDateTime

解析/生成表示日期时间值的字符串时,java.time类默认使用ISO 8601格式。因此,无需为此类输入指定格式设置模式。

OffsetDateTime odt = OffsetDateTime.parse( "2001-05-03T00:00:00+00:00" ) ;  
Run Code Online (Sandbox Code Playgroud)

参见IdeOne.com实时运行代码

odt.toString():2001-05-03T00:00Z

Z

偏移量通常是零的缩写:一个简单的Z字母,表示UTC,发音为“ Zulu”。例:2019-02-26T00:44:28Z

Z是相当常用。但是,如果由于某些原因您更喜欢数字+00:00,请使用DateTimeFormatter选项。

冒号

顺便说一句,您提到了在offset:中省略的COLON字符+0000。这实际上是ISO 8601标准所允许的。但我不建议这样做。我已经看到库和系统在此类输入上中断。最好使用全长,小时分钟,填充零和冒号:+00:00而不是+0000和,-07:00而不是-7


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

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

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多