Java日历getTimeInMillis()返回相同的时间

时间:2019-03-31 00:52:38

标签: java milliseconds java.util.calendar

我有一段这样的代码:

    Calendar c = Calendar.getInstance();
    long startTime = c.getTimeInMillis();

    while (x < 10000000) {//check all the integers from 1 to 10000000 to
                          //to see if they're prime or not}

    long endTime = c.getTimeInMillis();
    long totalTime = endTime - startTime;

该循环运行了1000万次,因此肯定startTimeendTime将包含不同的值。

但是totalTime始终等于0。

为什么startTimeendTime包含相同的值?

任何帮助将不胜感激=)

1 个答案:

答案 0 :(得分:2)

tl; dr

Duration.between(       // Represent a span-of-time as a count of nanoseconds, to be calculated as hours-minutes-seconds.
    then ,              // Earlier in your code, capture the previous current moment: `Instant then = Instant.now() ;`
    Instant.now()       // Capture the current moment. 
)                       // Returns a `Duration` object, our elapsed time.
.toNanos()              // Get the total number of nanoseconds in the entire span-of-time. Returns a `long`. 

捕获当前时刻

您的代码正在捕获冻结的当前时刻,快照。结果对象更新。这就是JavaDoc类中“特定时间”一词的含义。

要跟踪经过的时间,必须捕获当前时刻两次,从而产生两个单独的对象。

避免使用旧的日期时间类

Calendar类很糟糕,几年前被 java.time 类所取代,并采用了JSR310。具体地说,ZonedDateTime取代了{{1} },通常是GregorianCalendar的实现。

Calendar

用于跟踪当前时刻的现代方法使用Instant类。 Instant代表UTC的时刻。

Instant

解决方案

在Java 9和更高版本中,当前时刻以微秒的分辨率(小数秒的6个十进制数字)捕获。在Java 8中,即时Instant start = Instant.now() ; … // Do some stuff. Instant stop = Instant.now() ; 的Instant实现仅限于捕获当前时刻(以毫秒为单位)(3个十进制数字)。在Java的所有版本中,Clock类均具有以纳秒(9个十进制数字)表示时刻的能力。但是传统的计算机时钟无法精确地精确跟踪时间。

Instant

将经过时间计算为Duration对象。

Duration

Duration duration = Duration.between( start , stop ) ; // Represents a span of time in terms of hours-minutes-seconds. long nanoseconds = duration.toNanos() ; // Converts this duration to the total length in nanoseconds expressed as a long.

对于微基准测试,您可能需要使用System.nanoTime()。从某个任意起点开始,该方法将当前时刻捕获为十亿分之一秒。请注意:根据任何时钟或日历,返回的值 not 都不代表当前时刻。但是对于以可能比System.nanoTime更好的分辨率跟踪经过的时间很有用。

Instant

JEP 230:Microbenchmark Suite

要进行严格的基准测试,请查看基于JMH的Java 12及更高版本中新增的基准测试框架。参见JEP 230: Microbenchmark Suite