Parsing HTTP 'Last-Modified' Date string in PHP

2.9k Views Asked by At

I am using FileAPI to get the HTTP-header Last-Modified time of a file, which is returning the following string:

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

This is then posted to PHP and I need it converted to something sensible, preferably a timestamp. Before you suggest it, strtotime() returns FALSE.

Can't seem to find any answer to this anywhere.

3

There are 3 best solutions below

5
On BEST ANSWER

Fortunately since 5.3.0 there is DateTime::createFromFormat(). Although it cannot parse the trailing information it is at least able to ignore it using the + specifier. You don't need that information in order to create a timestamp as you already have the, machine parsable, GMT+0100.

Example:

$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();

Output:

1382699050
0
On

Well, if the problem is the string inside the parentheses, you could substring it to the first one and use strtotime as @Marcell suggested in the comments.

0
On

This is a late answer but the accepted answer is based on the OP's question and not on the real format used by Last-Modified header. There is a missing comma (,) after the day of the week and the data order is not right.

The official format for Last-Modified header is:

Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT

Therefore, the date format you get from the header should be different and the format to use already exists in the DateTime interface as DateTimeInterface::RFC7231:

$str = "Fri,25 Oct 2013 12:04:10 GMT";
$datetime = DateTime::createFromFormat($fmt, $str);

echo $datetime->getTimestamp();

I know this is different from what the OP asked but the HTTP protocol has a different format than what was written by the OP.

This answer should be seen as complementary.