О чём этот сайт?
Проблема 2038 года в вычислительной технике — ожидаемые сбои в программном обеспечении накануне 19 января 2038 года. Данная проблема затронет программы и системы, в которых используется представление времени по стандарту POSIX (UNIX-время), которое представляет собой количество секунд, прошедшее с полуночи 1 января 1970 года. Такое представление времени — это стандарт для Unix-подобных операционных систем (из-за повсеместного использования языка Си).
Сейчас значение Unix timestamp равно .
В чём проблема?
В старых 32-битных системах (до середины 1990-х) используется тип данных time_t
для хранения секунд в виде signed int
(32-битного целого со знаком). Самая поздняя дата, которая может быть представлена таким форматом в стандарте POSIX — это 03:14:07, вторник, 19 января 2038 года по Всемирному времени (UTC).
Более позднее время заставит такое поле данных стать отрицательным, как бы закольцевав таким образом время (поскольку отрицательное число может быть воспринято программами как время в 1970 или 1901 году, в зависимости от реализации). В результате любые расчёты, включающие дату позже 19 января 2038 года, могут привести к сбою программы либо к ошибочным вычислениям.
Для проблемы 2038 года не существует простого решения для существующих комбинаций операционных систем и прикладного программного обеспечения. Изменение определения типа time_t
на 64 бита нарушит бинарную совместимость программ, существующих хранимых данных и всего другого, использующего представление времени в бинарном виде. А приведение time_t
в целое без знака может нарушить работу программ, которые вычисляют разницу во времени.
Что подвержено этой проблеме?
Многие структуры данных, которые используются сегодня, имеют 32-битные представления времени, встроенные в их структуру. Полный список этих структур данных практически невозможно составить, но есть хорошо известные структуры данных, у которых есть проблема времени Unix:
- файловые системы (многие файловые системы используют только 32 бита для представления времени в индексных дескрипторах)
- форматы двоичных файлов (в которых используются 32-битные поля времени)
- базы данных (которые имеют 32-битные поля времени)
- языки запросов к базам данных, такие как SQL, которые имеют команды, похожие на
UNIX_TIMESTAMP()
Примеры систем, использующих структуры данных, которые могут содержать 32-битные представления времени, включают:
- встроенные подсистемы управления и мониторинга завода, НПЗ
- различное медицинское, военное оборудование
Любая система, использующая структуры данных, содержащие 32-битные представления времени, представляет риск. Степень риска зависит от характера отказа.
Стоит ли боятся этой проблемы?
Нет. В большинстве операционных систем для 64-битных архитектур уже используется 64-битное представление целого в time_t
. Переход на такие архитектуры уже происходит, и ожидается, что он будет завершён к 2038 году.