xml - 将 tz 偏移量内不带冒号的 ISO 日期字符串转换为 XMLGregorianCalendar

标签 xml java-8 xmlgregoriancalendar

输入日期字符串:"2016-02-06T00:00:00.000+0100"(+0100中没有冒号)

有没有更好的办法。想知道这是否太过分了。

public static XMLGregorianCalendar convertStringToXMLGregorianCalendar(final String dateStrInXMLGregorianCalendar) {
        try {
            DateTime dateTime = ISODateTimeFormat.dateTime().parseDateTime(dateStrInXMLGregorianCalendar);
            GregorianCalendar gregCal = new GregorianCalendar(dateTime.getZone().toTimeZone());
            gregCal.setTimeInMillis(dateTime.getMillis());
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregCal);
        } catch (Exception e) {
            throw new RuntimeException(String.format("Exception while converting %s to XMLGregorianCalendar!", dateStrInXMLGregorianCalendar), e);
        }
 }

最佳答案

也许这个解决方案仅使用两个 API(均在 Java-8 平台上可用)并避免使用 Joda-Time 以及 GregorianCalendar:

String input = "2016-02-06T00:00:00.000+0100";
OffsetDateTime odt =
    OffsetDateTime.parse(
          input, 
          DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX"));
int year = odt.getYear();
int month = odt.getMonthValue();
int day = odt.getDayOfMonth();
int hour = odt.getHour();
int minute = odt.getMinute();
int second = odt.getSecond();
int millisecond = odt.getNano() / 1_000_000;
int timezone = odt.getOffset().getTotalSeconds() / 60;
XMLGregorianCalendar xmlcal =
    DatatypeFactory.newInstance().newXMLGregorianCalendar(
        year,
        month,
        day,
        hour,
        minute,
        second,
        millisecond,
        timezone
    );
System.out.println(xmlcal); // 2016-02-06T00:00:00.000+01:00

更多行代码,但省略了两个 API,这对我来说似乎更可靠、更高效。例如,如果年份数字在 1582 之前,您的辅助方法肯定是不够的,因为 XML-Schema 需要预推公历,而您的代码不考虑这种微妙的细节。

关于xml - 将 tz 偏移量内不带冒号的 ISO 日期字符串转换为 XMLGregorianCalendar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41717275/

相关文章:

xml - 选择完整的树并仅选择某些子元素

java - 如何使用流将此程序转换为 Java 8 函数式风格?

java - 将时区设置为已经在 UTC 中的 UTC

php - Magento 2 : Add custom script just after head tag

c - 通过 TCP/IP 套接字的 XML 消息

java - 从 Stream Java 8 创建排序的 HashMap

java - 如何只获得类型为 XMLGregorianCalendar 的年份

java - Xmlgregoriancalendar 不允许在 ddMMyyyy 中前导零

php - 检查是否设置了对象属性 - SimpleXML

Java8 对具有数千个同名默认方法的接口(interface)进行缓慢编译