Преобразование даты ISO Строка БЕЗ двоеточия внутри tz-offset в 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);
        }
 }
+2
источник поделиться
1 ответ

Возможно, это решение, которое использует только два 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 требует пролептический gregorian-календарь, в то время как ваш код не соблюдает эту детализацию.

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос