Установить значение XMLGregorianCalendar из календарной даты в Java - PullRequest
0 голосов
/ 01 апреля 2019

Каков наилучший способ установить значение XMLGregorianCalendar из календарной даты?

    posting.setXMLGregorianCalendar(message.getCreateDate());

вот мой класс:

Message.java

private Calendar createDate;
public Calendar getCreateDate() {
    return createDate;
}

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Вы можете попробовать это:

Calendar createDate = Calendar.getInstance();
Date cDate = createDate.getTime();
GregorianCalendar c = new GregorianCalendar();
c.setTime(cDate);
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
0 голосов
/ 01 апреля 2019

ТЛ; др

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 вверху.

enter image description here

...