Hola, quiero convertir el valor de cadena 2020-12-16T19:20:30+01:00 UTC a LocalDateTime o ZonedDateTime en Java
Intenté la solución:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DDThh:mm:ssTZD", Locale.ENGLISH); final String responseTimeStamp = "2020-12-16T19:20:30+01:00 UTC"; ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf);que me da el error
Excepción en el subproceso "principal" java.lang.IllegalArgumentException: letra de patrón desconocida: T en java.base/java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1815) en java.base/java.time.format.DateTimeFormatterBuilder .appendPattern(DateTimeFormatterBuilder.java:1712) en java.base/java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:588) en learning/learning.SpringDemo.main(SpringDemo.java:21)
Hay algunas cosas mal con su código. Le sugiero que eche un vistazo a la documentación de DateTimeFormatter.
Entonces, su patrón final debería ser "yyyy-MM-dd'T'HH:mm:ssO" . No funciona para UTC y no pude encontrarlo en la lista ZoneId, tal vez porque UTC ya es +00:00 , por lo que UTC+01:00 es igual a +01:00 .
Después de mucho trabajo para comprender el patrón, descubrí que está buscando ISO_ZONED_DATE_TIME , por lo que podría cambiar su código como se muestra a continuación:
DateTimeFormatter dtf = DateTimeFormatter.ISO_ZONED_DATE_TIME; final String responseTimeStamp = "2020-12-16T19:20:30+01:00"; ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf); OffsetDateTime .parse( "2020-12-16T19:20:30+01:00 UTC" .replace( " UTC" , "" ) ) .withZoneSameInstant( ZoneId.of( "America/Edmonton" ) )Su cadena de entrada:
2020-12-16T19:20:30+01:00 UTC
… casi cumple con el estándar ISO 8601 para formatos de fecha y hora de intercambio de datos. Para cumplir plenamente, elimine el ESPACIO y el UTC del final. El +01:00 al final significa "una hora por delante de UTC", por lo que el UTC al final es redundante.
Entrada de cadena = "2020-12-16T19:20:30+01:00 UTC".reemplazar ("UTC", "");
Analice como un OffsetDateTime porque su entrada indica un pequeño desplazamiento de UTC, no una zona horaria.
Un desplazamiento es simplemente un número de horas, minutos y segundos por delante o por detrás del meridiano principal de UTC. Una zona horaria es mucho más. Una zona horaria es un historial de los cambios pasados, presentes y futuros en la compensación utilizada por la gente de una región en particular según lo decidido por sus políticos. Una zona horaria tiene un nombre en formato de Continent/Region , como Europe/Paris y Africa/Tunis .
OffsetDateTime Por lo tanto, la sugerencia de la otra Respuesta de usar ZonedDateTime para analizar es errónea ya que no se indica ninguna zona horaria. Su entrada solo tiene un desplazamiento, por lo tanto, use OffsetDateTime .
No es necesario especificar un patrón de formato. Nuestra entrada modificada cumple con ISO 8601, y las clases java.time usan esos formatos estándar de forma predeterminada al analizar/generar cadenas.
OffsetDateTime odt = OffsetDateTime.parse( input ) ;LocalDateTime Preguntaste cómo obtener un LocalDateTime . Esa clase carece de cualquier concepto de desplazamiento o zona horaria. Así que tenga cuidado, si convierte de OffsetDateTime , está descartando información valiosa.
Entonces, aunque no recomiendo hacer esto, aquí está el código.
LocalDateTime ldt = odt.toLocalDateTime() ;ZonedDateTimePreguntaste cómo ajustarte a una zona horaria.
Para ajustar desde nuestro desplazamiento a una zona horaria, simplemente especifique la zona horaria deseada.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ; ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;