obtenir l'heure UTC en PHP

122

Comment puis-je obtenir l'horodatage UTC / GMT +/- en utilisant la fonction date () de PHP? Par exemple, si j'essaye

date("Y-m-d H:i:s", time()); 

J'obtiendrai l'horodatage Unix; mais je dois obtenir l'horodatage UTC / GMT avec la chaîne GMT / UTC +/- 0400 ou GMT / UTC +/- 1000 en fonction des horaires locaux.

Robin Michael Poothurai
la source
1
@JeffPuckettII GMT ne change pas pour l'heure d'été. Le Royaume-Uni passe de GMT à BST en été, mais GMT reste le même et correspond toujours à UTC.
lewis

Réponses:

111

L'utilisation gmdaterenverra toujours une date GMT. La syntaxe est la même que pour date.

nikc.org
la source
12
@sanmai: un horodatage Unix est par définition toujours UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: Le problème est que gmdate ("U"), renvoie la même chose que time () qui n'est pas l'horodatage UTC si le fuseau horaire de votre serveur est différent. La seule façon dont j'ai pu obtenir l'horodatage réel basé sur UTC était strtotime (gmdate ("M d YH: i: s")), qui est différent de gmdate ("U"), lorsque le fuseau horaire de votre serveur est différent de UTC
bksi
@bksi Je suis incapable de répéter votre comportement décrit. (Ma machine n'est pas sur GMT et mes horodatages UNIX sont corrects. Aussi gmdate("U") == time().) Sonne comme un comportement potentiellement bogué. Vérifiez et notez un bogue avec le projet PHP.
nikc.org
J'ai utilisé un script PHP simple pour tester le scénario: <? echo time (). "===" .strtotime (gmdate ("M j YH: i: s")). "Fuseau horaire:" .date ("Z"). "\ n"; ?> Quand je l'ai exécuté, j'obtiens ce résultat: 1456342082 === 1456338482 Fuseau horaire: 3600 Le résultat de la date de commande shell est: Mer 24 février 20:28:11 CET 2016
bksi
1
@bksi - Peut-être confondez-vous la représentation interne de datetime avec une représentation externe de datetime? heure sans spécificateur de zone vs heure avec un spécificateur de zone? Comme le dit nikc (et la documentation), time()renvoie "le nombre de secondes depuis l'époque Unix (1er janvier 1970 00:00:00 GMT)". Remarque GMT. Le fait que, par défaut, votre système le convertisse en votre fuseau horaire pour l'affichage, est un avantage pour l'utilisateur. En interne, c'est toujours GMT.
ToolmakerSteve
90

Un simple gmdate () suffira

<?php
print gmdate("Y-m-d\TH:i:s\Z");
Shankar Damodaran
la source
47

Comme précédemment répondu ici , depuis PHP 5.2.0, vous pouvez utiliser la DateTimeclasse et spécifier le fuseau horaire UTC avec une instance de DateTimeZone.

La documentation DateTime __construct () suggère de passer «maintenant» comme premier paramètre lors de la création d'une instance de DateTime et de spécifier un fuseau horaire pour obtenir l'heure actuelle.

$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
Jessedc
la source
3
La documentation DateTime __construct () ne suggère plus d'omettre le premier paramètre pour obtenir l'heure actuelle. Il indique maintenant que vous devez utiliser une chaîne de «maintenant».
PaulSkinner
Merci @PaulSkinner, j'ai modifié la réponse.
Jessedc
Merci, à quoi servent les barres obliques inverses avant DateTime? En l'exécutant moi-même, cela semble fonctionner très bien sans eux.
Neige le
1
@Snow Si ce code est inséré dans du code d'espacement de noms, disons que votre fichier a une namespace Adéclaration en haut, à laquelle PHP supposera DateTimefaire référence A\DateTime, ce qui est faux. L'ajout de la barre oblique inverse résout le problème. C'est une bonne habitude à prendre même si vous n'utilisez pas encore d'espaces de noms, à mon avis.
Niavlys
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Sudhir Bastakoti
la source
3
@AlainTiemblo pas tout à fait; vous devez soustraire le décalage pour le faire fonctionner
sanmai
14
date("Y-m-d H:i:s", time() - date("Z"))
Allanrbo
la source
14

Obtention de la date UTC

gmdate("Y-m-d H:i:s");

Obtention de l'horodatage UTC

time();

Le résultat ne sera pas différent même que vous avez date_default_timezone_setsur votre code.

StefansArya
la source
@ زياد Merci pour la correction, j'ai modifié ma réponse
StefansArya
Je pensais que gmdate () renvoie GMT et non UTC. "Identique à la fonction date () sauf que l'heure renvoyée est l'heure de Greenwich (GMT)". Est-ce que je manque quelque chose? Sont-ils équivalents?
Jordanie
3
@Jordan En pratique, UTC et GMT représentent la même heure. stackoverflow.com/questions/48942916/…
martti
12

Autre que d'appeler, gmdatevous pouvez également mettre ce code avant le reste du code:

<?php
date_default_timezone_set("UTC");
?>

Cela rendra le reste de vos appels liés à la date / heure pour utiliser le fuseau horaire GMT / UTC.

anubhava
la source
Pas plus dans les dernières versions de PHP.
Khom Nazid
1
@KhomNazid "UTC" en tant que paramètre est toujours valide. php.net/manual/en/…
Harikrishna
6

Vous pouvez utiliser la fonction gmmktime sans arguments pour obtenir l'horodatage UTC actuel:

$time = gmmktime();
echo date("Y-m-d H:i:s", $time); 

gmmktime ne fonctionnera que si l'heure de votre serveur utilise UTC. Par exemple, mon serveur est défini sur US / Pacific. la fonction listée ci-dessus fait écho à l'heure du Pacifique.

RicoRico
la source
gmmktime () est obsolète
Jonny
2

avec la chaîne GMT / UTC +/- 0400 ou GMT / UTC +/- 1000 en fonction des horaires locaux

Votre format personnalisé est juste manquant Opour vous donner les décalages de fuseau horaire par rapport à l'heure locale.

Différence par rapport à l'heure de Greenwich (GMT) en heures Exemple: +0200

date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');

12/01/2018 12:10:11 -0400

Cependant, pour une portabilité / interopérabilité maximisée, je recommanderais d'utiliser le format de date ISO8601c

date_default_timezone_set('America/La_Paz');
echo date('c');

2018-01-12T12: 10: 11-04: 00

date_default_timezone_set('Australia/Brisbane');
echo date('c');

2018-01-13T02: 10: 11 + 10: 00

Vous pouvez également utiliser gmdateet la chaîne de décalage du fuseau horaire sera toujours+00:00

date_default_timezone_set('America/La_Paz');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

Jeff Puckett
la source
1

Vous pouvez utiliser ce qui suit pour obtenir l'heure UTC:

date_default_timezone_set('Asia/Calcutta');

$current_date = date("Y/m/d g:i A");

$ist_date = DateTime::createFromFormat(
                        '"Y/m/d g:i A"',
                        $current_date,
                        new DateTimeZone('Asia/Calcutta')
                    );

$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));

echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');
Dalip
la source
0
/**
     * Converts a local Unix timestamp to GMT
     *
     * @param   int Unix timestamp
     * @return  int
     */
    function local_to_gmt($time = '')
    {
        if ($time === '')
        {
            $time = time();
        }

        return mktime(
            gmdate('G', $time),
            gmdate('i', $time),
            gmdate('s', $time),
            gmdate('n', $time),
            gmdate('j', $time),
            gmdate('Y', $time)
        );
    }
realmag777
la source
0

Vous trouverez ci-dessous le code PHP pour obtenir l'heure UTC (temps universel coordonné) actuel

<?php
// Prints the day
echo gmdate("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>

Shivasagar
la source