Question

I need to display and handle UTC dates in the following format:

2013-06-28T22:15:00Z

As this format is part of the ISO8601 standard I have no trouble creating DateTime objects from strings like the one above. However I can't find a clean way (meaning no string manipulations like substr and replace, etc.) to present my DateTime object in the desired format. I tried to tweak the server and php datetime settings, with little success. I always get:

$date->format(DateTime::ISO8601); // gives 2013-06-28T22:15:00+00:00

Is there any date format or configuration setting that will give me the desired string? Or I'll have to append the 'Z' manually to a custom time format?

Was it helpful?

Solution

No, there is no special constant for the desired format. I would use:

$date->format('Y-m-d\TH:i:s\Z');

But you will have to make sure that the times you are using are really UTC to avoid interpretation errors in your application.

OTHER TIPS

If you are using Carbon then the method is:

echo $dt->toIso8601ZuluString();    
// 2019-02-01T03:45:27Z

In order to get the UTC date in the desired format, you can use something like this:

gmdate('Y-m-d\TH:i:s\Z', $date->format('U'));

In PHP 8 the format character p was added:

$timestamp = new DateTimeImmutable('2013-06-28T22:15:00Z');
echo $timestamp->format('Y-m-d\TH:i:sp');
// 2013-06-28T22:15:00Z

To do this with the object-oriented style date object you need to first set the timezone to UTC, and then output the date:

function dateTo8601Zulu(\DateTimeInterface $date):string {
  return (clone $date)
    ->setTimezone(new \DateTimeZone('UTC'))
    ->format('Y-m-d\TH:i:s\Z');
}

Edit: clone object before changing timezone.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top