- Java XMLGregorianCalendar
- “LocalDateTime to XMLGregorianCalendar” Code Answer
- Преобразование между локальной датой и XMLGregorianCalendar
- 2. XMLGregorianCalendar
- 3. Местная Дата
- 4. Из LocalDate в XMLGregorianCalendar
- 5. От XMLGregorianCalendar до локальной даты
- 6. Заключение
- Saved searches
- Use saved searches to filter your results more quickly
- Support for conversion between java.time.LocalDateTime and javax.xml.datatype.XMLGregorianCalendar #1791
- Support for conversion between java.time.LocalDateTime and javax.xml.datatype.XMLGregorianCalendar #1791
- Comments
Java XMLGregorianCalendar
Learn to convert XMLGregorianCalendar to Date class and format to string. Also, learn to apply timezone changes and daylight saving effects as well. This class is a representation of the W3C XML Schema 1.0 date/time datatypes that defines clear rules for specifying dates in XML format.
1. Creating XMLGregorianCalendar
Using the constructor of XMLGregorianCalendar is not recommended and docs suggest using the DataTypeFactory to create its instance.
//Create XMLGregorianCalendar GregorianCalendar cal = new GregorianCalendar(); cal.setTime(new Date()); XMLGregorianCalendar xCal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(cal);
2. Converting XMLGregorianCalendar to Date
The GregorianCalendar.getTime() method returns the java.util.Date object.
XMLGregorianCalendar xCal = ..; //Create instance Date date = xCal.toGregorianCalendar().getTime(); System.out.println(date);
Thu Feb 17 23:29:25 IST 2022
3. Formatting XMLGregorianCalendar
The simplest way to format XMLGregorianCalendar is to first convert it to the Date object, and format the Date to String.
XMLGregorianCalendar xCal = ..; //Create instance Date date = xCal.toGregorianCalendar().getTime(); DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a z"); String formattedString = df.format(date); System.out.println(formattedString);
4. Formatting in Another Timezone
If you want to print the formatted date in another timezone, such as GMT , then we will need to set timezone is DateFormat instance.
XMLGregorianCalendar xCal = ..; //Create instance Date 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);
5. Handling Daylight Saving Time (DST) Effect
To check whether current time or adjusted time falls under DST (daylight saving time), then you might want to handle those changes as well.
This will be useful when we are converting a Date from one timezone to another timezone, and there may be DST effects on those timezones.
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; > >
“LocalDateTime to XMLGregorianCalendar” Code Answer
Here are some tips for finding solutions to java problems about “LocalDateTime to XMLGregorianCalendar” Code Answer. We are going to list out some java programming problem, you can find the solution for your programming question if you get stuck in coding. Getting stuck in programming is quite normal for all the developers. Most of the beginners and even experienced programmers take help from some resources but that doesn’t mean they are dumb or bad programmers. Below are some solution about “LocalDateTime to XMLGregorianCalendar” Code Answer.
LocalDateTime to XMLGregorianCalendar
LocalDateTime localDatetime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
String formattedDate = localDatetime.format(formatter);
XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(formattedDate);
Преобразование между локальной датой и XMLGregorianCalendar
В этом кратком руководстве мы обсудим Local Date и XMLGregorianCalendar и приведем примеры преобразования между этими двумя типами.
2. XMLGregorianCalendar
Стандарт схемы XML определяет четкие правила для указания дат в формате XML. Для использования этого формата класс Java XMLGregorianCalendar , представленный в Java 1.5, представляет собой представление типов данных W3C XML Schema 1.0 date | time|/.
3. Местная Дата
Экземпляр Local Data представляет дату без часового пояса в календарной системе ISO-8601. В результате Локальные данные , например, подходят для хранения дней рождения, но не для хранения чего-либо, связанного со временем. Java представила Локальную дату в версии 1.8.
4. Из LocalDate в XMLGregorianCalendar
Сначала мы посмотрим, как преобразовать Local Date в XMLGregorianCalendar . Для создания нового экземпляра XMLGregorianCalendar мы используем DataTypeFactory из пакета javax.xml.datatype|/.
Итак, давайте создадим экземпляр LocalDate и преобразуем его в XMLGregorianCalendar :
LocalDate localDate = LocalDate.of(2019, 4, 25); XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.toString()); assertThat(xmlGregorianCalendar.getYear()).isEqualTo(localDate.getYear()); assertThat(xmlGregorianCalendar.getMonth()).isEqualTo(localDate.getMonthValue()); assertThat(xmlGregorianCalendar.getDay()).isEqualTo(localDate.getDayOfMonth()); assertThat(xmlGregorianCalendar.getTimezone()).isEqualTo(DatatypeConstants.FIELD_UNDEFINED);
Как отмечалось ранее, экземпляр XMLGregorianCalendar имеет возможность иметь информацию о часовом поясе. Однако Local Date не содержит никакой информации о времени.
Поэтому, когда мы выполняем преобразование, значение часового пояса останется как FIELD_UNDEFINED .
5. От XMLGregorianCalendar до локальной даты
Аналогично, теперь мы увидим, как выполнить преобразование наоборот. Как оказалось, преобразование из XMLGregorianCalendar в Local Date намного проще.
Опять же, поскольку LocalDate не содержит информации о времени, экземпляр Local Data может содержать только подмножество информации XMLGregorianCalendar .
Давайте создадим экземпляр XMLGregorianCalendar и выполним преобразование:
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar("2019-04-25"); LocalDate localDate = LocalDate.of( xmlGregorianCalendar.getYear(), xmlGregorianCalendar.getMonth(), xmlGregorianCalendar.getDay()); assertThat(localDate.getYear()).isEqualTo(xmlGregorianCalendar.getYear()); assertThat(localDate.getMonthValue()).isEqualTo(xmlGregorianCalendar.getMonth()); assertThat(localDate.getDayOfMonth()).isEqualTo(xmlGregorianCalendar.getDay());
6. Заключение
В этом кратком руководстве мы рассмотрели преобразования между экземплярами LocalDate и XMLGregorianCalendar , и наоборот.
И, как всегда, пример кода доступен на GitHub .
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support for conversion between java.time.LocalDateTime and javax.xml.datatype.XMLGregorianCalendar #1791
Support for conversion between java.time.LocalDateTime and javax.xml.datatype.XMLGregorianCalendar #1791
Comments
When mapping LocalDate to XmlGregorianCalendar , timezone is set to DatatypeConstants.FIELD_UNDEFINED. But when converting LocalDateTime to XmlGregorianCalendar , the timezone is currently set to system default.
The text was updated successfully, but these errors were encountered:
@filiphr
The issue is reproed here — https://github.com/avmohan/mapstruct-issue-1791-sample
The generated code is below (for both LocalDate & LocalDateTime)
public class SourceTargetMapperImpl implements SourceTargetMapper < private final DatatypeFactory datatypeFactory; public SourceTargetMapperImpl() < try < datatypeFactory = DatatypeFactory.newInstance(); > catch ( DatatypeConfigurationException ex ) < throw new RuntimeException( ex ); > > @Override public Target mapSource(Source source) < if ( source == null ) < return null; > Target target = new Target(); if ( source.getLocalDateTime() != null ) < target.setLocalDateTime( dateToXmlGregorianCalendar( Date.from( source.getLocalDateTime().toInstant( ZoneOffset.UTC ) ) ) ); > target.setLocalDate( localDateToXmlGregorianCalendar( source.getLocalDate() ) ); return target; > private XMLGregorianCalendar dateToXmlGregorianCalendar( Date date ) < if ( date == null ) < return null; > GregorianCalendar c = new GregorianCalendar(); c.setTime( date ); return datatypeFactory.newXMLGregorianCalendar( c ); > private XMLGregorianCalendar localDateToXmlGregorianCalendar( LocalDate localDate ) < if ( localDate == null ) < return null; > return datatypeFactory.newXMLGregorianCalendarDate( localDate.getYear(), localDate.getMonthValue(), localDate.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED ); > >