2012-01-21 2 views
1

Мы регистрируем некоторые события на наших серверах, мы получаем текущее время каждого события, создавая новый объект Date. как это new Date()Странное поведение, получающее время, используя новую дату() в java

Но вчера что-то пошло не так. регистратор показывает, что эта запись была зарегистрирована в 2012-01-21 14:06:04, но событие получило разное время от new Date(), этого: 2012-01-21 13:06:04

Существует один час разницы.

Тем не менее, другие события получают правильное время непосредственно перед и после этого багги-события.

БОНУС

Мы протоколировать события, используя этот форматировщик:

// Of course, this means that we read our buggy timestamp like: '120121130604' 
// but that's irrelevant :p 
public static SimpleDateFormat messageDateTimeFormatter = new SimpleDateFormat("yyMMddHHmmss"); 

Любые идеи?

+1

Какой часовой пояс вы используете в/что такое часовой пояс вашего JVM по умолчанию? – Thomas

+0

это часовой пояс ОС: UTC-4: 00 GeorgeTown, La Paz, Manaus, San Juan – SDReyes

+0

И JVM говорит: user.timezone = America/La_Paz – SDReyes

ответ

6

Учитывая, что ваш SimpleDateFormat является открытым статическим полем, я думаю, что несколько потоков используют его одновременно. Но SimpleDateFormat is not thread-safe:

Форматы даты не синхронизированы. Для каждого потока рекомендуется создавать экземпляры отдельного формата . Если несколько потоков обращаются к формату одновременно , он должен быть синхронизирован извне.

Синхронизировать его использование или хранить его в переменной ThreadLocal или создавать новый экземпляр каждый раз.

То, что вы получили, может быть вызвано некоторым состоянием гонки или другой связанной с потоком ошибкой из-за одновременного использования SimpleDateFormat.

+0

+1 Это классический «gotcha». Я тоже с этим справился. Настоящий заговорщик - это придурок, который закодировал SimpleDateFormat небезопасным - это очевидный кандидат на кеширование/повторное использование между потоками – Bohemian

+1

Хотя я полностью согласен с тем, что это проблема, которую следует решить, я скептически отношусь к тому, что это вызвало проблему OP проблема - особенно учитывая, что отмеченные времена ровно на 1 час друг от друга. Звучит скорее как проблема с изменением времени. – ziesemer

+0

Я не уверен, что это и причина проблемы. Вот почему я сказал «может быть вызвано». Но поскольку логгер отображался в то же время правильно, в тот же миг это все равно мой лучший выбор. –

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