Метка времени в миллисекундах не преобразуется должным образом в часы, минуты и секунды?

Ниже приведен мой простой класс таймера, который отлично работает в простейших случаях. Я использую приведенный ниже класс таймера, чтобы измерить, сколько времени требуется для выполнения определенного кода.

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 вhours, minutes и seconds.

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 отметка времени не конвертируется в hours, minutes и seconds должным образом. Это означает, что если код выполняется всего 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));

person john    schedule 28.05.2014    source источник


Ответы (1)


Нет смысла брать количество часов и остаток при делении на 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
person rgettman    schedule 28.05.2014
comment
ааа глупая ошибка с моей стороны. Если мне нужно перейти с расчетом дней, какие изменения я должен внести? - person john; 28.05.2014
comment
Вы захотите добавить еще одну строку, например 'int days = ((timeTaken / (1000 * 60 * 60 * 24));', а также распечатать это значение. - person rgettman; 28.05.2014
comment
Я также обновил вопрос с указанием дней. Вы понимаете, что вы имели в виду? - person john; 28.05.2014
comment
Можете ли вы проверить, что я обновил, это то, что вы имели в виду, и моя логика с полной временной меткой будет выглядеть так? - person john; 28.05.2014