如何用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.
这意味着错误的格式,任何人都知道这里有什么问题?
答案 0 :(得分:5)
Instant.parse( "2010-12-16T13:33:50.513852Z" )
较新的java.time类可以处理此字符串输入。
结尾的Z
是Zulu
的缩写,意为UTC,偏移为零+00:00
。
Instant
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
Instant instant = Instant.parse( "2010-12-16T13:33:50.513852Z" );
您可能需要应用时区ZoneId
来获取ZonedDateTime
。搜索这些类名称的Stack Overflow以了解更多内容,以及类OffsetDateTime
和DateTimeFormatter
。
最好避免麻烦的旧遗留类java.util.Date
。但是如果你坚持,请调用添加到旧类的新转换方法。
java.util.Date date = java.util.Date.from( instant );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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]);