Научитесь преобразовывать XMLGregorianCalendar в класс Date и форматировать в строку. Также научитесь применять изменения часового пояса и эффекты перехода на летнее время. Этот класс представляет собой представление типов данных даты/времени W3C XML Schema 1.0, который определяет четкие правила указания дат в формате XML.
1. Создание XMLGregorianCalendar
Использовать конструктор XMLGregorianCalendar не рекомендуется, и в документации предлагается использовать DataTypeFactory для создания его экземпляра.
//Create XMLGregorianCalendarGregorianCalendar cal = new GregorianCalendar();cal.setTime(new Date());XMLGregorianCalendar xCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
2. Преобразование XMLGregorianCalendar в дату
Метод GregorianCalendar.getTime() возвращает объект java.util.Date.
XMLGregorianCalendar xCal = ..; //Create instanceDate date = xCal.toGregorianCalendar().getTime();System.out.println(date);
Вывод программы.
Thu Feb 17 23:29:25 IST 2022
3. Форматирование XMLGregorianCalendar
Самый простой способ отформатировать XMLGregorianCalendar — сначала преобразовать его в объект Date, а затем отформатировать Date в строку.
XMLGregorianCalendar xCal = ..; //Create instanceDate date = xCal.toGregorianCalendar().getTime();DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a z");String formattedString = df.format(date);System.out.println(formattedString);
Вывод программы.
02/17/2022 11:34 pm IST
4. Форматирование в другом часовом поясе
Если вы хотите напечатать отформатированную дату в другом часовом поясе, например, GMT, то нам нужно будет задать часовой пояс в экземпляре DateFormat.
XMLGregorianCalendar xCal = ..; //Create instanceDate date = xCal.toGregorianCalendar().getTime();DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a z");df.setTimeZone(TimeZone.getTimeZone("GMT"));String formattedString = df.format(date);System.out.println(formattedString);
Вывод программы.
02/17/2022 06:13 pm GMT
5. Обработка эффекта летнего времени(DST)
Чтобы проверить, попадает ли текущее время или скорректированное время под действие летнего времени, вам, возможно, захочется обработать и эти изменения.
Это будет полезно при конвертации даты из одного часового пояса в другой, когда в этих часовых поясах может наблюдаться эффект летнего времени.
import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import java.util.TimeZone;import javax.xml.datatype.DatatypeConfigurationException;import javax.xml.datatype.DatatypeFactory;import javax.xml.datatype.XMLGregorianCalendar;public class Main {public static void main(String[] args) throws DatatypeConfigurationException {GregorianCalendar cal = new GregorianCalendar();cal.setTime(new Date());XMLGregorianCalendar xCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);System.out.println(convertXmlGregorianToString(xCal));}public static String convertXmlGregorianToString(XMLGregorianCalendar xc){TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");TimeZone fromTimeZone = TimeZone.getDefault();GregorianCalendar gCalendar = xc.toGregorianCalendar();DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a z");Date date = adjustToTimezone(gCalendar.getTime(), fromTimeZone, gmtTimeZone);String dateString = df.format(date);return dateString;}public static Date adjustToTimezone(Date date, TimeZone fromZone, TimeZone toZone){Date adjustedToTimezone = new Date(date.getTime() + toZone.getRawOffset() - fromZone.getRawOffset());// Is the adjusted date in Daylight savings?if(fromZone.inDaylightTime(adjustedToTimezone) != toZone.inDaylightTime(adjustedToTimezone)) {adjustedToTimezone = new Date(adjustedToTimezone.getTime() + toZone.getDSTSavings() - fromZone.getDSTSavings());}return adjustedToTimezone;}}
Вывод программы.
04/11/2017 07:08 AM IST