2009-07-01 41 views

Respuesta

84

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

¿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 ... –

+5

¿Podría explicar lo que quiere decir? dateTime.getMillis() devuelve los milisegundos desde época, que tiene en cuenta la zona horaria. –

+6

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

9

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.

+0

En cuanto a los nanosegundos ... FYI, [JSR 310: API de fecha y hora] (http://jcp.org/en/jsr/detail?id=310) está incorporada en Java 8, y el sucesor de Joda-Time, de hecho es compatible con nanosegundos resolución. Tenga en cuenta que el reloj de muchas computadoras no le da tiempo a esa granularidad. Aparte: nota interesante de la especificación JSR: * Estas clases usan precisión de nanosegundos. Las clases tienen suficiente precisión para representar cualquier instante de nanosegundos dentro de la edad actual del universo. * –

+0

Me gustaría que corrigieran la dicción en esa especificación ... Java no tiene control sobre la precisión del hardware, y la precisión es una función de precisión y corrección (o 'verdad').Las clases tienen RESOLUCIÓN de un nanosegundo y suficiente tamaño en memoria para representar una gran cantidad de nanosegundos. – KarlKFI

+0

En cuanto a su afirmación acerca de la granularidad: algunos sistemas no tienen una resolución de nanosegundos, y algunos no tienen una presisión o corrección de nanosegundos. System.nanoTime() probablemente agregue ceros en cualquier sistema donde el sistema operativo no proporcione una resolución de nanosegundos, pero eso solo aumenta la resolución, no precisión, corrección o precisión. Esta es la fuente más completa que puedo encontrar sobre la terminología: http://www.tutelman.com/golf/measure/precision.php – KarlKFI

Cuestiones relacionadas