Почему метки времени имеют ограничение до 2038 года? - PullRequest
25 голосов
/ 04 мая 2011

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

Ответы [ 4 ]

21 голосов
/ 04 мая 2011

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

2147483648 seconds ~ 68.1 years

Это также подразумевает нижний предел ~ 1900.Некоторые библиотеки начали вводить 64-битные отсчеты эпох, но на данный момент их мало, и они далеки друг от друга.

20 голосов
/ 04 мая 2011

Максимальное значение 32-разрядного целого числа составляет 2 147 483 647.Если вы добавите +1 к этому, вы получите -2 147 483 647.2 147 483 647 секунд с 01-01-1970 00:00:00 по 19 января 2038 года. Если вы добавите еще одну секунду, вы получите дату где-то в 1902 году.

3 голосов
/ 04 мая 2011

из-за ограничения типа данных 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 (). "

1 голос
/ 04 мая 2011

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

...