2010-07-27 9 views
2

I время различные транзакции в моем приложении Java. В начале транзакции я получаю время начала, создавая календарь, а затем получаю час, минуту, секунду и миллисекунду. Я завершаю транзакцию, создаю новый календарь и получаю новый час, минуту, секунду и миллисекунду. Мое рассуждение состоит в том, что разница между временем начала и временем окончания - это время транзакции. Это, похоже, работает большую часть времени, но крошечная часть времени, время окончания - раньше, чем время начала. Почему это происходит и как я могу это предотвратить?миллисекунды времени в java

+2

Что делает код выглядеть, где вы создаете даты, и звоните метод транзакции? –

+0

Если вы также указали код, который вы написали для этого, тогда это будет легко сказать что-то ... – Rupeshit

ответ

8

Ну, на первый взгляд, проще всего вычислить разницу было бы использовать что-то вроде System.currentTimeMillis() или System.nanoTime() - таким образом вам не нужно ничего делать, кроме простого вычитания, чтобы получить количество миллисекунд или количество наносекунд между началом и концом.

Однако, если ваши системные часы обновляются с помощью NTP или что-то подобное, время может эффективно отходить назад иногда - в зависимости от того, как обрабатывается перекос часов. (Некоторые системы просто замедляют системные часы на некоторое время, чтобы перекосить их обратно в реальность, другие могут иметь разрывы.)

Я не уверен в лучшем способе избежать этого - я не знаю считаю JRE в настоящее время имеет что-то эквивалентное Stopwatch в .NET, которое предназначено исключительно для измерения интервалов и не (как я полагаю) перепуталось с изменением системных часов.

(я иду вместе с рекомендацией Erick о Joda Time, кстати. - хотя я не думаю, что вам это нужно для этой конкретной проблемы)

+0

Это отличный ответ. –

+0

По моему опыту, время гораздо точнее в linux, чем в окнах. System.currentTimeInMilis имеет тенденцию проскальзывать вперед в больших кусках на окнах ... Не уверен, что это будет иметь значение, но это может быть – bwawok

+1

IIUC, System.nanoTime не зависит от изменений на стене (например, NTP и т. Д.). nanoTime предназначен для единственной цели измерения прошедшего времени. –

Смежные вопросы