2017-06-16 75 views
-3

我被要求在算法开始前及结束时存储时间,还需要提供它们之间的差异(结束时间 - 开始时间)。有没有简短的方法来表示一个毫秒的时间?

System.currentTimeMillis()函数生成过长是值:

start=1497574732045 
    end=1497574732168 

有没有办法让这个值只有3个位数,如“123”,但也可以作为使用System.currentTimeMillis()功能精确?

+0

**为什么**你关心的是位数**和**否,考虑任何时间+ - 500ms。 –

+2

'System.currentTimeMillis()'返回自unix时期以来的毫秒数 - 'start'和'end'之间的差值将是这两点之间传递的毫秒数。你应该从'start'开始减去'end',然后你可以从那里格式化数值(如果你希望从那里开始的话)(尽管你很可能会用'0s'结尾) – MadProgrammer

+0

你的意思就像'%1000'? –

回答

1

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

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

其次,将数值除以您愿意失去的任何精度。在你的情况下,你可能不想这样做,但在这里我选择了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。

2

为的currentTimeMillis()介绍说: -

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

返回: UTC的当前时间与午夜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)); 
相关问题