JodaTime's DateTime constructor puede manejar esto por usted ahora. (no estoy seguro de si eso era cierto cuando la pregunta fue publicada, pero es un buen resultado Google por lo que pensé que me gustaría añadir una solución nueva.)
Hay algunas opciones de la API:
public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);
Ambas opciones aceptan java.sql.Timestamp porque extiende java.util.Date, pero los Nanosegundos serán ignorados (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 la cantidad de dígitos que 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 Milisegundo Resolución Ejemplo:
new DateTime(resultSet.getTimestamp(1));
Si está utilizando TIMESTAMP WITH TIME ZONE en su base de datos, entonces no puede utilizar java.sql.Timestamp, porque no admite zonas horarias. Deberá usar ResultSet # getString y analizar la cadena.
marca de hora sin zona horaria con el segundo ejemplo, la resolución **:
LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseLocalDateTime(resultSet.getString(1));
UTC Timestamp con Segundo ejemplo Resolución **:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseDateTime(resultSet.getString(1));
marca de hora con la zona horaria (offset de formato) con el segundo ejemplo, la resolución **:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
.parseDateTime(resultSet.getString(1));
Bonificación: DateTimeFormat # forPattern static ally almacena en caché los analizadores por patrón, por lo que no es necesario.
< modo didáctico >
En general, recomiendo el uso de una cadena en su modelo de DBO con el fin de hacer que la resolución explícita y evitar la generación de 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 de modelo de base de datos" para las preocupaciones de preservación de datos y la optimización de "objetos de modelo de negocio" para el 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 tiene que resolver con la resolución de nanosegundos en su modelo de negocio que tendrá que utilizar una biblioteca diferente.
** Timestamp El formato de cadena puede variar entre las bases de datos, no estoy seguro.
¿Dónde está el componente TimeZone? Solo ha "copiado" la fecha y la hora, pero no la zona horaria, lo que puede afectar el valor real ... –
¿Podría explicar lo que quiere decir? dateTime.getMillis() devuelve los milisegundos desde época, que tiene en cuenta la zona horaria. –
Vale la pena señalar que joda-time no almacena nanosegundos mientras que Timestamp sí. Cualquier conversión entre los dos perderá precisión de nanosegundos. – Gili