Почему временные метки ограничены 2038 годом?
Вопрос
Я только что узнал, запустив скрипт календаря, что временные метки в PHP имеют ограничение до 2038. Что это на самом деле означает?Почему 2038 вместо 2050 или 2039?Зачем нужен предел, если временные метки просто отсчитывают секунды от заданной даты (1970 г.)?
Решение
Ограничение налагается 4-байтовыми целыми числами со знаком, которые большинство библиотек C используют для представления этого числа.Быстрые вычисления (предполагается, что 365 дней в году, не совсем правильно):
родовое словоЭто также подразумевает нижний предел ~ 1900.Некоторые библиотеки начали вводить 64-битный счетчик эпох, но на данный момент их немного, и они очень редки.
Другие советы
Максимальное значение 32-битного целого числа - 2 147 483 647.Если к этому добавить +1, получится -2 147 483 647.2147483647 секунд с 01-01-1970 00:00:00 - это 19 января 2038 года. Если вы добавите еще одну секунду, вы получите дату где-то в 1902 году.
из-за ограничения типа данных INT на 32-битной машине
http://php.net/manual/en/function.mktime.php
С сайта php.net: "Максимально возможная дата, принимаемая mktime () и gmmktime (), зависит от часового пояса текущего местоположения.
Например, переполнение 32-битной метки времени происходит в 2038-01-19T03: 14: 08 + 0000Z.Но если вы находитесь в часовом поясе UTC -0500 (например, EST в Северной Америке), максимальное допустимое время до переполнения (для более старых версий PHP в Windows) составляет 2038-01-18T22: 14: 07-0500Z, независимо отпередаете ли вы его в mktime () или gmmktime (). "
Я предполагаю, что он хранится в фиксированном количестве бит, что означает ограничение на размер временной метки.Мы могли бы вычислить, чтобы выяснить это точно.