Xmlgregoriancalendar не допускается ведущий ноль в ddMMyyyy

Я пытался получить XMLGregorianCalendar с форматом даты ddMMyyy, Когда я пытался преобразовать его из DateКидала меня:

java.lang.IllegalArgumentException: ведущие нули не допускаются.

Есть ли способ это исправить?

Спасибо!

DateFormat format = new SimpleDateFormat("ddMMyyyy");
XMLGregorianCalendar gTest = DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(new Date(1, 9, 2018)));

1 ответ

Решение

Во-первых, вы не должны использовать Date класс, если вы можете избежать этого. Вы также можете избежать XMLGregorianCalendar, Date а также SimpleDateFormat давно устарели, а последние, в частности, славятся своими проблемами. Сегодня у нас намного лучше java.time, современный Java API даты и времени. Может также иногда заменять XMLGregorianCalendar,

Но если поверить на слово, у вас есть старомодный Date объект - возможно, из устаревшего API, который вы не можете изменить или не хотите менять прямо сейчас. Вы должны преобразовать его в XMLGregorianCalendar, Я все еще предпочитаю использовать java.time для преобразования.

    Date oldfashionedDate = // some Date equal to 1 August 2018 at 00:00 in my time zone;
    LocalDate modernDate = oldfashionedDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    XMLGregorianCalendar gTest = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(modernDate.toString());
    System.out.println(gTest);

Это печатает:

2018-08-01

Вы просили формат ddMMyyyy, Вы не можете иметь это. Или, точнее, единственный способ, которым вы можете иметь это в строке, а не в XMLGregorianCalendar, XMLGregorianCalendar.toString() создает формат XML, и это определяется в схеме XML (см. ссылку внизу). Это идет как например 2018-08-01, 2018-08-01T00:00:00 или же 2018-08-01T00:00:00+02:00,

Что пошло не так в вашем коде?

Я не мог воспроизвести ваш IllegalArgumentException, На моей Java 10 лидирует 0 из 01082018 был принят (на Java 8 тоже). Однако фабрика типов данных проанализировала строку в год 1082018 (через миллион с лишним лет), и с тех пор, как строка завершилась там, она не анализировала ни месяц, ни день месяца. Так что в результате XMLGregorianCalendar было только год, другие поля не были определены.

newXMLGregorianCalendar(String) принимает только формат XML. Видимо, один год принят. Формат по-прежнему соответствует спецификации, указанной в нижней части этого ответа.

Принятие начального 0, вероятно, является ошибкой, поскольку начальный ноль не выводится обратно из toXMLFormat метод, который должен был вернуть ту же строку, что была проанализирована, в соответствии с документацией newXMLGregorianCalendar(String),

связи

Другие вопросы по тегам