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

时间:2019-02-25 20:12:52

标签: 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”应在最后一个日期中输出一个冒号,但不适用于我。

我想念什么?

我看过this solution,但不想使用Joda-Time,因为它可能会在将来在两种日期类型之间移动时引起复杂性。

2 个答案:

答案 0 :(得分:3)

tl; dr

OffsetDateTime.parse( "2001-05-03T00:00:00+00:00" )

避免使用旧的日期时间类

从不使用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" ) ;  

请参阅此code run live at IdeOne.com

  

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

Z

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

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

冒号字符

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


关于 java.time

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

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

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:2)

找到的解决方案最终是将ZonedDateTime与DateTimeFormatter一起使用。

DateTimeFormatter dtf = DateTimeFormatter.ISO_OFFSET_DATE_TIME; ZonedDateTime lastAvailableDateTime = ZonedDateTime.parse("2011-05-03T00:00:00+05:00", dtf);

此代码的输出为:

2011-05-03T00:00:00+05:00