有效的xsd datetime
值为:
2002-05-30T09:00:00
2002-05-30T09:30:10.5
2002-05-30T09:30:10Z
2002-05-30T09:30:10-06:00
当我尝试使用ZonedDateTime
public static void main(String[] args) {
System.out.println(ZonedDateTime.parse(value, DateTimeFormatter.ISO_DATE_TIME).withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime());
}
前两个值如果因为没有时区而失败:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2017-12-05T10:05:19.296' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2017-12-05T10:05:19.296 of type java.time.format.Parsed
当我使用LocalDateTime
时,它会忽略最后两个值中的时区。
public static void main(String[] args) {
System.out.println(LocalDateTime.parse("2002-05-30T09:30:10-06:00", DateTimeFormatter.ISO_DATE_TIME)); // print 2002-05-30T09:30:10 and I am in +1 timezone
}
那么转换这个xsd日期时间的正确方法是什么?
更新
所以也许转换xsd:datime的最佳解决方案是使用gregorianCalendar的旧方法,它也支持zoneDateTime?
public static LocalDateTime parseDateTime(String strVal) {
try {
if (strVal == null || strVal.isEmpty())
return null;
return ((GregorianCalendar) (DatatypeConverter.parseDateTime(strVal))).toZonedDateTime()
.withZoneSameLocal(ZoneId.systemDefault()).toLocalDateTime();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
答案 0 :(得分:0)
问题是ZonedDateTime总是需要有一个时区。前两个日期错过了。我建议将逻辑封装在一个单独的类中,如果缺少一个区域,只需在末尾添加一个'Z',因为它应该是一个UTC日期时间。您的方法将始终返回ZonedDateTime,代码的客户端将不知道它是如何创建的。