На корпоративном портале одного нашего заказчика у некоторых пользователей в их профиле неправильно отображалась дата рождения – вместо необходимого дня показывался предыдущий. Наши разработчики выяснили, что причина этой ошибки скрывалась глубоко в истории.
Сначала команда проверила бэкенд и убедилась, что данные приходят корректно. Проанализировали логи взаимодействия пользовательских браузеров с сайтом – выяснилось, что баг воспроизводится только в Safari на устройствах Apple. А когда пользователи говорят, что дата рождения отображается правильно, они заходят на портал с другого устройства и браузера, например, с Google Chrome на компьютере.
Далее, команда стала перебирать разные периоды, постепенно сокращая временные отрезки, чтобы понять, с какой датой связан наш баг. Выяснилось, что проблема крутится вокруг июня 1930 года – именно там происходит сбой по времени, причем только в Safari. Стали разбираться дальше, что особенного произошло 21 июня 1930 года, и откопали, что в этот день в Советском Союзе перевели время на час вперёд. Google Chrome обрабатывает эту ситуацию корректно, а Safari – нет.
Еще одна особенность в формате переменной, которая передает это время. Формат отсчитывает количество миллисекунд от нулевого времени – отметка стоит на 1 января 1970 года. Google Chrome обрабатывает дату 21 июня следующим образом: с 23:59 до часа ночи стоит 1000 миллисекунд (что равно 1 секунде), то есть это время «пропадает». Safari же считает, что это время там есть, так как не знает, что в СССР переводили часы.
Команда зарепортила этот баг в Apple Feedback Assistant и ожидает ответа. А портал получит собственную заплатку со следующим релизом.
P.S. В процессе расследования разработчики обратили внимание ещё на один интересный факт. У пользователей есть фича, которая позволяет отображать на портале только день и месяц рождения без года. И оказалось, что если пользователь выбирает такую настройку, то с бэкенда передаётся значение «4 год нашей эры». Установить, почему создатели портала выбрали эту дату, удалось только в самом финале.
Оказалось, что сначала выставлялась единица как самое простое значение по умолчанию. Но тогда появился баг в поиске – он не находил людей с днями рождения 29 февраля. Создать инстанс с 29 февраля в невисокосном году не позволяет используемая структура хранения времени. Поэтому в коде прописали первый в нашей эре високосный год, и все заработало.
XVadim
rrrad
Да, до определённого года часы переводили в полночь (видимо, считали, что так проще), чем доставили кучу проблем разработчикам через кучу лет: некоторые локальные даты стали в принципе не представимы в формате штамп времени + таймзона.
Потом догадались это делать в час ночи. Интересно, что же их надоумило? Появление критичной массы людей, которые в полночь бодрствуют?
Sap_ru
Развитие ЖД и авиасообщение и нарастающий бардак с понятием «дата рейса».
K0styan
Погодите. Я правильно понимаю, чтобы налететь на этот баг пользователь должен родиться до того самого 21.06.1930? Т.е. им сейчас за 90?
maxout
вряд ли нужно родиться до 1930 года.
вероятнее всего триггер на начале эпохи, то есть 1970 год, когда unix timestamp становится отрицательным. и в переводе отрицательного timestamp в человекочитаемую дату скорее всего и зарыта собака в Safari.
9660
Больше похоже что собака зарыта в странном желании Safari использовать свою базу TZ а не системную.
vitaly_il1
мне тоже так кажется.
Интересно, что на самом деле.
rrrad
Когда работаешь с базой из нескольких миллионов абонентов, такие индивидуумы попадаются
foal
А может просто дату хранить как дату, а не как timestamp?
Ergistael
Столкнулся с этим багом еще на первом айфоне, когда синхронизировал данные с аутлуком. Всё мне перекорежило — а помочь никто не мог. В итоге отказался от указания дня рождения как «весь день» и проверил всех 70-х гг. рождения. А потом и вообще отказался от айфона, т.к. баг не исправляли. Сильно подпортило впечатление…
Yoooriii
Не за горами колонизация Луны и Марса. Будут ли учтены прежние ошибки? Интересно, как там у них с тайм зонами)
Iv38
Да... Сколько не изучай работу с датами, на грабли всё равно наступишь.
YuriPanchul
О, а вот я только что написал пост на смежную тему — про сдвиг на один день в дне рождения на мобильной версии сайта Хабр — habr.com/ru/news/t/559474
Дата 22 декабря 1970 года показывается как 21 декабря 1970 года
Платформа: Google Pixel 3XL Android