【问题标题】:Convert ISO date String WITHOUT colon inside tz-offset to XMLGregorianCalendar将 tz-offset 内没有冒号的 ISO 日期字符串转换为 XMLGregorianCalendar
【发布时间】:2017-06-02 16:55:10
【问题描述】:

输入日期字符串:"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);
        }
 }

【问题讨论】:

    标签: xml java-8 xmlgregoriancalendar


    【解决方案1】:

    也许这个解决方案只使用两个 API(在 Java-8 平台上都可用)并避免使用 Joda-TimeGregorianCalendar

    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 需要公历,而您的代码不尊重这个细微的细节。

    【讨论】:

    • 旁注:从OffsetDateTimeZonedDateTimeXMLGregorianCalendar 的更舒适的转换方式(如this example)尚未在Java-8 中提供或计划在Java-9 中提供。
    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 2019-01-31
    • 2021-03-28
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多