在谷歌搜索时,我遇到了许多答案 - 因此问题。
在Java中解析任何 xsd:date
到LocalDate
的正确方法是什么?
以下是我提出的方法(来自谷歌搜索):
DatatypeFactory.newInstance()
.newXMLGregorianCalendar(str)
.toGregorianCalendar()
.toZonedDateTime()
.toLocalDate()
另:
DatatypeConverter.parseDate(str)
.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate()
或许我应该做一些完全不同的事情?
答案 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());
我已经看到了几个通过GregorianCalendar
和ZonedDateTime
执行此操作的答案,但我不明白为什么如果您失去了时区,为什么会出现这种情况。
我还认为通过XMLGregorianCalendar
进行解析比使用DatatypeConverter.parseDate
通过Calendar
更好,因为XMLGregorianCalendar
更接近xsd:date
的词汇值。 LocalDate
所需要的只是年,月和日,所以选择这些值的最短路径是合理的。