Conversión de LocalDateTime a formato de marca de tiempo

Estoy convirtiendo el formato de cadena de fecha y hora a Marca de tiempo (java.sql) desde un formato diferente. Lo he convertido a LocalDateTime basado en un formato diferente. ¿Hay alguna forma de convertir el objeto LocalDateTime a Timestamp?

Respuesta 1

Es más delicado de lo que piensas, tan bueno que preguntaste.

Como puede usar java.time, la API moderna de fecha y hora de Java, no debería desear aplicar Timestamptambién la clase pasada de moda y mal diseñada .

Supongo que estaba solicitando un Timestampporque necesita algo que pueda almacenar en una columna de tipo de base de datos SQL timestamp(sin zona horaria). Permítame mencionar que para la mayoría de los propósitos no desea una columna de este tipo. El tipo de datos SQL estándar timestampno hace honor a su nombre. Si bien la idea de una marca de tiempo es que se debe identificar un punto sin ambigüedades en el tiempo cuando sucedió algo, un SQL timestampno no definir un punto en el tiempo. Define una fecha y hora del día, y cualquiera es libre de interpretarlo en cualquier zona horaria, lo que permite una variación de unas 26 horas. En cambio, por un punto en el tiempo deberías usar timestamp with timezone. Tampoco hace honor a su nombre, ya que no le permite elegir la zona horaria. Almacena los tiempos en UTC, por lo que identifica un punto único en el tiempo.

En el lado de Java, use un OffsetDateTimepara almacenar en una timestamp with timezonecolumna. Como tienes un LocalDateTime, necesitas convertir. Y para la conversión, necesita saber la zona horaria prevista detrás de su LocalDateTime. Por ejemplo:

    final ZoneId zone = ZoneId.of("Asia/Tehran");
    LocalDateTime ldt = LocalDateTime.of(2019, 2, 25, 23, 45);
    OffsetDateTime odt = ldt.atZone(zone).toOffsetDateTime();

    System.out.println("As OffsetDateTime: " + odt);

Como OffsetDateTime: 2019-02-25T23: 45 + 03: 30

Almacenar en su base de datos:

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
            "insert into your_table(your_ts_with_timezone) values (?)");
    ps.setObject(1, odt);
    ps.executeUpdate();

Si por alguna razón necesita una marca de tiempo sin zona horaria en su base de datos o no puede cambiarla, no necesita ninguna conversión. Solo guarde el LocalDateTimeque tenía:

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
            "insert into your_table(your_ts_without_timezone) values (?)");
    ps.setObject(1, ldt);

Si está programando para una API heredada que requiere un java.sql.Timestampobjeto antiguo , las cosas se vuelven aún más delicadas. A Timestampdefine un punto en el tiempo. Por lo tanto, ahora necesitará convertir de un LocalDateTimeque no define un punto en el tiempo, a uno Timestampque sí defina uno, luego pasarlo Timestampa una API que pueda almacenarlo en una columna de base de datos que nuevamente no defina un punto inequívoco en el tiempo. Deberá asegurarse de qué zonas horarias se utilizan para las conversiones, y aún puede haber casos de esquina que fallen o (peor) den resultados incorrectos. Sin embargo, como mencionó the_storyteller en un comentario, la conversión es lo suficientemente sencilla:

    Timestamp ts = Timestamp.valueOf(ldt);
    System.out.println("As old-fashioned Timestamp: " + ts);

Como sello de tiempo antiguo: 2019-02-25 23: 45: 00.0

La conversión utiliza la zona horaria predeterminada de su JVM. Esta configuración también es utilizada por TImestamp.toString(), por lo que la salida es la esperada. Sin embargo, esto es inestable, ya que cualquier programa que se ejecute en la JVM puede cambiar la configuración de zona horaria predeterminada en cualquier momento, por lo que generalmente no sabe lo que obtiene. Para ejercer control sobre la zona horaria utilizada para la conversión:

    Instant i = ldt.atZone(zone).toInstant();
    Timestamp ts = Timestamp.from(i);

Enlaces

  • SQL: ¿diferencia entre TIMESTAMP, DATE y TIMESTAMP WITH TIMEZONE?
Respuesta: 2

Tengo un script de hormiga que uso para construir mi aplicación J2EE y crear archivos jar. El problema es el siguiente: se necesitan dos archivos jar para que se ejecute la aplicación. commons-math-2.0.jar commons -...

Mi pila: Elasticsearch 5.4 (con la versión correspondiente de java client y kibana) Hola, estoy usando mapeo dinámico al crear nuevos índices, y estoy usando la sección a continuación en mi mapeo para desconocidos ...

Me gustaría ejecutar el trabajo ~ inmediatamente con el planificador de cuarzo usando el almacén de datos jdbc. Sin embargo, tengo entre 20 y 30 segundos de retraso entre la programación y el disparo, aunque programo con now () ...

Actualmente estoy desarrollando un complemento Eclipse y estoy un poco perdido ... Tengo una naturaleza personalizada y quiero agregar un .jar al classpath de los proyectos del usuario cuando el usuario agrega esta naturaleza (quiero actualizar. ..