web-dev-qa-db-fra.com

Comment formater une date UTC pour utiliser l'indicateur de zone Z (Zulu) en php?

J'ai besoin d'afficher et de gérer les dates UTC dans le format suivant:

2013-06-28T22: 15: 00Z

Comme ce format fait partie de la norme ISO8601, je n'ai aucun mal à créer des objets DateTime à partir de chaînes comme celle ci-dessus. Cependant, je ne peux pas trouver un moyen propre (ce qui signifie aucune manipulation de chaîne comme substr et replace, etc.) de présenter mon objet DateTime au format souhaité. J'ai essayé de modifier les paramètres de datetime du serveur et php, avec peu de succès. Je reçois toujours:

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

Existe-t-il un format de date ou un paramètre de configuration qui me donnera la chaîne souhaitée? Ou je vais devoir ajouter le "Z" manuellement à un format d'heure personnalisé?

36
sallaigy

Non, il n'y a pas de constante spéciale pour le format souhaité. J'utiliserais:

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

Mais vous devrez vous assurer que les heures que vous utilisez sont vraiment UTC pour éviter les erreurs d'interprétation dans votre application.

82
hek2mgl

Afin d'obtenir la date UTC dans le format souhaité, vous pouvez utiliser quelque chose comme ceci:

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

Pour ce faire avec l'objet de date de style orienté objet, vous devez d'abord définir le fuseau horaire sur UTC, puis sortir la date:

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