Разве нет удобного способа получить из java.util.Date XMLGregorianCalendar?
java
xml
date
xmlgregoriancalendar
макинтош
источник
источник
ZonedDateTime
Класс и новые методы преобразования, добавленные в устаревшие классы. Подробности в этом ответе Оле В.В.Ответы:
Я хотел бы сделать шаг назад и по-современному взглянуть на этот 10-летний вопрос. Классы, упомянутые,
Date
иXMLGregorianCalendar
, теперь стары. Я оспариваю их использование и предлагаю альтернативы.Date
был всегда плохо спроектирован и ему более 20 лет. Это просто: не используйте его.XMLGregorianCalendar
тоже стар и имеет старомодный дизайн. Насколько я понимаю, он использовался для создания даты и времени в формате XML для документов XML. Нравится2009-05-07T19:05:45.678+02:00
или2009-05-07T17:05:45.678Z
. Эти форматы достаточно хорошо согласуются с ISO 8601, что классы java.time, современного Java-API даты и времени, могут создавать их, что мы предпочитаем.Нет необходимости в преобразовании
Для многих (большинства?) Целей современная замена
Date
будетInstant
. AnInstant
является моментом времени (так же, какDate
есть).Пример вывода из этого фрагмента:
Это так же, как последний из моих примеров
XMLGregorianCalendar
строк выше. Как большинство из вас знает, это происходит из-за того,Instant.toString
что вас неявно вызываютSystem.out.println
. С java.time, во многих случаях мы не нужны преобразования , которые в старые времена мы сделали междуDate
,Calendar
,XMLGregorianCalendar
и другие классы (в некоторых случаях мы делаем преобразование нужно, хотя, я показываю вам пару в следующем разделе) ,Управление смещением
Ни у,
Date
ни уInstant
нет часового пояса, ни смещения UTC. Ранее принятый и все еще получивший наибольшее количество голосов ответ Бен Ноланда использует текущий часовой пояс по умолчанию для JVM для выбора смещенияXMLGregorianCalendar
. Чтобы включить смещение в современном объекте, мы используемOffsetDateTime
. Например:Опять же, это соответствует формату XML. Если вы хотите снова использовать текущий часовой пояс JVM, установите
zone
наZoneId.systemDefault()
.Что, если мне абсолютно необходим XMLGregorianCalendar?
Есть больше способов конвертировать
Instant
вXMLGregorianCalendar
. Я представлю пару, каждая со своими плюсами и минусами. Во-первых, подобно тому, как aXMLGregorianCalendar
создает строку типа2009-05-07T17:05:45.678Z
, она также может быть построена из такой строки:Pro: это коротко, и я не думаю, что это преподносит какие-либо сюрпризы. Con: Для меня это похоже на пустую трата времени, форматируя момент в строку и анализируя его обратно.
Pro: Это официальное преобразование. Управление смещением происходит естественно. Против: он проходит больше шагов и, следовательно, дольше.
Что если у нас будет свидание?
Если вы получили устаревший
Date
объект из унаследованного API, который вы не можете сейчас изменить, преобразуйте его вInstant
:Вывод такой же, как и раньше:
Если вы хотите управлять смещением, преобразуйте далее в a так
OffsetDateTime
же, как описано выше.Если у вас есть старомодный
Date
и абсолютно необходимо старомодныйXMLGregorianCalendar
, просто воспользуйтесь ответом Бена Ноланда.связи
источник
источник
Для тех, кто может оказаться здесь, ища обратное преобразование (из
XMLGregorianCalendar
вDate
):источник
Вот метод для преобразования из GregorianCalendar в XMLGregorianCalendar; Я оставлю часть преобразования из java.util.Date в GregorianCalendar в качестве упражнения для вас:
РЕДАКТИРОВАТЬ: Slooow :-)
источник
Пример из одной строки с использованием библиотеки Joda-Time :
Кредит Николас Mommaerts из его комментария в общепринятом ответ .
источник
Просто подумал, что добавлю свое решение ниже, так как ответы выше не соответствуют моим точным потребностям. Моя XML-схема требует отдельных элементов Date и Time, а не отдельного поля DateTime. Стандартный конструктор XMLGregorianCalendar, использованный выше, будет генерировать поле DateTime
Обратите внимание на пару готок, таких как добавление одного к месяцу (поскольку java считает месяцы с 0).
источник
Я надеюсь, что моя кодировка здесь правильна; D Чтобы сделать это быстрее, просто используйте уродливый вызов GetInstance () из GregorianCalendar вместо вызова конструктора:
источник
GregorianCalendar.getInstance()
является эквивалентомCalendar.getInstance()
. ОнCalendar.getInstance()
не может сделать это быстрее, потому что он использует то же самоеnew GregorianCalendar()
, но прежде чем он также проверяет локаль по умолчанию и может вместо этого создать японский или буддийский календарь, так что для некоторых счастливчиков это будетClassCastException
!Предполагая, что вы декодируете или кодируете xml и используете
JAXB
, тогда можно полностью заменить привязку dateTime и использовать что-то другое, кроме XMLGregorianCalendar для каждой даты в схеме.Таким образом, вы можете
JAXB
делать повторяющиеся вещи, в то время как вы можете тратить время на написание потрясающего кода, который приносит ценность.Пример для jodatime
DateTime
: (Делать это с java.util.Date также будет работать - но с некоторыми ограничениями. Я предпочитаю jodatime, и он скопирован из моего кода, так что я знаю, что он работает ...)И конвертер:
Смотрите здесь: как заменить XmlGregorianCalendar на Date?
Если вы счастливы просто отобразить момент, основанный на временной зоне + временная метка, и исходная временная зона не очень актуальна, то
java.util.Date
, вероятно, тоже хорошо.источник
Проверьте этот код: -
Вы можете увидеть полный пример здесь
источник