strtotime возвращает текущий год, если ввод в формате ГГГГ и значение больше 1999 года.

Я не уверен, что это ошибка, так как после поиска я не могу найти повторяющихся событий, однако это поставило меня в тупик.

Посреди (довольно болезненного) сценария, предназначенного для преобразования множества записей свободного текста в полезные записи даты, мой верный друг strtotime(), похоже, подвел меня.

В целях тестирования я свел код к следующему:

<?=date('Y', strtotime("1999"));?>

Выходные данные: 1999 г.

<?=date('Y', strtotime("1981"));?>

Выходные данные: 1981 г.

<?=date('Y', strtotime("2001"));?>

Выходные данные: 2012 г.

<?=date('Y', strtotime("2021"));?>

Выходные данные: 2012 г.

Все выглядит нормально, пока ввод не превысит «1999». С этого момента каждый год до и после текущего возвращает текущий год (2012).

Любой вклад очень ценится.


person cailen    schedule 23.02.2012    source источник
comment
strtotime никогда не был надежным, и это определенно не ваш друг. это просто выщелачивание, цепляющееся изо всех сил, болтающее о лучших альтернативах, таких как DateTime.   -  person Marc B    schedule 24.02.2012


Ответы (4)


В соответствии с форматом даты/времени в PHP:

Формат «Год (и только год)» работает только в том случае, если строка времени уже найдена — в противном случае этот формат распознается как ЧЧ ММ.

(2-е последнее примечание на странице).

person Marc B    schedule 23.02.2012
comment
Пришлось достаточно осторожно согласиться с ответом, который назвал меня не RTFM. Всем спасибо, очень помогло. - person cailen; 24.02.2012
comment
Извините, а что значит, что строка времени уже найдена в отношении перехода года в strtotime? - person Euri Pinhollow; 13.11.2017

Попробуйте поставить перед годами префикс Jan 1,.

Например:

<?=date('Y', strtotime("Jan 1, 2021"));?> выводит 2021 как и ожидалось.

Я предполагаю, что это связано с тем, что некоторые годы могут быть неправильно проанализированы как пары месяц/день, например, «2012» интерпретируется как «20 декабря текущего года».

Если вам нужны доказательства для себя, попробуйте изменить формат даты на r:
<?=date('r', strtotime('2001'));?> дает Thu, 23 Feb 2012 20:01:00

person Mr. Llama    schedule 23.02.2012

Проблема в том, что он анализируется как время, что вы можете увидеть, если вы используете date('c') вместо date('Y');.

php > var_dump(date('c', strtotime("2001")));
string(25) "2012-02-23T20:01:00+01:00"

Вы должны передать однозначное значение, например 2012-01-01.

Другим решением является использование функции, которая позволяет указать формат данного ввода, например strptime(), или DateTime::createFromFormat()

php > echo DateTime::createFromFormat('Y', '2001')->format('c');
2001-02-23T22:29:56+01:00
person KingCrunch    schedule 23.02.2012

Использовать это:

echo date('Y', strtotime("1/1/2001"));
echo date('Y', strtotime("1/1/2021"));

Использование 4 цифр в качестве даты может быть интерпретировано как время, вы должны использовать более конкретный формат, чтобы убедиться, что функция работает так, как вы ожидаете. Итак, 2021 год — это 20:21 (24-часовой формат) 2012 года.

person John    schedule 23.02.2012