Tengo DateTime en este formato '2020-11-08T13:05:46.000-07:00' y trato de configurar lo mismo en XMLGregorianCalendar . se convierte automáticamente a 2020-11-08T20:05:46.000+0000 .
De todos modos para guardarlo como UTC?
OffsetDateTime .parse( "2020-11-08T13:05:46.000-07:00" ) .toInstant() XMLGregorianCalendar es una clase heredada, reemplazada hace años por ZonedDateTime .
Su entrada no tiene zona horaria, solo un desplazamiento de UTC. Así que analice esa cadena como OffsetDateTime .
OffsetDateTime odt = OffsetDateTime.parse( "2020-11-08T13:05:46.000-07:00" ) ; La forma más fácil de ajustarse a UTC (un desplazamiento de cero horas-minutos-segundos) es extraer un Instant .
Instant instant = odt.toInstant() ;Puedes hacerlo de la siguiente manera:
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 { String givenDateTimeString = "2020-11-08T13:05:46.000-07:00"; XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance() .newXMLGregorianCalendar(givenDateTimeString); System.out.println(xmlGregorianCalendar); } }Producción:
2020-11-08T13:05:46.000-07:00Sin embargo, le sugiero que cambie a la API de fecha y hora moderna .
Usando la API moderna de fecha y hora:
import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.Locale; public class Main { public static void main(String[] args) { String givenDateTimeString = "2020-11-08T13:05:46.000-07:00"; OffsetDateTime odt = OffsetDateTime.parse(givenDateTimeString); // Default format ie OffsetDateTime#toString System.out.println(odt); // Custom format System.out.println(odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH))); // Convert it to date-time at UTC OffsetDateTime odtUTC = odt.withOffsetSameInstant(ZoneOffset.UTC); System.out.println(odtUTC); System.out.println(odtUTC.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX", Locale.ENGLISH))); } }Producción:
2020-11-08T13:05:46-07:00 2020-11-08T13:05:46.000-07:00 2020-11-08T20:05:46Z 2020-11-08T20:05:46.000ZObtenga más información sobre la API de fecha y hora moderna en Trail: Date Time .