Ruby等效于Calendar.getInstance()。getTimeInMillis(),64位

时间:2013-09-12 07:03:48

标签: java ruby time

我使用Ruby生成类似于Java的64位时间戳。我经历了Class:Time,它说时间可以使用63位整数。我以为我可以用:

Time.now.to_f * 1000

但我担心由于浮点转换而导致精度下降。我可以简单地获得64位时间戳(自纪元以来的毫秒),就像在ruby中的Java一样,尽可能精确吗?

Calendar.getInstance().getTimeInMillis();

我需要在数据库中使用时间戳作为唯一ID,因此我希望将与时间相关的冲突从最小到不存在。

2 个答案:

答案 0 :(得分:2)

我添加了一些评论,暗示这不是你应该做的事情,但我真的认为你不必担心以任何有意义的方式失去精确度。 Ruby文档声明该值存储到纳秒级。将它转换为浮点数可能会丢失最后几位数,但它在毫秒级别上并不显着 - 你真的不在乎这个值是否向上或向下一点,毕竟......你是已经依赖于每毫秒只创建一个条目。

另一种方法是使用to_insec:将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>