Почему getdate(1500000000) возвращает 7 июля 2017 г., а getdate(2500000000) возвращает 13 февраля 1913 г.

Вопрос прост, это ошибка или я что-то здесь упускаю, дело в том, что большее значение для getdate возвращает более раннюю дату. Что там не так??


person Marange    schedule 20.04.2017    source источник
comment
Знаете ли вы что-нибудь о двоичных числах, 32-битных целых числах и т. д.?   -  person John3136    schedule 21.04.2017
comment
где твой код?   -  person Pedro Lobito    schedule 21.04.2017
comment
Вообще ничего, я спрашиваю, потому что понятия не имею, почему это происходит, и я боюсь, что мой проект может пойти к черту, потому что я часто использую метки времени unix.   -  person Marange    schedule 21.04.2017
comment
В документах PHPP есть примечание, объясняющее диапазон дат временных меток unix   -  person Mark Baker    schedule 21.04.2017


Ответы (2)


2,500,000,000 превышает максимальное значение для 32-битного целого числа.

Я не знал ответа заранее. Вот ресурсы, которые я использовал, чтобы понять это: http://php.net/manual/en/language.types.integer.php
INT максимальный размер для 32-битной системы

person heylookltsme    schedule 20.04.2017
comment
Ага! Я узнал об этом, прочитав ответ John3136, а затем отредактировал свой, чтобы устранить неточность. Зато ты быстрый ;) - person heylookltsme; 21.04.2017
comment
Итак, как мне быть с этим, мой проект в конечном итоге рухнет?? - person Marange; 21.04.2017
comment
@Marange - либо переключитесь на 64-битный PHP, либо используйте объекты DateTime вместо временных меток unix. - person Mark Baker; 21.04.2017

2500000000 = 0x9502F900 = 1001 0101 0000 0010 1111 1001 0000 0000

т. е. в 32-битной системе установлен бит знака, поэтому вы фактически получили отрицательное число. Поскольку вселенная началась в 1970 году (согласно unix), дата в 1913 году является явным признаком отрицательной метки времени.

person John3136    schedule 20.04.2017