Как Ошибка С Потерянными Днями Рождения Завела Нас В Историю Ссср

На корпоративном портале одного из наших клиентов у некоторых пользователей в профиле неправильно отображалась дата рождения — вместо необходимого дня был указан предыдущий день.

Наши разработчики обнаружили, что причина этой ошибки скрыта глубоко в истории.

Сначала команда проверила серверную часть и убедилась, что данные поступают правильно.

Мы проанализировали логи взаимодействия браузеров пользователей с сайтом — оказалось, что ошибка воспроизводится только в Safari на устройствах Apple. А когда пользователи говорят, что дата рождения отображается правильно, они заходят на портал с другого устройства и браузера, например Google Chrome на компьютере.

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

Оказалось, что проблема вращается примерно в июне 1930 года — именно здесь происходит сбой времени, и только в Safari. Стали разбираться дальше, что особенного произошло 21 июня 1930 года, и обнаружили, что в этот день в Советском Союзе передвинули время на час вперед. Google Chrome правильно справляется с этой ситуацией, а Safari — нет. Еще одной особенностью является переменный формат, передающий это время.

Формат отсчитывает количество миллисекунд от нулевого времени — отметка 1 января 1970 года.

Google Chrome обрабатывает дату 21 июня следующим образом: с 23:59 до 1 ночи стоит 1000 миллисекунд (что равно 1 секунде), это означает, что это время «исчезло».

Сафари считает, что это время есть, так как не знает, что в СССР меняли часы.

Команда сообщила об этой ошибке в Apple Feedback Assistant и ожидает ответа.

А со следующим релизом портал получит собственный патч.

P.S. В ходе расследования разработчики обратили внимание на еще один интересный факт. У пользователей есть функция, позволяющая отображать на портале только день и месяц рождения без года.

И оказалось, что если пользователь выбирает эту настройку, то из бэкенда передается значение «4 AD».

Установить, почему создатели портала выбрали именно эту дату, удалось только в самом конце.

Оказалось, что сначала в качестве самого простого значения по умолчанию было установлено одно.

Но тут в поиске появился баг — он не нашел людей с днями рождения 29 февраля.

Используемая структура хранения времени не позволяет создать экземпляр с 29 февраля в невисокосный год. Поэтому в код прописали первый високосный год нашей эры, и всё заработало.

Теги: #Разработка мобильных приложений #Разработка веб-сайтов #Safari #синхронизация времени #разработка корпоративного портала

Вместе с данным постом часто просматривают: