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


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

Author: Shoe, 2011-05-04

4 answers

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

2147483648 seconds ~ 68.1 years

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

 19
Author: Matthew Scharley, 2011-05-04 05:58:57

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

 19
Author: Sander Marechal, 2011-05-04 06:01:23

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

.
 3
Author: DhruvPathak, 2011-05-04 05:57:04

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

 1
Author: pocketfullofcheese, 2011-05-04 05:57:19