以毫秒为单位的时间戳不能正确转换为小时,分钟和秒?

时间:2014-05-28 01:49:54

标签: java timestamp milliseconds nanotime

下面是我的简单计时器类,它在最简单的情况下工作正常。我使用下面的计时器类来测量某些代码执行时所花费的时间。

public static class StopTimer {

    public static StopTimer getInstance() {
        return new StopTimer();
    }

    private long m_end = -1;
    private long m_interval = -1;
    private final long m_start;

    private StopTimer() {
        m_start = m_interval = currentTime();
    }

    public long getDuration() {
        long result = 0;

        final long startTime = m_start;
        final long endTime = isTimerRunning() ? currentTime() : m_end;

        result = nanoToMilliseconds(endTime - startTime);

        return result;
    }

    private long currentTime() {
        return System.nanoTime();
    }

    private long nanoToMilliseconds(final long nanoseconds) {
        return nanoseconds / 1000000L;
    }
}

以下是我使用上述计时器类的方法。我得到了执行某段代码然后将timestamp转换为hoursminutesseconds所需的时间戳(以毫秒为单位)。

public static void main(String[] args) {

    StopTimer timer = StopTimer.getInstance();

    some_code_which_I_am_measuring();

    long timeTaken = timer.getDuration();

    int seconds = (int) (timeTaken / 1000) % 60;
    int minutes = (int) ((timeTaken / (1000 * 60)) % 60);
    int hours = (int) ((timeTaken / (1000 * 60 * 60)) % 24);    

    System.out.println("Total Time Taken: " + hours + " hours " + minutes + " minutes " + seconds + " seconds");

}

问题陈述: -

我遇到的问题是timeTaken时间戳无法正确转换为hoursminutesseconds。这意味着,如果代码总共运行2分钟,那么我的sys.out会显示正确的结果。

但是假设这个方法some_code_which_I_am_measuring运行了两天,那么我的sys.out显示错误的结果。例如,我在Fri 5/23/2014 9:40 PM上启动了我的程序,它在Sun 5/25/2014 9:38 PM上完成,因此我的sys.out应该告诉我执行代码需要~48小时。正确?

但一般来说它打印出来 -

Total Time Taken: 23 hours 57 minutes 35 seconds

这是错误的,因为您可以看到上面的日期需要48小时才能完成任务。

我上面的代码有什么问题吗?

更新: -

添加天后,整体时间戳应如下所示?

int seconds = (int) (timeTaken / 1000) % 60;
int minutes = (int) ((timeTaken / (1000 * 60)) % 60);
int hours = (int) ((timeTaken / (1000 * 60 * 60)) % 24);
int days = (int) (timeTaken / (1000 * 60 * 60 * 24));

1 个答案:

答案 0 :(得分:5)

除非你进一步计划列出它所用的天数,否则花费小时数除以24除以余数是没有意义的。

如果您使用单位数小时,请取出% 24

int hours = (int) (timeTaken / (1000 * 60 * 60));

然后你会看到正确的输出

Total Time Taken: 47 hours 57 minutes 35 seconds

否则,您可能需要添加天数计算。

int days = ((timeTaken / (1000 * 60 * 60 * 24));

然后你可以将它添加到输出中,然后显示为

Total Time Taken: 1 day 23 hours 57 minutes 35 seconds