PHP strtotime возвращает false для дат менее 1900

Я знаю, что этот вопрос очень популярен

Здесь задан вопрос PHP: strtotime возвращает false для будущей даты? и здесь Как я могу работать с датами до 1900 в PHP?

Не могли бы вы подтвердить мой выбор:

  1. Обновление до 64-битной архитектуры

  2. Замените вызовы strtotime на DateTime + DateInterval. Мы не можем вызывать DateTime->getTimestamp, но мы можем использовать DateInterval для вычисления разницы.

Есть ли у меня другие варианты? К сожалению, я не могу выбрать вариант 2, потому что я полагаюсь на ORM (Propel) + много устаревшего кода, использующего strtotime. Рефакторинг этого материала + настройка генераторов ORM может быть дороже, чем обновление до 64-битной версии.

Если бы кто-нибудь мог подтвердить или предложить какие-либо другие варианты, это было бы очень признательно.

Спасибо

Формат даты — стандартный гггг-мм-дд.

PHP версии 5.3.2


person hbt    schedule 25.08.2011    source источник
comment
Было бы полезно, если бы вы указали, в каком формате находится строка. strtotime() принимает множество форматов, если у вас есть конкретный, который может помочь.   -  person Paul    schedule 26.08.2011
comment
Вы все равно должны перейти на 64-битную версию, нет причин не делать этого. Вы должны будете в конце концов.   -  person netcoder    schedule 26.08.2011
comment
Кстати, какую версию PHP вы используете?   -  person netcoder    schedule 26.08.2011


Ответы (2)


Насколько я знаю, вы ограничены этими двумя решениями.

Вам следует обновиться до 64-битной системы, если вы можете себе это позволить, и если это решит проблему, то это лучше.

Изменить: Просто нужно было проверить: http://php.net/manual/en/function.runkit-function-redefine.php Возможно, вы могли бы попробовать переопределить strtotime() для работы с датами до 1901 года.

person Ibrahim AshShohail    schedule 26.08.2011
comment
runkit - это вариант, но его последнее обновление датируется 2006 годом, поэтому, вероятно, он не будет работать с последними версиями PHP (apd еще хуже). - person netcoder; 26.08.2011
comment
Обновление до 64-бит действительно решит эту проблему. Хотя я бы подумал о переходе на расширение DateTime. - person Narf; 27.08.2011

Вы можете использовать gregoriantojd, который имеет диапазон дат 4714 г. до н.э. до 9999 г. н.э. Гораздо более широкий диапазон, чем 1900 (1970)-2038 гг. Если вы пытаетесь рассчитать разницу дат, они достаточно близки. Ну, за исключением «потерянных» 10 дней с 4 по 14 октября 1582 года. И из-за другого расчета високосного года вы будете ошибаться на день каждые 100 лет.

person Brent Baisley    schedule 26.08.2011
comment
Спасибо. Однако это означает, что мне придется реорганизовать каждый вызов, сделанный с использованием strtotime, в gregoriantojd, что очень похоже на решение 2, за исключением того, что gregoriantojd работает только с датами, а не обязательно с отметками времени. - person hbt; 26.08.2011
comment
Ныть, ныть, ныть :) До недавнего времени большинство стандартных функций времени/даты в большинстве ОС не могли выражать дату ранее 1 января 1970 года. И вернулись к 0 19 января 2038 года. en.wikipedia.org/wiki/Year_2038_problem. Обходной путь, конечно, заключался в том, чтобы не использовать стандартные функции даты/времени, а хранить дату в каком-то другом формате (например, в строке 1/1/1 н.э.. - person paulsm4; 27.08.2011