Проблема 2038 года
Проблема 2038 года в вычислительной технике — ожидаемые сбои в программном обеспечении накануне 19 января 2038 года. Данная проблема затронет программы и системы, в которых используется представление времени по стандарту POSIX (UNIX-время), которое представляет собой количество секунд, прошедшее с полуночи 1 января 1970 года. Такое представление времени — это стандарт для Unix-подобных операционных систем (из-за повсеместного использования языка Си).
Описание
В старых 32-битных системах (до середины 1990-х) используется тип данных time_t
для хранения секунд в виде signed int
(32-битного целого со знаком). Самая поздняя дата, которая может быть представлена таким форматом в стандарте POSIX — это 03:14:07, вторник, 19 января 2038 года по Всемирному времени (UTC).
Более позднее время заставит такое поле данных стать отрицательным, как бы закольцевав таким образом время (поскольку отрицательное число может быть воспринято программами как время в 1970 или 1901 году, в зависимости от реализации). В результате любые расчёты, включающие дату позже 19 января 2038 года, могут привести к сбою программы либо к ошибочным вычислениям.
Для проблемы 2038 года не существует простого решения для существующих комбинаций операционных систем и прикладного программного обеспечения.
Изменение определения типа time_t
на 64 бита нарушит бинарную совместимость программ, существующих хранимых данных и всего другого, использующего представление времени в бинарном виде. А приведение time_t
в целое без знака может нарушить работу программ, которые вычисляют разницу во времени.
В большинстве операционных систем для 64-битных архитектур уже используется 64-битное представление целого в time_t
. Переход на такие архитектуры уже происходит, и ожидается, что он будет завершён к 2038 году.
В дополнение к этому, 32-битный формат time_t
также включён в спецификации форматов файлов, таких как повсеместно распространённый архивный формат ZIP. Формат файла может существовать в течение времени, за которое сменятся многие поколения компьютеров, а это означает, что Проблема 2038 останется актуальной.
Введение 64-битного формата вносит новую дату «закольцовывания» — оно произойдёт примерно через 292 миллиарда лет.
Microsoft Windows
Проблема 2038 года актуальна и для 32-разрядных версий Windows, так как значительная часть самой ОС и большое число программ для неё написано на C/C++. Разработчики Windows утверждают[1], что исправили большинство мест в коде, подверженных этой проблеме, однако они не могут дать никаких гарантий по поводу стороннего ПО.
Linux
Начиная с версии 5.6 ядра Linux проблема решена, но по состоянию на 2020 год, существует огромное количество ПО, которое все ещё нужно исправить[2].
MySQL
Популярная СУБД MySQL и SQL Server для типа TIMESTAMP имеет некоторые ограничения: значения, которые содержат дату и время в TIMESTAMP, находятся в диапазоне от ‘1970-01-01 00:00:01 UTC’ до ‘2038-01-19 03:14:07 UTC’[3].
См. также
Примечания
- Year 2038 problem — GES on Windows 7 — Site Home — MSDN Blogs
- Michael Larabel. Linux 5.6 Is The First Kernel For 32-Bit Systems Ready To Run Past Year 2038 (29 января 2020).
- MySQL Dev