Почему временные метки имеют ограничение до 2038 года?
Я только что узнал, запустив сценарий календаря, что временные метки в PHP имеют ограничение до 2038 года. Что это на самом деле значит? Почему сейчас 2038 год, а не 2050 или 2039? Зачем ограничение, если метки времени просто отсчитывают секунды с заданной даты (1970)?
4 answers
Ограничение налагается 4-байтовыми целыми числами со знаком, которые большинство библиотек C используют для представления этого числа. Быстрая математика (предполагается, что 365 дней в году, не совсем правильно):
2147483648 seconds ~ 68.1 years
Это также подразумевает нижний предел ~1900. Некоторые библиотеки начали вводить 64-битные счетчики эпох, но на данный момент их немного и они далеки друг от друга.
Максимальное значение 32-разрядного целого числа составляет 2 147 483 647. Если вы добавите к этому +1, вы получите -2,147,483,647,2147,483,647 секунды с 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()"
.Я предполагаю, что он хранится в фиксированном количестве битов, что означает ограничение на то, насколько большой может быть временная метка. Мы могли бы немного посчитать, чтобы точно это выяснить.