Время и дату в компьютерных программах можно хранить по разному. Один из способов хранения даты - это использование стандарта POSIX (UNIX Timestamp, Unix Epoch).
В стандарте POSIX время записывается как количество секунд, прошедших с 0 часов 0 минут 0 секунд 1 января 1970 года по Всемирному времени (UTC). Для Unix-подобных операционных систем - это стандарт представления времени.
Дата в таком формате записывается как обычное целое число - число секунд. Очевидно, что чем позднее дата от даты 1 января 1970, тем больше секунд прошло с этой даты. Значит тем большее значение нужно сохранять в программах, использующие даты.
Например:
В старых программах (а иногда даже в новых) дата часто хранится в целочисленном 32-х битном знаковом формате - Signed Int. Это означает, что под число выделяется 32 бита:
00000000 00000000 00000000 00000000
Максимальное число, которое можно сохранить, используя 31 бит, это число 2147483647. В 32-х битном знаковом целочисленном формате записывается оно следующим образом:
01111111 11111111 11111111 11111111
В POSIX это число соответствует дате 19.01.2038 03:14:07. Как видим, это и есть 19 января 2038 года.
Что произойдет 19 января 2038 года
Могут произойти сбои программного обеспечения различной степени серьезности, могут произойти потери данных, программы могут начать работать не так, как ожидается.
Рассмотрим, что именно произойдет внутри программ. Числа больше 2147483647 не влезают в 31-бит.
Например, для числа 2147483647 + 1 = 2147483648 нужно уже 32 бита. Это число записывается в двоичной системе, как единица в старшем разряде и 31 ноль:
10000000 00000000 00000000 00000000
Для 32-х битного типа Signed Integer - это число соответствует числу: -2147483648. Как было сказано выше, 1 в первом разряде обозначает отрицательное число.
Получается, что числа больше 2147483647 уже нельзя записать в 31 бит, но так как у нас есть еще один бит для хранения знака, программа запишет эти числа в память, но в программе они будут трактоваться как отрицательные числа.
Происходит как бы зацикливание числа. Если говорить о количестве секунд, увеличивающихся на 1, то они достигают значения 2147483647, а потом переходят в отрицательную область: -2147483648, -2147483647, -2147483646 и т.д. В программах такие числа будут трактоваться как 1970-й или 1901-й год (зависит от реализации).
Так ли все серьезно
Современные 64-х разрядные системы не подвержены данной проблеме, поэтому на них она никак не повлияет.
Для существующих 32-разрядных программ и систем уже выпущено множество патчей для исправления данной проблемы. Например, Microsoft, как он утверждает, уже обнаружил и исправил проблемы в 32-х разрядных версиях Windows.
Но все программы не исправить, поэтому многие из них остаются в зоне риска. Более того, даже сейчас выпускается множество 32-х битных систем, особенно встраиваемых.
Наибольшую опасность здесь представляет программное обеспечение, которое используется в промышленных областях. Для управления станками, машинами, отвечающие за работу заводов, электростанций, медицинских приборов, военных устройств и других важных объектов.
Поэтому, если не предпринимать никаких действий, то последствия проблемы 2038 года могут от смешных до катастрофических.
Source: Orkhan Alishov's notes