Разбор строки даты последнего изменения HTTP в PHP

Я использую FileAPI для получения времени последней модификации файла HTTP-заголовка, который возвращает следующую строку:

Fri Oct 25 2013 12:04:10 GMT+0100 (GMT Daylight Time)

Затем это отправляется в PHP, и мне нужно преобразовать его во что-то разумное, предпочтительно в метку времени. Прежде чем вы предложите это, strtotime() возвращает FALSE.

Кажется, нигде не найти ответа на этот вопрос.


person Community    schedule 06.12.2013    source источник
comment
echo strtotime('Fri Oct 25 2013 12:04:10 GMT+0100'); =› 1382699050. strtotime() МОЖЕТ проанализировать этот формат даты...   -  person marekful    schedule 06.12.2013
comment
Строка, включающая (летнее время по Гринвичу), как указано выше? Это полная строка.   -  person    schedule 06.12.2013
comment
@MarcellFülöp 3v4l.org/CStMB   -  person hek2mgl    schedule 06.12.2013
comment
Спасибо @hek2mgl - это объясняет проблему, которую я вижу - версия php здесь 5.3.3. Пожалуйста, добавьте это как ответ, чтобы я мог принять - я думаю, что это самое полезное объяснение для всех, кто сталкивается с этой проблемой.   -  person    schedule 06.12.2013


Ответы (2)


К счастью, начиная с версии 5.3.0 существует DateTime::createFromFormat(). Хотя он не может анализировать конечную информацию, он, по крайней мере, может игнорировать ее, используя спецификатор +. Вам не нужна эта информация для создания временной метки, поскольку у вас уже есть машинный анализ GMT+0100.

Пример:

$str = "Fri Oct 25 2013 12:04:10 GMT+0100 (GMT Daylight Time)";
$fmt = 'D M d Y H:i:s O+';

$datetime = DateTime::createFromFormat($fmt, $str);
echo $datetime->getTimestamp();

Выход:

1382699050
person hek2mgl    schedule 06.12.2013
comment
Спасибо, хотя регулярное выражение не будет соответствовать, пока я не удалю начальный .* - person ; 06.12.2013
comment
Получив $str из вызова preg_replace, нельзя ли просто использовать strtotime($str) для получения метки времени? Я делаю это, а затем date('Y-m-d H:i:s', $timestamp) для форматирования даты для запроса mysql без проблем (пока :)). Кроме того, можно ли переформулировать этот вопрос, заменив «Форматирование» на «Синтаксический анализ»? Форматирование звучит как преобразование данных в строку, но на самом деле вы пытаетесь преобразовать заголовок строки в значение. - person Neek; 08.02.2014
comment
@Neek preg_replace() не нужен. Проверьте мое обновление. Я должен был более внимательно прочитать документацию, когда ответил на этот вопрос. ;) Вы правы с названием вопроса. Я изменил это. - person hek2mgl; 08.02.2014
comment
strtotime() умеет анализировать строку только до версии PHP 5.2.17 — это неправда. Я использую PHP 5.6.20, и я могу использовать его нормально: strtotime("Tue, 15 Nov 1994 12:45:26 GMT");. - person Dai; 12.12.2016
comment
Я понимаю. Это старый ответ, я не знаю, откуда он у меня - person hek2mgl; 12.12.2016

Что ж, если проблема заключается в строке внутри круглых скобок, вы можете подстроить ее к первой и использовать strtotime, как предложил @Marcell в комментариях.

person MurifoX    schedule 06.12.2013