Java /将ISO-8601(2010-12-16T13:33:50.513852Z)转换为Date对象

Java / convert ISO-8601 (2010-12-16T13:33:50.513852Z) to Date object

如何用Zulu时间解析ISO 8601格式的字符串?

1
javax.xml.bind.DatatypeConverter.parseDateTime("2010-12-16T13:33:50.513852Z")

回报

1
IllegalArgumentException: '2010-12-16T13:33:50.513852Z' weist ein falsches Format auf.

这意味着错误的格式,任何人都有一个线索在这里错在哪里?


TL;博士

1
Instant.parse("2010-12-16T13:33:50.513852Z" )

java.time

较新的java.time类可以处理此字符串输入。

结尾的ZZulu的缩写,表示UTC,偏移量为零+00:00

Instant

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

1
Instant instant = Instant.parse("2010-12-16T13:33:50.513852Z" );

时区

您可能需要应用时区ZoneId来获取ZonedDateTime。搜索Stack Overflow以获取更多信息,以及类OffsetDateTimeDateTimeFormatter

转变

最好避免麻烦的旧遗留类java.util.Date。但是如果你坚持,请调用添加到旧类的新转换方法。

1
java.util.Date date = java.util.Date.from( instant );

关于java.time

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

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

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

从哪里获取java.time类?

  • Java SE 8和SE 9及更高版本

    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • Java SE 6和SE 7

    • 许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
  • Android的

    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport(如上所述)。
    • 请参见如何使用ThreeTenABP ....

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


它适用于我在线尝试ide

输出是:

1
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=16,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=13,MINUTE=33,SECOND=50,MILLISECOND=513,ZONE_OFFSET=0,DST_OFFSET=0]


您发布的代码在我的jre中运行良好。可能你定义了自己的DatatypeConverter(带有德语异常文本......!),这个特定的DatatypeConverter无法解析这个日期。

为这段代码做一个代码搜索:DatatypeConverter.setDatatypeConverter( - 在那里你可能会找到你的"DatatypeConverterInterface"的自定义实现 - 这可能会引导你找到你的bug。

或者,您可以搜索weist ein falsches Format auf.(因为该异常文本不是jre的一部分)

Viel Erfolg;)