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

Java/将ISO-8601(2010-12-16T13:33:50.513852Z)转换为日期对象,java,date,iso,Java,Date,Iso,如何使用Zulu时间解析格式的字符串 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.GregorianC

如何使用Zulu时间解析格式的字符串

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]

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

对该代码执行代码搜索:
DatatypeConverter.setDatatypeConverter(
)-在那里,您可能会找到“DatatypeConverterInterface”的自定义实现,这可能会导致出现错误

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

维尔·埃尔福尔;)

tl;博士
java.time 较新的java.time类可以处理此字符串输入

末端的
Z
Zulu
的缩写,表示偏移量为零
+00:00

Instant
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

时区 您可能需要应用时区
ZoneId
,以获取
zoneDateTime
。在堆栈溢出中搜索这些类名以了解更多信息,以及类
OffsetDateTime
DateTimeFormatter

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

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


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在此处找到一些有用的类,如、、。

如果目标数据类型为“ZonedDateTime”,则可以使用日期格式化程序“yyyy-MM-dd'T'HH:MM:ss.ssssx”。示例代码如下所示:

    public ZonedDateTime convertStringToZonedDateTime() {
       String inputString = "2010-12-16T13:33:50.513852Z";
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX");
       ZonedDateTime zdt = ZonedDateTime.parse(inputString, formatter);
       return zdt; //Output ZonedDateTime object is 2010-12-16T13:33:50.513852Z
}
注意!如果输入日期字符串的0为秒和毫秒,例如“2010-12-16T13:00:00.000000 Z”,则输出ZonedDateTime对象为“2010-12-16T13:00Z”,即使没有秒和毫秒看起来很奇怪,它仍然是一个leagl ZonedDateTime。


如果目标数据类型为“即时””:


格式没有问题,运行良好。仅供参考:稍后由链接复制的内容已损坏:-(更新:这个糟糕的类现在已经被JSR 310中定义的java.time类所取代。还有一个arg
ZonedDateTime.parse
方法在没有任何显式格式化程序的情况下解析字符串,
ZonedDateTime.parse(inputString)
java.util.Date date = java.util.Date.from( instant );
    public ZonedDateTime convertStringToZonedDateTime() {
       String inputString = "2010-12-16T13:33:50.513852Z";
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX");
       ZonedDateTime zdt = ZonedDateTime.parse(inputString, formatter);
       return zdt; //Output ZonedDateTime object is 2010-12-16T13:33:50.513852Z
}
    public Instant convertStringToInstant() {
       String inputString = "2010-12-16T13:33:50.513852Z";
       Instant instant = Instant.parse(inputString);
       return instant; //Output Instant object is 2010-12-16T13:33:50.513852Z
}