PHP strtotime дает неправильную дату с преобразованием GMT?

Я читаю заголовок Last-Modified, который в виде строки "Пн, 21 мая 2013 г. 09:10:30 по Гринвичу" и пытаюсь сравнить это с моим местным временем () (Новая Зеландия). Но я только что заметил, что strtotime делает дату "27" вместо "21", когда "Mon" включено в строку. Это нормально? Я делаю что-то неправильно? Думаю, я что-то упустил...

$strtotime = strtotime("Mon, 21 May 2013 09:10:30 GMT");
$strtotime_date = date("Y-m-d H:i:s",$strtotime);

//[strtotime] => 1369645830
//[strtotime_date] => 2013-05-27 21:10:30

2 ответа

Решение
  1. Причина ошибки в том, что ничего подобного Mon, 21 May 2013 из моего календаря 21stMay является Tuesday

  2. Из PHP DOC

Даты в форматах m/d/y или dmy устраняются, если посмотреть на разделитель между различными компонентами: если разделитель является косой чертой (/), то предполагается, что используется американский m/d/y; тогда как, если разделителем является тире (-) или точка (.), то подразумевается европейский формат dmy.

Чтобы избежать двусмысленности, лучше всего использовать даты ISO 8601 (ГГГГ-ММ-ДД) или DateTime::createFromFormat(), когда это возможно.

Примеры

$strtotime = strtotime("Tue, 21 May 2013 09:10:30 GMT");
echo date("Y-m-d H:i:s", $strtotime),PHP_EOL;

$strtotime = DateTime::createFromFormat("D, d M Y g:i:s O", "Tue, 21 May 2013 09:10:30 GMT");
echo $strtotime->format("Y-m-d H:i:s");

Выход

2013-05-21 11:10:30  <- strtotime
2013-05-21 09:10:30  <- datetime 

Согласно php.net, этот формат может быть недействительным; здесь есть список допустимых форматов: http://www.php.net/manual/en/datetime.formats.php - день недели не указан.

Другие вопросы по тегам