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

如何用祖鲁时间parsingISO 8601格式的string?

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

回报

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

这意味着什么格式错误,任何人都有线索什么错在这里?

它适用于我尝试在线

输出是:

 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] 

TL;博士

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

java.time

较新的java.time类可以处理这个stringinput。

Z最后是Zulu缩写,意思是UTC ,零点+00:00的偏移量。

Instant

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

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

时区

您可能需要应用时区ZoneId以获取ZonedDateTime 。 search堆栈溢出,以了解更多的类名,以及OffsetDateTimeDateTimeFormatter类。

转变

最好避免使用java.util.Date旧式遗留类。 但是如果坚持,就把新的转换方法称为旧类。

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

关于java.time

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

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

你发布的代码在我的工作很好。 可能你定义了你自己的DatatypeConverter(与德国的exception文本…!),这个特定的DatatypeConverter不能parsing这个date。

做这个代码的代码search: DatatypeConverter.setDatatypeConverter( – 你可能会发现你的“DatatypeConverterInterface”的自定义实现 – 这可能会导致你的bug。

或者,您可以searchweist ein falsches Format auf. (因为那个exception文本不是jre的一部分)

Viel Erfolg;)