Формат XMLGregorianCalendar с итальянским форматом даты (дд / мм / гггг) без времени
Я пытаюсь преобразовать java.util.Date
в XMLGregorianCalendar
в итальянском формате (дд / мм / гггг) без времени. Что бы я ни пробовал, вывод всегда печатается yyyy-mm-dd
,
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("Europe/Rome"));
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH),
DatatypeConstants.FIELD_UNDEFINED);
System.out.println(xmlDate);
Я являюсь пользователем веб-службы SOAP, и атрибут date определяется как XMLGregorianCalendar
,
Посоветуйте, пожалуйста, как мне изменить код, чтобы получить вывод в формате (дд / мм / гггг).
1 ответ
Вам не нужно XMLGregorianCalender
, Он не даст вам того, о чем вы просите. Вместо этого вам нужно LocalDate
и DateTimeFormatter
:
DateTimeFormatter italianDateFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(Locale.ITALIAN);
LocalDate date = LocalDate.now(ZoneId.of("Europe/Rome"));
String formattedDate = date.format(italianDateFormatter);
System.out.println(formattedDate);
Когда я запускал этот код сегодня, вывод был:
21/01/19
Отличие от того, что вы просите, состоит из двухзначного года, 19
, Если вместо FormatStyle.SHORT
мы используем FormatStyle.MEDIUM
, мы получаем четыре цифры года, но месяц как трехбуквенное сокращение:
21-GEN-2019
Преимущество заключается в том, что код очень хорошо подходит для интернационализации: вам просто нужно изменить локаль, чтобы получить правильный код для какого-либо другого языка и страны. Если вам нужно 21/01/2019
(с четырьмя цифрами года), укажите формат явно, используя шаблон:
DateTimeFormatter italianDateFormatter
= DateTimeFormatter.ofPattern("dd/MM/uuuu");
21/01/2019
Что не так с использованием XMLGregorianCalendar
?
Когда вы звоните System.out.println(xmlDate)
Вы неявно звоните toString
на ваше XMLGregorianCalendar
, Когда у него нет времени и смещения зоны, toString
всегда генерирует yyyy-MM-dd
формат, нет способа, которым вы можете изменить это. С другой стороны, вы можете иметь любой формат, который вам нравится в String
, Следующим препятствием является отсутствие средства форматирования, способного XMLGregorianCalendar
непосредственно. Вам нужно будет преобразовать в другой тип, например, ZonedDateTime
Например, сначала. Поскольку вам нужна только дата, ни время суток, ни часовой пояс, проще начать с LocalDate
с самого начала. Не в последнюю очередь для тех, кто читает и поддерживает ваш код после вас.
Ваш вопрос упоминает java.util.Date
и ваш код использует GregorianCalendar
тоже. Оба эти класса плохо спроектированы и давно устарели, полностью заменены на java.time, современный Java-интерфейс даты и времени. Поэтому я предлагаю вам не использовать их.
Ссылка на сайт
Учебное пособие по Oracle: Date Time, объясняющее, как использовать java.time, современный Java-интерфейс даты и времени.