我使用Ruby生成类似于Java的64位时间戳。我经历了Class:Time,它说时间可以使用63位整数。我以为我可以用:
Time.now.to_f * 1000
但我担心由于浮点转换而导致精度下降。我可以简单地获得64位时间戳(自纪元以来的毫秒),就像在ruby中的Java一样,尽可能精确吗?
Calendar.getInstance().getTimeInMillis();
我需要在数据库中使用时间戳作为唯一ID,因此我希望将与时间相关的冲突从最小到不存在。
答案 0 :(得分:2)
我添加了一些评论,暗示这不是你应该做的事情,但我真的认为你不必担心以任何有意义的方式失去精确度。 Ruby文档声明该值存储到纳秒级。将它转换为浮点数可能会丢失最后几位数,但它在毫秒级别上并不显着 - 你真的不在乎这个值是否向上或向下一点,毕竟......你是已经依赖于每毫秒只创建一个条目。
另一种方法是使用to_i
和nsec
:将to_i
的结果乘以1000,将nsec
的结果除以1000000,然后将两者相加一起。这将获得仅使用整数运算的毫秒数。
答案 1 :(得分:1)
Java中签署的时间很长,所以它也是63位。
所以你担心今年你会溢出吗?就个人而言,我认为到那时任何人都不会使用Java。事实上,我们很可能会在那时灭绝/进化。
System.out.println("Overflow at " + new Date(Long.MAX_VALUE));
打印
Overflow at Sun Aug 17 08:12:55 CET 292278994
注意:2.92亿年前之前恐龙统治着地球。
如果您担心将纳秒级时间戳转换为双倍的准确性会丢失,您可以计算出错误是什么
long now = System.currentTimeMillis() * 1000000L;
double error_f = Math.ulp((float) now);
double error = Math.ulp((double) now);
System.out.println("The error for a nano-second timestamp using a double "
+ now + " is " + error + " and float is " + error_f);
打印
The error for a nano-second timestamp using a double 1378970569656000000 is 256.0 and float is 1.37438953472E11
这意味着转换为double
的错误高达128 ns的一半,对于转换为float,错误也是ulp的一半,即68秒,这是非常高的。 / p>