将 tz-offset 内没有冒号的 ISO 日期字符串转换为 XMLGregorianCalendar

Posted

技术标签:

【中文标题】将 tz-offset 内没有冒号的 ISO 日期字符串转换为 XMLGregorianCalendar【英文标题】:Convert ISO date String WITHOUT colon inside tz-offset to 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);
        
 

【问题讨论】:

【参考方案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 中提供。

以上是关于将 tz-offset 内没有冒号的 ISO 日期字符串转换为 XMLGregorianCalendar的主要内容,如果未能解决你的问题,请参考以下文章

将iso日期格式的字符串转换为毫秒。 ISO日期格式包含(“ yyyy-MM-dd”),并且没有时区

atitit.日期,星期,时候的显示方法ISO 8601标准

在linux bash中将ISO日期转换为纪元以来的秒数

如何将 iso 8601 日期发送到后端?

REST GET API 的推荐日期格式

Python - 将日期的字符串表示形式转换为 ISO 8601