gdmn
gdmn copied to clipboard
Некорректное чтение даты
Иногда, стресс тест валится из-за ошибки сравнение дат. Причем может отработать и час и 10 часов без ошибок.
Что происходит:
- создание случайной даты - date1.
- запись date1 в базу.
- чтение даты из базы - date2.
- сравнение date1 и date2.
Ошибка происходит в пункте 4. Разница между датами небольшая - 1 час.
Надо записать в лог какая именно дата генерируется, чтопишется в бд и что из нее потом читается. И еще в какой момент времени это происходит. Потом думать. Возможно претензии к драйверу, а может на нашей стороне что-то.
время сервера: 2018-12-18T17:11:39.419Z
сгенерировано: 2006-10-29T00:46:29.036Z
считано: 2006-10-28T23:46:29.036Z
в ночь с 28 на 29 окт 2006 года был переход на зимнее время. вот этот час и вылазит.
пока надо обеспечить совместимость с действующими базами фб. а именно дата записывается в базу и считывается как есть, без учета часового пояса. то что записывается, должно и считаться именно так.
PS: в ФБ 4 будут уже часовые пояса для дат и можно будет сделать по нормальному.
Не совсем понимаю, как это возможно, когда у нас имеется клиент серверная архитектура, разве что если работать с датами и на клиенте и на сервере в UTC.
На данный момент для передачи дат между клиентом и сервером используется стандартная сериализация объекта Date в json (YYYY-MM-DDTHH:MM:SSZ
с тайм зоной Z)
Другими словами, когда клиент посылает дату со своей локалью, она переводится в зону Z и передается на сервер. После чего на сервере происходит конвертация ее в локальную зону сервера и запись в БД в этом виде. При отправке даты с сервера на клиент, произойдут те же манипуляции с датой.
Соответственно, если кто-то из них изменит локаль, переведет время или еще что - будут проблемы и если на сервере это маловероятно, то на клиенте очень даже запросто.