valor - Java 8 Convierte la hora y zona horaria a la hora UTC
zonas horarias del mundo (3)
Tengo un tiempo con el tipo de cadena como: "2015-01-05 17:00"
y ZoneId
es "Australia/Sydney"
.
¿Cómo puedo convertir esta información de tiempo a la hora UTC correspondiente utilizando la API de Java 8 datetime?
También hay que tener en cuenta las cosas DST.
Está buscando la clase ZonedDateTime
en Java8: una fecha y hora completa con zona horaria y desplazamiento resuelto de UTC / Greenwich. En términos de diseño, esta clase debe verse principalmente como la combinación de un LocalDateTime
y un ZoneId
. ZoneOffset
es una pieza de información vital, pero secundaria, que se utiliza para garantizar que la clase represente un instante, especialmente durante la superposición del horario de verano.
Por ejemplo:
ZoneId australia = ZoneId.of("Australia/Sydney");
String str = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia );
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney);
ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC);
System.out.println("Current date and time in UTC : " + utcDate);
Una alternativa a la respuesta existente es configurar el formateador con la zona horaria adecuada:
String input = "2015-01-05 17:00";
ZoneId zone = ZoneId.of("Australia/Sydney");
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC);
Como desea interactuar con una base de datos, puede necesitar un java.sql.Timestamp
, en cuyo caso no necesita convertir explícitamente a una hora UTC, sino que puede usar un Instant en su lugar:
ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());
**// Refactored Logic**
ZoneId australia = ZoneId.of("Australia/Sydney");
ZoneId utcZoneID= ZoneId.of("Etc/UTC");
String ausTime = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
//converting in datetime of java8
LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter);
// DateTime With Zone
ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID);
// output - 2015-01-05T17:00Z[Etc/UTC]
// With Formating DateTime
String utcDateTime = utcDateAndTime.format(formatter);
// output - 2015-01-05 17:00