Solución:
¿Cómo puedo convertirlo a LocalDateTime en la zona horaria de Suiza?
Puede convertir la UTC ZonedDateTime
en un ZonedDateTime
con la zona horaria de Suiza, pero manteniendo el mismo instante en el tiempo, y luego obtener el LocalDateTime
fuera de eso, si es necesario. Me sentiría tentado a mantenerlo como ZonedDateTime
a menos que lo necesite como LocalDateTime
aunque por alguna otra razón.
ZonedDateTime utcZoned = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
ZoneId swissZone = ZoneId.of("Europe/Zurich");
ZonedDateTime swissZoned = utcZoned.withZoneSameInstant(swissZone);
LocalDateTime swissLocal = swissZoned.toLocalDateTime();
Ayuda a comprender la diferencia entre LocalDateTime y ZonedDateTime. Lo que realmente quieres es un ZonedDateTime
. Si quisiera eliminar la zona horaria de la representación de la cadena, la convertiría en una LocalDateTime
.
Lo que busca es:
ZonedDateTime swissZonedDateTime = withZoneSameInstant(ZoneId.of("Europe/Zurich"));
LocalDateTime – esta es básicamente una representación de cadena glorificada de un Date
y Time
; es independiente de la zona horaria, lo que significa que no representa ningún punto en el tiempo en una línea de tiempo
Instante – esta es una representación en milisegundos del tiempo transcurrido desde EPOCH. Esto representa un instante específico en el tiempo en una línea de tiempo.
ZonedDateTime – esto también representa un instante en el tiempo en una línea de tiempo, pero lo representa como un Date
y Time
con un TimeZone
.
El siguiente código ilustra cómo usar los 3.
LocalDateTime localDateTime = LocalDateTime.of(2018, 10, 25, 12, 00, 00); //October 25th at 12:00pm
ZonedDateTime zonedDateTimeInUTC = localDateTime.atZone(ZoneId.of("UTC"));
ZonedDateTime zonedDateTimeInEST = zonedDateTimeInUTC.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(localDateTime.toString()); // 018-10-25T12:00
System.out.println(zonedDateTimeInUTC.toString()); // 2018-10-25T12:00Z[UTC]
System.out.println(zonedDateTimeInEST.toString()); // 2018-10-25T08:00-04:00[America/New_York]
Si tuvieras que comparar el Instant
valores de ambos ZonedDateTimes
desde arriba, serían equivalentes porque ambos apuntan al mismo instante en el tiempo. En algún lugar de Greenwich (zona horaria UTC), es mediodía del 25 de octubre; al mismo tiempo, en Nueva York, serían las 8 am (zona horaria de América / Nueva York).
Probar esto. Sustituya US / Central por su zona horaria.
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
System.out.println(z.withZoneSameInstant(ZoneId.of("US/Central")));