PHP: strtotime и даты после 19 января 2038 г.

Я использую функцию strtotime, чтобы найти разницу между двумя заданными датами, например:

$diff_in_mill_seconds = strtotime($ToDate) - strtotime($FromDate);
$difference_in_years = round($diff_in_mill_seconds / (365*60*60*24),1);

Этот сценарий завершается ошибкой, если значение $ ToDate превышает 19 января 2038 года.

Официальная документация PHP гласит:

Допустимый диапазон метки времени обычно с пт, 13 декабря 1901, 20:45:54 UTC, до вторника, 19 января 2038, 03:14:07 UTC.

В документации PHP также говорится:

Не рекомендуется использовать эту функцию для математических операций. Лучше использовать DateTime :: add () и DateTime :: sub () в PHP 5.3 и новее или DateTime :: modify () в PHP 5.2.

Я не могу использовать DateTime :: add () и DateTime :: sub (), поскольку версия PHP на сервере - 5.2.

Итак, как мне рассчитать разницу между двумя датами (после 2038-01-19) в годах, используя php 5.2?


person Prashanth JC    schedule 10.04.2013    source источник
comment
Этот ответ подтверждает мою интуицию - временная метка UNIX переносится, потому что вы находитесь на 32-битной машине. Переключитесь на 64-битную машину, и вы сможете представлять даты, превышающие 2038 год, как временную метку UNIX.   -  person nickb    schedule 10.04.2013
comment
PHP 5.2 и не 64-битная машина? Извините, ничто вам не поможет. Вам просто нужна более новая версия something.   -  person deceze♦    schedule 10.04.2013
comment
@Sabari DateTime::add был специально введен в 5.3.   -  person deceze♦    schedule 10.04.2013
comment
@deceze о, ладно. Спасибо, что дал мне знать.   -  person Sabari    schedule 10.04.2013
comment
Я ответил на него здесь: stackoverflow.com/questions/2012589/   -  person Venkatesh GS Rao    schedule 15.07.2016


Ответы (1)


Это ошибка Y2K38 в UNIX. Это было исправлено в 64-битных реализациях PHP или с использованием DateTime::diff, который не использует целые числа внутри и, следовательно, не страдает от проблемы.

Вам тоже нужно. Без смены платформ нет настоящего решения.

person deceze♦    schedule 10.04.2013