util localdatetime instant example java java-8 utc java-time

instant - localdatetime java example



Convierta LocalDateTime a LocalDateTime en UTC (9)

Convierta LocalDateTime a LocalDateTime en UTC.

LocalDateTime convertToUtc(LocalDateTime date) { //do conversion }

Busqué por la red. Pero no obtuve una solución


¿Pregunta?

Mirando las respuestas y la pregunta, parece que la pregunta se ha modificado significativamente. Entonces, para responder la pregunta actual:

Convierta LocalDateTime a LocalDateTime en UTC.

¿Zona horaria?

LocalDateTime no almacena ninguna información sobre la zona horaria, simplemente contiene los valores de año, mes, día, hora, minuto, segundo y unidades más pequeñas. Entonces, una pregunta importante es: ¿Cuál es la zona horaria del LocalDateTime original? Ya podría ser UTC, por lo tanto, no se debe realizar ninguna conversión.

Zona horaria predeterminada del sistema

Teniendo en cuenta que hizo la pregunta de todos modos, probablemente quiso decir que la hora original está en la zona horaria predeterminada del sistema y desea convertirla a UTC. Porque generalmente se LocalDateTime un objeto LocalDateTime utilizando LocalDateTime.now() que devuelve la hora actual en la zona horaria predeterminada del sistema. En este caso, la conversión sería la siguiente:

LocalDateTime convertToUtc(LocalDateTime time) { return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime(); }

Un ejemplo del proceso de conversión:

2019-02-25 11:39 // [time] original LocalDateTime without a timezone 2019-02-25 11:39 GMT+1 // [atZone] converted to ZonedDateTime (system timezone is Madrid) 2019-02-25 10:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime 2019-02-25 10:39 // [toLocalDateTime] losing the timezone information

Zona horaria explícita

En cualquier otro caso, cuando especifique explícitamente la zona horaria del tiempo para convertir, la conversión sería la siguiente:

LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) { return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime(); }

Un ejemplo del proceso de conversión:

2019-02-25 11:39 // [time] original LocalDateTime without a timezone 2019-02-25 11:39 GMT+2 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn) 2019-02-25 09:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime 2019-02-25 09:39 // [toLocalDateTime] losing the timezone information

El atZone()

El resultado del método atZone() depende del tiempo pasado como argumento, ya que considera todas las reglas de la zona horaria, incluido el horario de verano (DST). En los ejemplos, el tiempo era el 25 de febrero, en Europa esto significa horario de invierno (sin horario de verano).

Si tuviéramos que usar una fecha diferente, digamos el 25 de agosto del año pasado, el resultado sería diferente, considerando el horario de verano:

2018-08-25 11:39 // [time] original LocalDateTime without a timezone 2018-08-25 11:39 GMT+3 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn) 2018-08-25 08:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime 2018-08-25 08:39 // [toLocalDateTime] losing the timezone information

El horario GMT no cambia. Por lo tanto, las compensaciones en las otras zonas horarias se ajustan. En este ejemplo, el horario de verano de Estonia es GMT + 3 y el horario de invierno GMT + 2.

Además, si especifica un tiempo dentro de la transición de cambio de relojes de una hora. Por ejemplo, 28 de octubre de 2018 03:30 para Estonia, esto puede significar dos momentos diferentes:

2018-10-28 03:30 GMT+3 // summer time [UTC 2018-10-28 00:30] 2018-10-28 04:00 GMT+3 // clocks are turned back 1 hour [UTC 2018-10-28 01:00] 2018-10-28 03:00 GMT+2 // same as above [UTC 2018-10-28 01:00] 2018-10-28 03:30 GMT+2 // winter time [UTC 2018-10-28 01:30]

Sin especificar el desplazamiento manualmente (GMT + 2 o GMT + 3), la hora 03:30 para la zona horaria Europe/Tallinn puede significar dos horas UTC diferentes y dos compensaciones diferentes.

Resumen

Como puede ver, el resultado final depende de la zona horaria del tiempo pasado como argumento. Debido a que la zona horaria no se puede extraer del objeto LocalDateTime , debe saber de qué zona horaria proviene para convertirla a UTC.


Aquí hay una pequeña clase de utilidad simple que puede usar para convertir horas de fecha locales de zona a zona, incluido un método de utilidad directamente para convertir una hora de fecha local de la zona actual a UTC (con el método principal para que pueda ejecutarlo y ver los resultados de una prueba simple):

