Estoy tratando de recuperar los valores timestamp de una base de datos, convertirlos en el Calendario, y convertir de nuevo a la hora, pero que pierden su precisión.

Aquí está el código para reproducir el problema

import java.sql.Timestamp;
import java.util.Calendar;

public class Test {
    public static void main(String[] args)
    {
        Timestamp timestamp = new Timestamp(112, 10, 5, 15, 39, 11, 801000000);
        System.out.println("BEFORE "+timestamp.toString());
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp.getTime());
        timestamp = new Timestamp(calendar.getTimeInMillis());
        System.out.println("AFTER "+timestamp.toString());
    }
}

Aquí está el ejemplo de resultado de la conversión

BEFORE 2012-10-18 14:30:13.362001
AFTER 2012-10-18 14:30:13.362

Pierde su precisión.
¿Qué debo hacer para mantener el valor decimal como es?

  • He intentado esto en mi ide pero yo no obtener tal resultado, cada vez que se imprime el mismo Calendar calendar = Calendar.getInstance(); Timestamp timestamp = new Timestamp(new Date().getTime()); System.out.println("1 -> "+timestamp); // Thread.currentThread().sleep(1000); calendar.setTimeInMillis(timestamp.getTime()); timestamp = new Timestamp(calendar.getTimeInMillis()); System.out.println("2 -> "+timestamp);
  • Puede usted dar más contexto? De donde sacas estas de tiempo, ¿cómo se puede obtener una salida?
  • He actualizado el ejemplo, yo siento el falso resultado antes fue mi culpa.
InformationsquelleAutor William Wino | 2012-11-06

2 Comentarios

  1. 30

    Se establece el tiempo en milisegundos, pero su precisión es en microsegundos, así que por supuesto que van a perder alguna precisión más fino que el de milisegundos.

    Calendario no admite una granularidad más fina que la de milisegundos. No hay ninguna solución.

    • Y no hay ninguna alternativa de clase?
    • JodaTime es la respuesta habitual, pero es sólo admite milisegundos. Su requisito es un poco inusual – considere el uso de un milisegundo granularidad (como todos los demás)
  2. 8

    java.tiempo

    En Java 8 y más tarde, ahora tenemos una solución: el nuevo java.tiempo marco está construido en. Definido por JSR 310, inspirado por Joda-El Tiempo, extendida por el ThreeTen-Extra proyecto.

    Este nuevo marco ha nanosegundos resolución. Eso es suficiente para manejar la edad de java.util.Los valores de fecha, Joda valores de Tiempo, siendo ambos milisegundos. Y es suficiente para manejar la microsegundos utilizado por algunas bases de datos tales como Postgres. Algunas bases de datos tales como H2 uso de los nanosegundos. Así que java.el tiempo puede manejar todos, o por lo menos todos los principales de situaciones. Las únicas excepciones serían nicho científico o de ingeniería situaciones.

    La conversión de java.sql.La hora en java.util.Calendario sin perder la precisión

    Con Java 8, la edad, las clases nuevos métodos para la conversión a/desde java.tiempo. En java.sql.Marca de tiempo utilizar el nuevo toInstant y fromInstant métodos. El Instant clase contiene un recuento de los nanosegundos de la época, primer momento de 1970 UTC (básicamente, ver la clase doc para más detalles).

    De un Instant usted puede conseguir un ZonedDateTime objeto.

    java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );
    Instant instant = ts.toInstant();
    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = instant.atZone( zoneId );

Dejar respuesta

Please enter your comment!
Please enter your name here