Формат 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-интерфейс даты и времени.

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