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

时间:2010-12-24 10:47:40

标签: java date iso

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

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

返回

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

这意味着错误的格式,任何人都知道这里有什么问题?

5 个答案:

答案 0 :(得分:5)

TL;博士

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

java.time

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

结尾的ZZulu的缩写,意为UTC,偏移为零+00:00

Instant

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

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

时区

您可能需要应用时区ZoneId来获取ZonedDateTime。搜索这些类名称的Stack Overflow以了解更多内容,以及类OffsetDateTimeDateTimeFormatter

转换

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

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

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

我可以试试ide online

输出是:

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]

答案 2 :(得分:1)

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

    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.000000Z”,则输出的ZonedDateTime对象为“ 2010-12-16T13:00Z”,即使通过它看起来奇怪的是,没有秒和毫秒,它仍然是一个冗长的ZonedDateTime。

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

    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
}

答案 3 :(得分:0)

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

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

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

Viel Erfolg;)

答案 4 :(得分:-3)

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS'Z'");
Date localizatedAt = dateFormat.parse(nextLine[i - 5 + 2]);