Веб и кодирование
Проблема 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-битное целое |
|---|---|---|
| 2147483647 | 2038-01-19 03:14:07 | Последнее допустимое значение |
| 2147483648 | 2038-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.