Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

339
Visualizações
Convertir de String a LocalDateTime o ZonedDateTime

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)

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Hay algunas cosas mal con su código. Le sugiero que eche un vistazo a la documentación de DateTimeFormatter.

  1. AAAA -> Esto significa año basado en la semana, puede echar un vistazo aquí para ver la diferencia entre el año de la era. Entonces deberías estar usando yyyy .
  2. DD -> Esto significa día del año, por lo que el 16 de diciembre es igual a 350. En su caso, desea usar dd , día del mes.
  3. T -> No hay un patrón para T, por lo que puede ponerlo como un texto para formatear su fecha 'T'
  4. TZD -> No sé qué está tratando de usar aquí y no pude encontrar el patrón +03:00 UTC , puede intentar usar O

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);
over 4 years ago · Santiago Trujillo Relatório

0

tl; dr

 OffsetDateTime .parse( "2020-12-16T19:20:30+01:00 UTC" .replace( " UTC" , "" ) ) .withZoneSameInstant( ZoneId.of( "America/Edmonton" ) )

ISO 8601

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", "");

Desplazamiento frente a zona horaria

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() ;

ZonedDateTime

Preguntaste 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 ) ;
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda