дата изменилась при преобразовании из java.util.Date в javax.xml.datatype.XMLGregorianCalendar - PullRequest
0 голосов
/ 27 сентября 2018

Дата четверг 27 сентября 00:00:00 CEST 2018

становится

2018-09-26T22: 00: 00.000Z

при преобразовании в XMLGregorianCalendar

этим методом:

 public static XMLGregorianCalendar dateToXMLGregorianCalendar(Date date) throws DatatypeConfigurationException{
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(date);
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
}

Как можно избежать изменения этой даты?

Tnx

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Это вопрос с множеством возможных ответов в зависимости от ваших обстоятельств и точных требований.Я предполагаю, что вы запрашиваете XMLGregorianCalendar, потому что вы собираетесь использовать его в документе XML, где его метод toXMLFormat создает необходимый вам синтаксис.

Попробуйте, если LocalDate работает

    LocalDate ld = LocalDate.of(2018, Month.SEPTEMBER, 27);
    System.out.println(ld);

Это выводит:

2018-09-27

Если то, что вам нужно вставить в ваш XML-документ, это дата, а не дата и времяи смещение UTC, это было бы логичным решением.Выше приведен правильный формат даты в XML (проверьте ссылки внизу).Принимает ли получатель вашего XML-документа его, я не могу сказать.Я бы узнал, если бы это был я.

Метод в вашем вопросе принимает аргумент Date.Класс Date давно устарел и имеет проблемы с дизайном, поэтому избегайте его, если можете.Если вы не можете избежать этого, конвертируйте его в LocalDate следующим образом:

    ZoneId zone = ZoneId.of("Europe/Rome");
    LocalDate ld = date.toInstant().atZone(zone).toLocalDate();

Пожалуйста, используйте желаемый часовой пояс, в котором я поместил Европу / Рим, поскольку во всех часовых поясах эта дата никогда не бывает одинаковой.Правильный часовой пояс определяет, будет ли вы получать 26 или 27 сентября.

Использовать OffsetDateTime

    ZoneId zone = ZoneId.of("Europe/Rome");
    OffsetDateTime odt = LocalDate.of(2018, Month.SEPTEMBER, 27)
                            .atStartOfDay(zone)
                            .toOffsetDateTime();
    System.out.println(odt);

2018-09-27T00: 00 + 02: 00

Это почти тот же синтаксис, который вы также получаете от XMLGregorianCalendar (XMLGregorianCalendar может также произвести его, если хотите).Секунды и миллисекунды не включены.Опять же, проверьте, все ли в порядке.Если это не так, отформатируйте OffsetDateTime в String для своего XML:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
    String dateTimeString = odt.format(formatter);
    System.out.println(dateTimeString);

2018-09-27T00: 00: 00.000 + 02: 00

Это точно соответствует синтаксису, который вы получили от XMLGregorianCalendar в вашем вопросе, только дата и время не были изменены.Опять же, если вы не можете избежать старомодного Date, конвертируйте:

    OffsetDateTime odt = date.toInstant().atZone(zone).toOffsetDateTime();

Если вам нужен XMLGregorianCalendar

    ZoneId zone = ZoneId.of("Europe/Rome");
    ZonedDateTime zdt = date.toInstant().atZone(zone);
    GregorianCalendar cal = GregorianCalendar.from(zdt);
    XMLGregorianCalendar xmlgcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
    System.out.println(xmlgcal);

2018-09-27T00: 00: 00.000 + 02: 00

Спецификация часового пояса управляет смещением, а также датой и временем.

Ссылки

0 голосов
/ 27 сентября 2018

Это та же дата и время.

Ваша первая дата находится в часовом поясе CEST, что эквивалентно UTC + 2 Ваша вторая временная метка отображается в часовом поясе Z, что эквивалентно UTC + 0

Таким образом, оба означают один и тот же момент времени, но просто визуализируют по-разному.

GregorianCalendar имеет метод для изменения часового пояса календарей, если вы хотите выводить данные в дате и времени CEST, тогда я предлагаю вам изменитькалендарный часовой пояс к этому.См. GregorianCalendar.setTimeZone для справки по API.

Это также зависит от того, как вы извлекаете дату из этого календаря.Если вы просто планируете использовать метод .getTime(), который возвращает простой объект Java Date, то вы можете отправить его через DateTimeFormatter , чтобы вывести дату в любом часовом поясе.

ЕслиВы заботитесь только о фактической части даты «date» и не хотите адаптировать ее к различным часовым поясам, вместо этого посмотрите LocalDate .

...