Научитесь форматировать экземпляр XMLGregorianCalendar в строку с несколькими шаблонами, например, «MM/dd/yyyy hh:mm a z», используя классы DateTimeFormatter и SimpleDateFormat в Java.
1. SimpleDateFormat против DateTimeFormatter
До Java 8 стандартным подходом Java для дат и времени были классы Date и Calendar, а стандартным подходом для анализа и форматирования дат были DateFormat и SimpleDateFormat.
В Java 8 предпочтительные классы даты/времени находятся в пакете java.time, например, LocalDate, LocalDateTime и ZonedDateTime.
Аналогично предпочтительные классы форматирования/анализа даты/времени больше не входят в пакет java.text, а вместо этого поступают из пакета java.time.format.
Помимо способа использования этих классов и методов в них, наиболее заметное различие заключается в поведении в параллельных приложениях.
- SimpleDateFormat НЕ является потокобезопасным.
- DateTimeFormatter является потокобезопасным.
Поэтому всегда есть веская причина использовать DateTimeFormatter вместо SimpleDateFormat.
2. DateTimeFormatter(рекомендуется)
Лучший способ форматирования, начиная с Java 8, — это преобразование экземпляра календаря в ZonedDateTime, а затем использование DateTimeFormatter для его форматирования. Отличная поддержка часовых поясов и смещений в ZonedDateTime будет полезна при работе с несколькими локалями.
Если нам не нужна информация о локали, то мы можем просто преобразовать ZonedDateTime в LocalDateTime или LocalDate и распечатать локализованные форматированные выходные данные.
Программа Java для форматирования XMLGregorianCalendar с использованием DateTimeFormatter.
import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZonedDateTime;import java.time.format.DateTimeFormatter;import java.util.Date;import java.util.GregorianCalendar;import javax.xml.datatype.DatatypeConfigurationException;import javax.xml.datatype.DatatypeFactory;import javax.xml.datatype.XMLGregorianCalendar;public class Main{private final static String TIMESTAMP_PATTERN= "MM/dd/yyyy hh:mm a z";private final static DateTimeFormatter DATE_TIME_FORMATTER= DateTimeFormatter.ofPattern(TIMESTAMP_PATTERN);public static void main(String[] args)throws DatatypeConfigurationException{GregorianCalendar cal = new GregorianCalendar();cal.setTime(new Date());XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);//1. Convert XMLGregorianCalendar to ZonedDateTime in default timezoneZonedDateTime zdt = xgc.toGregorianCalendar().toZonedDateTime();System.out.println( DATE_TIME_FORMATTER.format(zdt) );//2. Convert XMLGregorianCalendar to ZonedDateTime in UTCZonedDateTime zdtUTC = zdt.withZoneSameInstant(ZoneId.of("UTC"));System.out.println( DATE_TIME_FORMATTER.format(zdtUTC) );}}
Вывод программы.
08/23/2019 01:53 PM GMT+05:3008/23/2019 08:23 AM UTC
3. Формат XMLGregorianCalendar с SimpleDateFormat
В коде ниже мы создаем экземпляр XMLGregorianCalendar с текущим объектом Date. Затем мы форматируем его в String с помощью SimpleDateFormat.
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/18/2022 12:08 am IST
Мы можем использовать приведенный выше код для форматирования экземпляра XMLGregorianCalendar в строку в любом шаблоне по нашему выбору.
Приятного обучения!!