java.sql.Timestamp способ хранения NanoSeconds

java.sql. Конструктор отметок времени выглядит следующим образом:

public Timestamp(long time) {
    super((time/1000)*1000);
    nanos = (int)((time%1000) * 1000000);
    if (nanos < 0) {
        nanos = 1000000000 + nanos;     
        super.setTime(((time/1000)-1)*1000);
    }
}

Он в основном принимает время в миллисекундах, а затем извлекает последние 3 цифры и делает их нано. Итак, для миллисекундного значения 1304135631 421 я получаю Timestamp.getnanos () как 421000000 . Это простой расчет (добавление 6 нулей в конце) ... не кажется оптимальным.

Лучшим способом мог бы быть конструктор Timestamp, который принимает время в наносекундах и затем вычисляет на его основе значение наносекунды.

Если вы запустите приведенную ниже программу, вы увидите разницу между фактическими наносекундами и тем, что возвращает Метка времени для вычисления наносекодов.

long a = System.currentTimeMillis();
    for(;;){
        long b = System.currentTimeMillis();
        Timestamp tm = new Timestamp(System.currentTimeMillis());
        System.out.println(tm.getTime());
        System.out.println(tm.getNanos());
        System.out.println("This is actual nanos" + System.nanoTime()%1000000000);
        System.out.println("--------------------------");
        if(b-a >= 1)
            break;
    }

Таким образом, вся дискуссия о Timestamp, в которой говорится, что она хранит время с точностью до наносекунд, кажется не совсем правильной ... Не так ли?

7
задан BalusC 30 April 2011 в 04:42
поделиться