localdatetime - simpledateformat java 8 example
No se puede obtener ZonedDateTime de TemporalAccessor usando DateTimeFormatter y ZonedDateTime en Java 8 (5)
En palabras simples, la línea
ZonedDateTime.parse(''2014-04-23'', DateTimeFormatter.ISO_OFFSET_DATE_TIME)
lanza una excepción:
Text ''2014-04-23'' could not be parsed at index 10
java.time.format.DateTimeParseException: Text ''2014-04-23'' could not be parsed at index 10
Parece un error para mí.
Utilicé esta solución:
String dateAsStr = ''2014-04-23'';
if (dateAsStr.length() == 10) {
dateAsStr += ''T00:00:00'';
}
ZonedDateTime.parse(dateAsStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault()));
Recientemente me mudé a Java 8 para, con suerte, lidiar con tiempos locales y zonificados más fácilmente.
Sin embargo, estoy enfrentando un problema simple, en mi opinión, al analizar una fecha simple.
public static ZonedDateTime convertirAFecha(String fecha) throws Exception {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
ConstantesFechas.FORMATO_DIA).withZone(
obtenerZonaHorariaServidor());
ZonedDateTime resultado = ZonedDateTime.parse(fecha, formatter);
return resultado;
}
En mi caso:
- fecha es ''15 / 06/2014 ''
- ConstantesFechas.FORMATO_DIA es ''dd / MM / aaaa''
- obtenerZonaHorariaServidor devuelve ZoneId.systemDefault ()
Entonces, este es un ejemplo simple. Sin embargo, el análisis lanza esta excepción:
java.time.format.DateTimeParseException: Text ''15/06/2014'' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2014-06-15 of type java.time.format.Parsed
¿Algun consejo? He estado probando diferentes combinaciones de análisis y uso de TemporalAccesor, pero hasta ahora no he tenido suerte.
Atentamente
Esto es un error, ver JDK-bug-log . Según esa información, el problema se resolvió para Java 9 y Java 8u20. Intenta descargar la última versión de Java 8. Hoy en 2014-05-12: Hay una versión de acceso temprano 8u20 disponible.
ACTUALIZAR:
Personalmente creo que, dado que solo tiene y espera "dd / MM / aaaa" como patrón, debe usar LocalDate
como su tipo principal como @assylias ya ha propuesto. Con respecto a su contexto, es casi seguro que no se pueda usar ZonedDateTime
. ¿Qué quieres hacer con los objetos de este tipo? Solo puedo pensar en cálculos de zona horaria especializados como casos de uso. Y ni siquiera puede almacenar directamente estos ZonedDateTime
ZonedDateTime en una base de datos, por lo que este tipo es mucho menos útil de lo que mucha gente cree.
Lo que describí como su problema de caso de uso es, de hecho, un nuevo aspecto introducido con Java-8 comparado con el antiguo GregorianCalendar
-class (que es un tipo todo en uno). Los usuarios deben comenzar a pensar en elegir el tipo temporal adecuado para sus problemas y casos de uso.
No estoy seguro de por qué no funciona (probablemente porque su entrada no tiene información de la zona horaria). Una forma sencilla es analizar primero la fecha como una LocalDate
(sin información de hora o zona horaria) y luego crear una ZonedDateTime
:
public static ZonedDateTime convertirAFecha(String fecha) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse(fecha, formatter);
ZonedDateTime resultado = date.atStartOfDay(ZoneId.systemDefault());
return resultado;
}
Si viene de Google:
En lugar de hacer:
ZonedDateTime.from(new Date().toInstant());
Prueba esto:
ZonedDateTime.ofInstant(new Date(), ZoneId.of("UTC"));
Solo un ejemplo de conversiones, creo que algunas personas obtendrán la excepción a continuación.
(java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-10-24T18:22:09.800Z of type java.time.Instant)
si lo intentan
LocalDateTime localDateTime = LocalDateTime.from(new Date().toInstant());
para resolver el problema, por favor pase en Zona -
LocalDateTime localDateTime = LocalDateTime.from(new Date()
.toInstant().atZone(ZoneId.of("UTC")));