1

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

Time.now.to_f * 1000

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

Calendar.getInstance().getTimeInMillis();

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

4

2 回答 2

2

时间在 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 的一半,转换为浮点数的误差也是 ulp 的一半,即 68 秒,这是相当高的。

于 2013-09-12T07:13:56.460 回答
2

我已经添加了评论,暗示这确实不是你应该做的,但我真的认为你不需要担心以任何有意义的方式失去精度。Ruby 文档指出该值存储到纳秒级。将其转换为浮点数可能会丢失最后几位数字,但在毫秒级别上并不重要 - 毕竟,你真的不在乎值是向上还是向下舍入......你是已经依赖于每毫秒只创建一个条目。

另一种方法是使用to_iand nsec:将结果乘以to_i1000,将结果nsec除以 1000000,然后将两者相加。这将使您仅使用整数算术获得毫秒数。

于 2013-09-12T07:15:48.283 回答