我被要求在算法开始之前存储时间,以及结束时间,并且还需要提供它们之间的差异(结束时间 - 开始时间)。
但是System.currentTimeMillis()
函数生成的值太长了:
start=1497574732045
end=1497574732168
有没有办法让这个值只有3位数,如" 123"但也要像使用System.currentTimeMillis()
函数一样精确吗?
答案 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。