Ниже приведен мой простой класс таймера, который отлично работает в простейших случаях. Я использую приведенный ниже класс таймера, чтобы измерить, сколько времени требуется для выполнения определенного кода.
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));