Конструктор java.sql.Timestamp выглядит следующим образом:
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, который принимает время в наносекундах и затем вычисляет значение наносекунды из этого.
Если вы запустите приведенную ниже программу, вы увидите разницу между фактическиминаносекунды и тот, который возвращен 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;
}
Так что вся дискуссия о метке времени, которая говорит, что она хранит время до наносекунд, не кажется такой правильной ... Не так ли?