是否有更短的方式来表示以毫秒为单位的时间?

时间:2017-06-16 01:03:27

标签: java

我被要求在算法开始之前存储时间,以及结束时间,并且还需要提供它们之间的差异(结束时间 - 开始时间)。

但是System.currentTimeMillis()函数生成的值太长了:

start=1497574732045
  end=1497574732168

有没有办法让这个值只有3位数,如" 123"但也要像使用System.currentTimeMillis()函数一样精确吗?

2 个答案:

答案 0 :(得分:2)

如currentTimeMillis()描述所示: -

  

以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

     

返回:   当前时间与1970年1月1日午夜时间之间的差异,以毫秒为单位。

在你的情况下使用这个简单的技巧,你将得到所需的结果。

    Long startTime= Long.parseLong("1497674732168");
    Long endTime= Long.parseLong("1497574732168");
    System.out.println("start time is"+new Date(startTime)+"end time is"+new Date(endTime));

答案 1 :(得分:1)

如果你需要分别存储开始和结束时间,只有两种方法(我可以想到)使值变小。

首先,System.currentTimeMillis()计算自1970年1月1日UTC。但是如果你的时钟永远不会在"现在"之前运行,你可以减去固定的时间。我选择了1497580000000,因为它在我写这篇文章的时候肯定是过去的,并且它是一个很好的偶数。

其次,将值除以您愿意失去的任何精度。在你的情况下,你可能不想这样做,但在这里我选择了100。

现在返回的数字看起来很小,但随着当前时间与1497580000000之间的差异变得更加显着,它们将继续变大。

首选解决方案是根本不做任何操作,但如果可以的话,只需存储长值。

你永远不会将大的精确数字变成只有3位小数。不是没有量子力学。

{
    long start = 1497584001010L;
    long end =   1497584008000L;

    System.out.println("Diff: " + (end - start));

    int compactStart = compact(start);
    int compactEnd = compact(end);

    System.out.println("Compact Start: " + compactStart);
    System.out.println("Compact End:   " + compactEnd);

    System.out.println("Diff: " + (expand(compactEnd) - expand(compactStart)));

}

private int compact(long millis) {
    return (int)((millis - 1497580000000L)/100);
}

private long expand(int millis) {
    return (millis + 1497584000000L)*100;
}

结果...

Diff: 6990
Compact Start: 40010
Compact End:   40080
Diff: 7000

注意7000由于故意精确丢失而不等于6990。