如何使用默认时区将xsd datetime转换为localDateTime

时间:2017-12-05 09:19:11

标签: java xml datetime

有效的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);
    }
}

1 个答案:

答案 0 :(得分:0)

问题是ZonedDateTime总是需要有一个时区。前两个日期错过了。我建议将逻辑封装在一个单独的类中,如果缺少一个区域,只需在末尾添加一个'Z',因为它应该是一个UTC日期时间。您的方法将始终返回ZonedDateTime,代码的客户端将不知道它是如何创建的。