Требуется XMLGregorianCalendar в формате времени c | Java - PullRequest
0 голосов
/ 06 мая 2020
public static XMLGregorianCalendar getXMLEventTime(ZonedDateTime zonedDateTime) {
        XMLGregorianCalendar xmlGregorianCalendar = null;

            if(zonedDateTime!=null) {

                GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
                gregorianCalendar.setTime(getDateFromZonedDateTime(zonedDateTime));
                xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
            }


        return xmlGregorianCalendar;
    }

Я хочу выводить данные в формате «2020-05-06T16: 58: 38.517 + 00: 00», но получил этот «2020-05-06T16: 58: 38.517Z» в качестве моего сервера в UT C.

Когда я запускаю приложение в своем локальном (часовом поясе IST), я получил правильный вывод «2020-05-06T16: 58: 38.517 + 05: 30», но он не работает в UT C часовой пояс

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Вы не можете. Вы тоже не должны этого хотеть. Как сказал Андреас в комментарии, XMLGregorianCalendar с UT C смещением 0 обязательно печатает с Z, а не +00:00.

Предложения:

  1. Перестаньте беспокоиться. Передайте свой XMLGregorianCalendar туда, где он вам нужен, и я уверен, что все будет в порядке.
  2. Позвольте себе вдохновиться наблюдением, что он отлично работает с вашим местным часовым поясом. Просто выберите ненулевое смещение из UT C, и вы получите желаемый формат. Например:

        ZonedDateTime zonedDateTime = ZonedDateTime
                .of(2020, 5, 6, 16, 58, 58, 517_000_000, ZoneId.of("Etc/UTC"));
        zonedDateTime = zonedDateTime.withZoneSameInstant(ZoneOffset.ofHours(1));
        GregorianCalendar gregorianCalendar = GregorianCalendar.from(zonedDateTime);
        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
                .newXMLGregorianCalendar(gregorianCalendar);
    
        System.out.println(xmlGregorianCalendar);
    

    Вывод:

    2020-05-06T17: 58: 58.517 + 01: 00

  3. Как предлагает Андреас в комментарии, используйте пользовательский DateTimeFormatter, чтобы получить строку (не XMLGregorianCalendar) в желаемом формате:

        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                .appendPattern("xxx")
                .toFormatter();
        String formattedDateTime = zonedDateTime.format(formatter);
    
        System.out.println(formattedDateTime);
    

    2020-05-06T16: 58: 58.517 + 00: 00

1 голос
/ 08 мая 2020

Я внес изменения в объект XML.

@XmlSchemaType(name = "dateTime")
@XmlJavaTypeAdapter(DateTimeAdapter.class)
protected XMLGregorianCalendar eventTime;

получил ожидаемый результат.

Я использовал XSD для передачи сообщений (XML). после добавления выше DateTimeAdapter «2020-05-06T16: 58: 38.517Z» преобразован в «2020-05-06T16: 58: 38.517 + 00.00» Ссылка: Пример формата даты JAXB с использованием аннотации | Java Дата в XML Преобразование строки DateTime

...