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)
,
связи
- Учебник Oracle: Дата и время, объясняющие, как использовать
java.time
, - Схема XML, часть 2: типы данных, второе издание: лексическое представление
- Документация
DatatypeFactory.newXMLGregorianCalendar(String)