ТЛ; др
DatatypeFactory.newInstance().newXMLGregorianCalendar(
GregorianCalendar.from(
ZonedDateTime.now(
ZoneId.of( "Pacific/Auckland" )
)
)
)
Момент требует часовой пояс
Классы XMLGregorianCalendar
, GregorianCalendar
и Calendar
представляют момент, то есть дату, время день и назначенный часовой пояс. Будьте в курсе вопроса о часовом поясе. Если вам не удастся обратиться к зоне явно, текущий часовой пояс JVM по умолчанию будет назначен неявно.
Укажите собственное имя часового пояса в формате Continent/Region
, например America/Edmonton
, Africa/Tunis
или Europe/Moscow
. Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, поскольку мы точно не знаем, намеревались ли вы использовать значение по умолчанию или если вы, как и многие программисты, не знали о проблеме.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
java.time
Эти …Calendar
классы также ужасны . Sun, Oracle и сообщество JCP отказались от них много лет назад, приняв JSR 310 ... и вы тоже. Используйте только классы java.time для своей бизнес-логики.
ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Capture the current moment as seen through the wall-clock time used by the people of a particular region (a time zone).
Преобразование
Если вы взаимодействуете со старым кодом, который еще не обновлен до java.time , преобразуйте устаревшие классы в современные. Посмотрите на новые методы, добавленные к старым классам.
Объект ZonedDateTime
можно преобразовать в объект GregorianCalendar
(подкласс Calendar
), вызвав GregorianCalendar.from( ZonedDateTime )
.
GregorianCalendar gregCal = GregorianCalendar.from( zdt ) ;
A GregorianCalendar
можно преобразовать в XMLGregorianCalendar
, но нам нужно перейти на один дополнительный шаг. Сам класс XMLGregorianCalendar
не имеет метода преобразователя из GregorianCalendar
. Вспомогательный класс может выполнить задание, DatatypeFactory
, как показано в этого ответа от Стивен Коулборн, «JodaStephen» , изобретатель java.time .
XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar( gregCal );
Не то, чтобы я рекомендовал это, но вы можете объединить это в одну строку, как показано в разделе tl; dr вверху.