current - jodatime java 8
Cómo usar Joda-Time con java.sql.Timestamp (2)
Tengo una declaración preparada
INSERT INTO mst(time) VALUES (?);
donde el tiempo es de tipo Timestamp en una PostgreSQL datos PostgreSQL .
Estoy insertando un objeto Joda-Time DateTime , o debería decir que estoy tratando de hacerlo. No encuentro forma de convertir el objeto DateTime en java.sql.Timestamp . He leído los documentos de Joda-Time y no veo ninguna referencia a esto.
Gracias.
El constructor DateTime de JodaTime puede manejar esto por ti ahora. (No estoy seguro de si eso fue cierto cuando se publicó la pregunta, pero es un resultado superior de Google, así que pensé en agregar una solución más nueva).
Hay algunas opciones de API:
public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);
Ambas opciones aceptan java.sql.Timestamp porque extiende java.util.Date, pero Nanoseconds se ignorará (con piso), porque DateTime y Date solo tienen una resolución de milisegundos *. Sin una zona horaria específica, se establecerá por defecto en DateTimeZone.UTC.
<Modo didáctico>
"Resolución" es cuántos dígitos se proporcionan. "Precisión" es cuán precisa es la representación. Por ejemplo, DateTime de MSSQL tiene una resolución de milisegundos, pero solo ~ 1/3 de una segunda precisión (DateTime2 tiene resolución variable y mayor precisión).
</ Modo didáctico>
UTC Timestamp con un milisegundo de resolución Ejemplo:
new DateTime(resultSet.getTimestamp(1));
Si está utilizando TIMESTAMP WITH TIME ZONE en su base de datos, entonces no puede usar java.sql.Timestamp porque no admite zonas horarias. Deberá usar ResultSet # getString y analizar la cadena.
Marca de tiempo sin zona horaria con segundo ejemplo de resolución **:
LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseLocalDateTime(resultSet.getString(1));
Indicación de fecha y hora UTC con segundo ejemplo de resolución **:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseDateTime(resultSet.getString(1));
Marca de tiempo con zona horaria (formato de desplazamiento) con segundo ejemplo de resolución **:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
.parseDateTime(resultSet.getString(1));
Bonificación: DateTimeFormat # forPattern almacena en caché de forma estática los patrones por lo que no es necesario.
<Modo didáctico>
En general, recomiendo usar un String en su modelo DBO para que la resolución sea explícita y evite generar objetos intermedios. (¿2013-11-14 09:55:25 es igual a 2013-11-14 09: 55: 25,000?) Por lo general, trato de distinguir entre la optimización de "objetos del modelo de base de datos" para la preservación de datos y la optimización de "objetos del modelo de negocio" para uso del nivel de servicio con una capa de transformación / mapeo en el medio. Encuentro que tener DAO basados en CRUD generando objetos comerciales directamente tiende a mezclar las prioridades y optimizar para ninguna de las dos, lanzando excepciones desde lugares inesperados debido a casos de bordes perdidos. Tener una capa de transformación explícita también le permite agregar validación si es necesario, por ejemplo, si no controla la fuente de datos. Separar las preocupaciones también hace que sea más fácil probar cada capa de forma independiente.
</ Modo didáctico>
* Si necesita resolver una resolución de nanosegundos en su modelo de negocio, tendrá que usar una biblioteca diferente.
** El formato de cadena de marca de tiempo puede variar entre las bases de datos, no estoy seguro.
Puede convertir Joda DateTime a largo (millis desde la época) primero, y luego crear una marca de tiempo a partir de eso.
DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());