xsd:dateTime 到 Java OffsetDateTime

2023-12-02

为了妥善处理xs:日期时间使用 JAXB,我必须编写自己的转换器String->java.time.OffsetDateTime.

正如 XML 架构定义中提到的,dateTime 受到 ISO 8601 的启发。我使用OffsetDateTime.parse(s, DateTimeFormatter.ISO_OFFSET_DATE_TIME)来解析xs:dateTime,这适用于例如

"2007-12-03T10:15:30+01:00" //or
"2007-12-03T10:15:30Z"

可悲的是,在xs:dateTime偏移部分被声明为可选,因此解析有效的

"2016-03-02T17:09:55"

抛出一个DateTimeParseException.

有没有DateTimeFormatter对于 OffsetDateTime,它也处理未分区的xs:dateTimes(可能有默认时区)?


我不认为有内置的,但你可以在DateTimeFormatterBuilder class.

您可以指定一个用方括号括起来的可选偏移量,即[XXXXX](匹配"+HH:MM:ss"),然后,您可以提供默认偏移量(parseDefaulting)在它不存在的情况下。如果想默认UTC,可以设置0指定无偏移;如果你想默认为虚拟机的当前偏移量,你可以使用OffsetDateTime.now().getLong(ChronoField.OFFSET_SECONDS).

public static void main(String[] args) {
    String[] dates = {
        "2007-12-03T10:15:30+01:00",
        "2007-12-03T10:15:30Z",
        "2016-03-02T17:09:55",
        "2016-03-02T17:09:55Z"
    };
    DateTimeFormatter formatter =
        new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss[XXXXX]")
                                      .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
                                      // or OffsetDateTime.now().getLong(ChronoField.OFFSET_SECONDS)
                                      .toFormatter();
    for (String date : dates) {
        System.out.println(OffsetDateTime.parse(date, formatter));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xsd:dateTime 到 Java OffsetDateTime 的相关文章

随机推荐