正确的方法将xsd:date解析为LocalDate

时间:2016-11-09 13:49:54

标签: java xml

在谷歌搜索时,我遇到了许多答案 - 因此问题。

在Java中解析任何 xsd:dateLocalDate正确方法是什么?

以下是我提出的方法(来自谷歌搜索):

DatatypeFactory.newInstance()
    .newXMLGregorianCalendar(str)
    .toGregorianCalendar()
    .toZonedDateTime()
    .toLocalDate()

另:

DatatypeConverter.parseDate(str)
    .toInstant()
    .atZone(ZoneId.systemDefault())
    .toLocalDate()

或许我应该做一些完全不同的事情?

1 个答案:

答案 0 :(得分:0)

不,无法正确 xsd:date <{1}}转换为LocalDate

因为xsd:date可能有时区而LocalDate没有时区。所以要么它不是任何 xsd:date,要么转换不完全正确

如果您对丢失时区感到满意,那么我只会这样做:

XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(str);
LocalDate localDate = LocalDate.of(cal.getYear(), cal.getMonth(), cal.getDay());

我已经看到了几个通过GregorianCalendarZonedDateTime执行此操作的答案,但我不明白为什么如果您失去了时区,为什么会出现这种情况。

我还认为通过XMLGregorianCalendar进行解析比使用DatatypeConverter.parseDate通过Calendar更好,因为XMLGregorianCalendar更接近xsd:date的词汇值。 LocalDate所需要的只是年,月和日,所以选择这些值的最短路径是合理的。