La conversión de fechas de formato de base de datos a java siempre me ha traído de cabeza. No sé qué tipo se supone que viene de bbdd, ni en qué formato, ni cómo se supone que tengo que transformarlo en java, ni cómo quitar la hora o los milisegundos. Y el caso es que lo he hecho varias veces, pero siempre me cuesta una barbaridad y luego se me olvida al cabo de pocos días.
Vamos, que cumple todos los requisitios para ir al blog.
Además esta vez hay una vuelta más de hola: tengo un servicio REST en el que uno de los parámetros es de tipo fecha. En el .yml el parámetro viene definido así:
date:
type: string
format: date-time
Esto, al generar las clases de las entidades y servicios por la gracia de Maven, da lugar a un campo “date” de tipo java.time.OffsetDateTime
del que no había oído hablar en mi vida pero que va a empezar a formar parte de mis pesadillas.
En base de datos hemos declarado las columnas de tipo fecha con este tipo: TIMESTAMP (6), que al parecer ahora tiene un equivalente en java, el tipo java.sql.Timestamp
. La conversión es instantánea y tan simple como meter un casteo a la izquierda cuando sacas el valor que has recogido de la consulta a bbdd:
Timestamp datetime = (Timestamp) row.getOrDefault("CAMPO_FECHA", "")
Ahora bien, si intentas castear de tipo Timestamp a tipo OffsetDateTime, va a saltar un error precioso.
El casteo de Timestamp a OffsetDateTime (y viceversa) lo he encontrado en este hilo de StackOverflow, cómono. Si queréis leerlo de la fuente aquí tenéis el enlace.
La instrucción concreta es la siguiente:
OffsetDateTime.ofInstant(Instant.ofEpochMilli(datetime.getTime()), ZoneId.systemDefault())
Siendo la única variable de la instrucción “datetime“, que es de tipo Timestamp.
Todo lo demás, si tras escribirlo le dais a Ctrl-Mayusculas-O, se añade automáticamente.
…………………………………………………………………………….
Espero que esta entrada pueda ser de utilidad, y si no, como siempre, aquí tenéis un gato para compensar.
Esta genial el articulo. Un cordial saludo.