Веб и кодирование

Проблема 2038 года (Y2K38): переполнение 32-битного времени Unix

Проблема 2038 года возникнет, когда знаковый 32-битный счетчик секунд Unix превысит свое максимальное значение 2 147 483 647.

Опубликовано · Обновлено

Критический момент: 19 января 2038 года

В 03:14:07 UTC число секунд достигнет 2^31 - 1. Следующую секунду нельзя представить знаковым 32-битным целым. Программа может вернуть ошибку, некорректную дату или другое поведение — это зависит от реализации.

Unix time, секундыДата UTCЗнаковое 32-битное целое
21474836472038-01-19 03:14:07Последнее допустимое значение
21474836482038-01-19 03:14:08Выходит за диапазон

Что проверить даже на 64-битной системе

  • Тип time_t и ABI конкретной сборки: приложение или библиотека может использовать 32-битное представление времени.
  • Поля базы данных, файлы и сетевые протоколы: в них может оставаться знаковый 32-битный счётчик секунд.
  • Преобразования между типами и передачу данных соседним сервисам. Один узкий формат может обрезать значение даже при 64-битных вычислениях.
  • Оба граничных значения в тестах: 2147483647 и 2147483648 секунд. Проверяйте чтение, запись и передачу, а не только отображение даты.

Решение проблемы

  • Используйте достаточно широкий тип времени и совместимые с ним библиотеки и интерфейсы.
  • Проверьте диапазон выбранного типа в базе данных и формат миграции. Название TIMESTAMP само по себе не гарантирует нужный диапазон во всех СУБД.
  • Согласуйте изменение форматов файлов и сетевых пакетов со всеми потребителями данных.

Проверьте пример

Преобразуйте максимальную 32-битную секунду со знаком

Это последняя положительная секунда, представимая 32-битным целым со знаком.

2147483647

Ожидаемый результат: Результат UTC: 2038-01-19 03:14:07.

Проверьте пример

Преобразуйте следующую секунду

Современный конвертер представляет это значение, хотя 32-битная система со знаком уже не может.

2147483648

Ожидаемый результат: Инструмент показывает соседний момент времени, а гайд объясняет границу переполнения старых систем.

Проверьте таймстамп

Конвертер меток времени

Проверьте поведение граничных дат 2038 года в Unix Timestamp Converter.

Открыть Timestamp Converter →