Странное поведение, получая время, используя новый Date () в Java - PullRequest
1 голос
/ 22 января 2012

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

Но вчера что-то пошло не так.регистратор показывает, что эта запись была зарегистрирована в 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 Ответ

6 голосов
/ 22 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...