Проблема 2038 года

Проблема 2038 года в вычислительной технике — ожидаемые сбои в программном обеспечении накануне 19 января 2038 года. Данная проблема затронет программы и системы, в которых используется представление времени по стандарту POSIX (UNIX-время), которое представляет собой количество секунд, прошедшее с полуночи 1 января 1970 года. Такое представление времени — это стандарт для Unix-подобных операционных систем (из-за повсеместного использования языка Си).

Пример, показывающий сброс даты (в 03:14:08 UTC 19 января 2038 года).

ОписаниеПравить

В старых 32-битных системах (до середины 1990-х) используется тип данных time_t для хранения секунд в виде 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 миллиарда лет[1], что намного больше возраста Вселенной.

Microsoft WindowsПравить

Проблема 2038 года актуальна и для 32-разрядных версий Windows, так как значительная часть самой ОС и большое число программ для неё написано на C/C++. Разработчики Windows утверждают[2], что исправили большинство мест в коде, подверженных этой проблеме, однако они не могут дать никаких гарантий по поводу стороннего ПО.

LinuxПравить

Начиная с версии 5.6 ядра Linux проблема решена, но по состоянию на 2020 год, существует огромное количество ПО, которое все ещё нужно исправить[3].

MySQLПравить

Популярная СУБД MySQL и SQL Server для типа TIMESTAMP имеет некоторые ограничения: значения, которые содержат дату и время в TIMESTAMP, находятся в диапазоне от ‘1970-01-01 00:00:01 UTC’ до ‘2038-01-19 03:14:07 UTC’[4].

См. такжеПравить

ПримечанияПравить

  1.   секунд это примерно    лет
  2. Year 2038 problem — GES on Windows 7 — Site Home — MSDN Blogs
  3. Michael Larabel. Linux 5.6 Is The First Kernel For 32-Bit Systems Ready To Run Past Year 2038 (29 января 2020).
  4. MySQL Dev