31 декабря 2008 года плееры Microsoft Zune на 30 гигабайт по всему миру зависли на загрузочном экране. Microsoft советовала дождаться, пока сядет батарея, потом не трогать плеер до полудня 1 января по Гринвичу и только тогда ставить на зарядку. И это работало, потому что плеер сломала дата.
На таких днях спотыкаются айфоны, облачные сервисы, навигаторы и даже Excel. Ближайший похожий повод — уже в это воскресенье, для всего, что настроено на европейское время.
Коротко: техника ломается на датах по трём причинам. Первая — календарь полон исключений, а программы проверяют на обычных днях. Вторая — у счётчика времени есть потолок, как у одометра. Третья — власти меняют правила перевода часов. Ближайший повод — 25 октября: Европа переводит часы, и у неточно настроенных устройств время может уйти. С 2027 года лишнюю секунду добавлять перестанут, а на 2036 и 2038 годы приходятся переполнения сразу трёх счётчиков.
Почему дата — самое коварное число для компьютера
Компьютер не знает, что такое воскресенье или 29 февраля. Внутри у него одно большое число: сколько секунд прошло от условной точки отсчёта. У большинства систем это полночь 1 января 1970 года, у протокола сетевого времени — 1 января 1900-го, у GPS — 6 января 1980-го. Дату для экрана программа вычисляет из этого числа сама, по правилам календаря.
Дело в том, что календарь — это не таблица умножения, а свод исключений, накопленных за века. Год обычно длится 365 дней, но каждый четвёртый — 366, хотя 1900-й, 2100-й и любой другой год на 00, кроме делящихся на 400, високосным не считается. Сутки обычно длятся 86 400 секунд, но иногда в них вставляют лишнюю. А время в целой стране может сдвинуться на час просто потому, что так решили власти.
Программист пишет правило, проверяет его на обычных днях, и всё работает. Исключение наступает раз в четыре года или раз в несколько лет, поэтому в тесты оно попадает редко, и ошибка остаётся в программе до нужного дня.
Вторая беда — в самом счётчике. У него фиксированное число разрядов, и рано или поздно он доходит до максимума. Так бывает со счётчиком пробега на старой «девятке»: домотал до 99 999, перещёлкнул на нули — и по приборам машина снова новая. Хозяин-то знает правду, а программа знает только то, что показал ей счётчик. Когда запаса хватает на десятки лет, проблема выглядит далёкой, пока эти десятки лет не проходят.
1 января 1970-го: айфон, который не хотел включаться
В феврале 2016 года по сети разошёлся розыгрыш: поставьте на айфоне дату 1 января 1970 года, перезагрузите — и увидите ретро-логотип. Логотипа никто не увидел. Телефон зависал на яблоке и дальше не загружался.
Попадались iPhone 5s и всё, что вышло позже, а также iPad Air, iPad mini 2 и iPod touch шестого поколения — устройства на 64-битных процессорах. Позже выяснилось, что опасна любая дата до мая 1970 года: после перезагрузки телефон мог больше не включиться. Причину Apple так и не объяснила.
Одна из версий связана с часовым поясом. Для системы полночь 1 января 1970 года — это ноль секунд, и любая поправка рядом с нулём может увести счёт в минус. Где-то в глубине системы отрицательного числа, видимо, не ждали, и загрузка обрывалась.
Исправление пришло в iOS 9.3: дату раньше 2001 года там выбрать просто нельзя. Но история на этом не закончилась. В апреле 2016 года исследователи показали, что вручную ничего крутить не нужно: достаточно поддельной точки Wi-Fi, которая раздаёт телефону неверное время. Айфоны по умолчанию сверяют часы с сервером в сети, и поддельный сервер мог отправить телефон в 1970 год без ведома владельца. Эту дыру закрыли в ближайшем обновлении iOS. Тем, у кого телефон уже завис, Apple советовала обращаться в поддержку: часть айфонов оживала сама после полной разрядки, остальным помогали в сервисе.
На современных айфонах и Android-смартфонах этот трюк уже не работает. Но играть с датой вручную всё равно плохая идея: со сбитыми часами перестают работать банковские приложения, оплата телефоном и одноразовые коды. Почему так происходит — в разборе о том, почему не работает оплата телефоном.
29 февраля: день, который программы не ждут
Вернёмся к Zune: там сломался не сам день 29 февраля, а последний день високосного года. Виновником оказался драйвер часов в контроллере питания, и владельцы плееров Toshiba Gigabeat S с тем же драйвером жаловались на такое же зависание. Драйвер вычислял текущий год, отнимая от общего числа дней по 365 или 366. На 366-й день високосного 2008 года счёт не сходился, и программа крутилась на месте до конца суток. Когда наступало 1 января, счёт сходился и плеер оживал. Отсюда и странный совет: нужно было просто дождаться, пока неудачный день закончится.
29 февраля 2012 года такая же ошибка уронила облако Microsoft Azure, на котором работали сайты и сервисы тысяч компаний. Виртуальная машина при запуске получала сертификат на год, и срок окончания ставился на тот же день следующего года. 29 февраля плюс год давало 29 февраля 2013-го, такого дня в календаре нет, поэтому сертификат не создавался и машина не запускалась. Azure считал, что виноват сервер, и переносил машины на соседние, где всё повторялось. Сбой начался в полночь по Гринвичу, а полностью сервис восстановили примерно через 34 часа. Клиентам вернули треть месячной оплаты.
Казалось бы, за 12 лет урок усвоили. Но 29 февраля 2024 года в Новой Зеландии на несколько часов встали терминалы самообслуживания на заправках сразу нескольких сетей, и производитель признал ошибку високосного года. В тот же день в Швеции отказали кассовые терминалы в магазинах и аптеках крупной сети, а в Париже в полночь погасло уличное освещение.
Excel до сих пор верит в 29 февраля 1900 года
Откройте Excel и введите в ячейку =ДАТА(1900;2;29). Таблица спокойно примет дату, которой никогда не было: 1900 год не делится на 400, поэтому високосным не считается.
Ошибка досталась Excel по наследству. В 80-х главной программой электронных таблиц была Lotus 1-2-3, и в ней 1900 год по ошибке считался високосным. Microsoft делала Excel совместимым с Lotus, чтобы файлы переносились без потерь, поэтому скопировала и систему нумерации дат вместе с ошибкой.
Не исправляют её и сейчас. Каждая дата в Excel хранится как порядковый номер дня: 1 января 1900 года — это 1, а несуществующее 29 февраля получило номер 60. Если выбросить этот день, почти все даты во всех документах мира съедут на единицу, а таблицы перестанут совпадать с другими программами. По-моему, сделка честная: неверный день недели в 1900 году не мешает никому, а сдвинутые даты помешали бы всем.
Почти нигде. Неверным получается только день недели для дат до 1 марта 1900 года: функция ДЕНЬНЕД ошибается на один день. Все остальные годы, включая 2100-й, Excel считает правильно.
Мы каждую неделю разбираем технику вокруг нас — спокойно и по делу, без рекламных штампов. Подпишитесь на «Техпросто» в MAX, Telegram или Дзене, и такие разборы будут приходить сами.
Минута из 61 секунды
Земля вращается неравномерно, а атомные часы идут идеально ровно. Чтобы мировое время не убегало от солнечного, с 1972 года в него вставили 27 лишних секунд. В такие ночи часы показывают 23:59:60, и минута длится 61 секунду.
30 июня 2012 года лишняя секунда вызвала сбой в ядре Linux, на котором работает большая часть интернет-серверов. Таймеры системы оказались на секунду впереди часов и разом разбудили множество программ, которые должны были просыпаться в разное время. Процессоры ушли в полную загрузку и так и работали вхолостую. Reddit на время почти перестал открываться, пострадали Mozilla и Gawker, а у авиакомпании Qantas около часа не работала система бронирования, так что пассажиров регистрировали вручную. У немецкого хостинга Hetzner потребление электричества подскочило примерно на мегаватт и держалось, пока серверы не перезагрузили.
Лишнюю секунду в новогоднюю ночь 2017 года не пережила Cloudflare — компания, через которую работает заметная часть сайтов в мире. В её программе для DNS, адресной книги интернета, время ответа получалось как разница между текущим временем и временем запроса. Когда часы отступили на секунду назад, разница получилась отрицательной, и программа падала. На пике сбоило около 0,2% запросов к DNS. Самые проблемные серверы починили за полтора часа, а последние следы сбоя убрали только к утру. А всё потому, что программисты были уверены: время не может идти назад.
Крупные компании давно не вставляют секунду скачком. Google, например, растягивает её на сутки: с полудня до полудня каждая секунда на его серверах чуть длиннее обычной, и лишняя набирается незаметно.
А 15 октября 2026 года Генеральная конференция по мерам и весам проголосовала за то, чтобы лишние секунды больше не добавлять. С 20 мая 2027 года мировое время пойдёт без вставок, а расхождению с вращением Земли разрешат копиться, пока оно не дорастёт до часа. Дело в том, что Земля в последние годы временами вращается чуть быстрее, и впервые замаячила отрицательная секунда — минута длиной 59 секунд. Такого не случалось ни разу, и как на неё отреагируют программы, толком никто не знает, поэтому рисковать не захотели.
GPS раз в 19,6 года забывает, какая сейчас неделя
Спутники GPS передают время в виде номера недели и секунды внутри неё. На номер недели в старом формате сигнала отведено 10 бит, это 1024 недели, примерно 19,6 года. Потом счётчик сбрасывается в ноль, и приёмник, который об этом не знает, решает, что на дворе снова 1980 год, или выдаёт дату на 20 лет назад.
Первый сброс случился в ночь с 21 на 22 августа 1999 года, второй — с 6 на 7 апреля 2019-го. О сбросе знали двадцать лет, и всё равно в 2019-м оборудование, которое брало дату у старого GPS-приёмника, получило её на 20 лет назад. Рейс KLM из Амстердама в Боготу вылетел с опозданием на 7 часов из-за необновлённой программы управления полётом, а в Нью-Йорке отключилась беспроводная сеть городских служб. Пострадали и старые смартфоны, проданные в 2013 году и раньше. Если старый автомобильный навигатор показывает дату из прошлого, обновите прошивку на сайте производителя.
Следующий сброс придётся на ночь с 20 на 21 ноября 2038 года. Новые сигналы GPS отводят на номер недели 13 бит, и этого хватит до 2137 года, но старые приёмники к тому моменту наверняка ещё где-то будут работать. Откат номера недели ГЛОНАСС не касается: он передаёт дату номером дня, а не недели.
Подробнее о том, откуда вообще взялась спутниковая навигация, — в материале о вещах, которые придумали совсем для другого.
Перевод часов и часовые пояса
Чтобы показать местное время, телефону и компьютеру нужен справочник: в каком поясе город и когда там переводят часы. Справочник зашит в систему и обновляется вместе с ней, а законы меняются быстрее.
Весной 2011 года Россия в последний раз перевела часы на летнее время и решила больше их не трогать. Но утром 30 октября 2011 года многие телефоны и компьютеры по старой памяти сами перевели время на час назад, и кто-то опоздал на работу, а кто-то пришёл на час раньше. Microsoft ещё в августе выпустила для Windows обновление с новыми правилами для Москвы, но поставили его далеко не все. В 2014 году Россия вернулась на зимнее время, и всё повторилось: снова срочные обновления справочника часовых поясов для Windows, Android и iOS.
Европа часы до сих пор переводит и в воскресенье, 25 октября 2026 года, уходит на зимнее время. Если в то утро какие-то часы в доме сами сдвинулись на час, скорее всего, в их настройках стоит европейский часовой пояс или включён переход на летнее время, а бывает, что в прошивке устарел справочник поясов. Выберите в настройках пояс Москвы и отключите переход на летнее время.
На iPhone: Настройки → Основные → Дата и время → Автоматически. На Android: Настройки → Система → Дата и время (на Samsung — Общие настройки → Дата и время), там включите автоматические дату и часовой пояс. От точных часов зависят оплата телефоном, банковские приложения и одноразовые коды для входа: например, «неверный код» из приложения-генератора при входе в Госуслуги нередко означает, что на телефоне сбились часы.
2036 и 2038: следующие в очереди
Когда телефон или роутер сверяет часы через интернет, он пользуется протоколом сетевого времени NTP. Тот считает секунды с 1 января 1900 года, и под них отведено 32 бита. Счётчик переполнится 7 февраля 2036 года в 06:28:16 по Гринвичу.
Но на этот случай в протоколе давно предусмотрели запас, так что телефоны, компьютеры и роутеры с обновлёнными прошивками переход не заметят. Хуже придётся простой технике, у которой после отключения питания часы сбрасываются на 1970 или 2000 год, и встроенной электронике, которую никто не обновляет.
Через два года после этого, 19 января 2038 года в 03:14:07 по Гринвичу, переполнится 32-битный счётчик Unix-времени, и техника со старой прошивкой решит, что на дворе декабрь 1901 года. Современные телефоны и компьютеры считают время 64-битным числом, их это не затронет. Подробно эту историю мы разобрали в материале о странностях компьютера, которые достались нам от 80-х.
На 2038 год приходятся сразу два переполнения: в январе — у счётчика Unix-времени, в ноябре — у номера недели в старом сигнале GPS. Причины у них разные, а совпадение случайное.
Частые вопросы
Может ли сломаться мой телефон, если поставить неправильную дату? Современный — нет: такого бага, как у айфонов 2016 года, ни в iOS, ни в Android больше нет. Но со сбитыми часами перестанут работать оплата, банковские приложения и коды подтверждения, а некоторые сайты начнут ругаться на сертификат безопасности.
Что будет с техникой 29 февраля 2028 года? Вероятно, где-то снова откажет что-нибудь непроверенное: терминал, умные часы, камера. Но массовых сбоев ждать не стоит: о такой дате знают заранее, и большинство систем её успевают проверить.
Почему телефон после полной разрядки показывает 1970 или 2000 год? Когда батарея садится в ноль, часы телефона могут откатиться к начальной точке отсчёта. Стоит подключиться к мобильной сети или Wi-Fi, и при включённом автоматическом времени оно подтянется само.
О 29 февраля, о лишней секунде и о сбросе недель GPS знали за годы, и каждый раз где-то оставался кусок кода, который проверили на всех днях, кроме нужного. В 2036 и 2038 годах, скорее всего, будет то же самое: большие сервисы подготовятся, а споткнётся забытый контроллер в котельной, который двадцать лет показывал верное время и ни разу не обновлялся.