import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; public final class DateTimeUtil { private DateTimeUtil() { super(); } public static void main(final String... args) { final LocalDateTime now = LocalDateTime.now(); final LocalDateTime utc = DateTimeUtil.toUtc(now); System.out.println("Now: " + now); System.out.println("UTC: " + utc); } public static LocalDateTime toZone(final LocalDateTime time, final ZoneId fromZone, final ZoneId toZone) { final ZonedDateTime zonedtime = time.atZone(fromZone); final ZonedDateTime converted = zonedtime.withZoneSameInstant(toZone); return converted.toLocalDateTime(); } public static LocalDateTime toZone(final LocalDateTime time, final ZoneId toZone) { return DateTimeUtil.toZone(time, ZoneId.systemDefault(), toZone); } public static LocalDateTime toUtc(final LocalDateTime time, final ZoneId fromZone) { return DateTimeUtil.toZone(time, fromZone, ZoneOffset.UTC); } public static LocalDateTime toUtc(final LocalDateTime time) { return DateTimeUtil.toUtc(time, ZoneId.systemDefault()); } }


Hay una forma aún más simple

LocalDateTime.now(Clock.systemUTC())


LocalDateTime no contiene información de zona. ZonedDatetime lo hace.

Si desea convertir LocalDateTime a UTC, debe ajustar el puño ZonedDateTime.

Puedes convertir como a continuación.

LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt.toLocalTime()); ZonedDateTime ldtZoned = ldt.atZone(ZoneId.systemDefault()); ZonedDateTime utcZoned = ldtZoned.withZoneSameInstant(ZoneId.of("UTC")); System.out.println(utcZoned.toLocalTime());


Usa el siguiente. Toma la fecha y hora local y la convierte a UTC usando la zona horaria. No necesita crear su función.

ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC); System.out.println(nowUTC.toString());

Si necesita obtener la parte LocalDateTime de ZonedDateTime, puede usar lo siguiente.

nowUTC.toLocalDateTime();

Aquí hay un método estático que uso en mi aplicación para insertar la hora UTC en mysql ya que no puedo agregar un valor predeterminado UTC_TIMESTAMP a una columna de fecha y hora.

public static LocalDateTime getLocalDateTimeInUTC(){ ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC); return nowUTC.toLocalDateTime(); }


Yo personalmente prefiero

LocalDateTime.now(ZoneOffset.UTC);

ya que es la opción más legible.


puedes implementar un ayudante haciendo algo así:

public static LocalDateTime convertUTCFRtoUTCZ(LocalDateTime dateTime) { ZoneId fr = ZoneId.of("Europe/Paris"); ZoneId utcZ = ZoneId.of("Z"); ZonedDateTime frZonedTime = ZonedDateTime.of(dateTime, fr); ZonedDateTime utcZonedTime = frZonedTime.withZoneSameInstant(utcZ); return utcZonedTime.toLocalDateTime(); }


tldr: simplemente no hay forma de hacerlo; si está tratando de hacer eso, obtiene LocalDateTime incorrecto.

La razón es que LocalDateTime no registra la zona horaria después de que se crean las instancias. No puede convertir una fecha y hora sin zona horaria a otra fecha y hora basada en una zona horaria específica.

De hecho, nunca se debe llamar a LocalDateTime.now () en el código de producción a menos que su propósito sea obtener resultados aleatorios. Cuando construye una instancia de LocalDateTime como esa, esta instancia contiene fecha y hora SOLAMENTE en función de la zona horaria del servidor actual, lo que significa que este código generará un resultado diferente si está ejecutando un servidor con una configuración de zona horaria diferente.

LocalDateTime puede simplificar el cálculo de la fecha. Si desea un tiempo real de datos universalmente utilizable, use ZonedDateTime o OffsetDateTime: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html .


public static String convertFromGmtToLocal(String gmtDtStr, String dtFormat, TimeZone lclTimeZone) throws Exception{ if (gmtDtStr == null || gmtDtStr.trim().equals("")) return null; SimpleDateFormat format = new SimpleDateFormat(dtFormat); format.setTimeZone(getGMTTimeZone()); Date dt = format.parse(gmtDtStr); format.setTimeZone(lclTimeZone); return

formato.formato (dt); }