strtotime возвращает текущий год, когда входные данные имеют формат YYYY и значение больше 1999 - PullRequest
3 голосов
/ 24 февраля 2012

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

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

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

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

Вывод показывает: 1999

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

Вывод показывает: 1981

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

Вывод показывает: 2012

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

Вывод показывает:2012

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

Любой ввод высоко ценится.

Ответы [ 5 ]

4 голосов
/ 24 февраля 2012

Согласно PHP формат даты / времени документы:

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

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

1 голос
/ 24 февраля 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
1 голос
/ 24 февраля 2012

Попробуйте префикс лет с Jan 1,.

Например:

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

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

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

0 голосов
/ 18 ноября 2014

$plaintext = '2004'; //'2004-11','2004-5','2004-5-1','2004/5-1','2004/08/10'
echo date('Y', strtotime( (strlen($plaintext)==10?$plaintext: (strlen($plaintext)==7? str_replace('-','/',$plaintext).'/01': (strlen($plaintext)==4?$plaintext.'/01/01':$plaintext) )
)));

0 голосов
/ 24 февраля 2012

Используйте это:

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

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

...