Welling Guzman

PHP DateTime createFromFormat c fails

PHP has a datetime format character for ISO 8601 named c, that outputs a datetime string like this: 2019-02-06T23:19:33-01:00.

There's a problem with this character when you use it with DateTime::createFromFormat – it fails.

// Returns false
$datetime = DateTime::createFromFormat('c', '2019-02-06T23:19:33-01:00');

The character can be used with date function, and it works.

$date = date('c');

It also works when it's used with DateTime() class.

$datetime = (new \DateTime())->format('c');

I couldn't find the reason behind this, but I found a workaround. From the datetime string we can use the date and time character formats, what's missing it's what format character to use for the timezone offset.

Why I am trying to do here? I want to confirm the input datetime is of an c format.

After looking at the date function format list, there's a format character to determine the offset time.

P Difference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3) Example: +02:00

Instead of using c, we are going to use the following format: Y-m-d\TH:i:sP.

$datetime = DateTime::createFromFormat('Y-m-d\TH:i:sP', '2019-02-06T23:19:33-01:00');