Почему метки времени имеют ограничение до 2038 года?

Я только что узнал, запустив скрипт календаря, что временные метки в PHP имеют ограничение до 2038. Что это действительно означает? Почему это 2038 вместо 2050 или 2039? Зачем ограничивать, если временные метки просто отсчитывают секунды от заданной даты (1970)?

4 ответа

Решение

Ограничение накладывается 4-байтовыми целыми числами со знаком, которые большинство библиотек C используют для представления этого количества. Быстрая математика (предполагает 365 дневных лет, не совсем правильно):

2147483648 seconds ~ 68.1 years

Это также подразумевает нижний предел ~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()."

Я предполагаю, что он хранится в фиксированном количестве битов, что означает ограничение того, насколько большой может быть отметка времени. Мы могли бы сделать некоторую математику, чтобы понять это точно.

Другие вопросы по тегам