ottenere l'ora UTC in PHP


122

Come posso ottenere il timestamp UTC / GMT +/- utilizzando la funzione date () di PHP? Ad esempio, se provo

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

Otterrò il timestamp Unix; ma ho bisogno di ottenere il timestamp UTC / GMT con la stringa GMT / UTC +/- 0400 o GMT / UTC +/- 1000 in base agli orari locali.


1
@ JeffPuckettII GMT non cambia per l'ora legale. Il Regno Unito cambia da GMT a BST in estate, ma il GMT rimane lo stesso e corrisponde sempre all'UTC.
lewis

Risposte:


111

L'utilizzo gmdaterestituirà sempre una data GMT. La sintassi è la stessa di date.


12
@sanmai: un timestamp Unix è per definizione sempre UTC. en.wikipedia.org/wiki/Unix_time
nikc.org

1
@ nikc.org: il problema è che gmdate ("U"), restituisce lo stesso di time () che non è il timestamp UTC se il fuso orario del sistema del server è diverso. L'unico modo in cui sono stato in grado di ottenere un timestamp reale basato su UTC è stato strtotime (gmdate ("M d YH: i: s")), che è diverso da gmdate ("U"), quando il fuso orario del tuo server è diverso da UTC
bksi

@bksi Non sono in grado di ripetere il comportamento descritto. (La mia macchina non è su GMT e i miei timestamp UNIX sono corretti. Inoltre gmdate("U") == time().) Suona come un comportamento potenzialmente difettoso. Ricontrolla e segnala un bug con il progetto PHP.
nikc.org

Ho usato un semplice script php per testare lo scenario: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Timezone:" .date ("Z"). "\ n"; ?> Quando l'ho eseguito ottengo questo risultato: 1456342082 === 1456338482 Fuso orario: 3600 Il risultato della data del comando shell è: mercoledì 24 febbraio 20:28:11 CET 2016
bksi

1
@bksi - Forse stai confondendo la rappresentazione interna di datetime con la rappresentazione esterna di datetime? ora con uno specificatore di zona rispetto all'ora con uno specificatore di zona? Come dice nikc (e la documentazione), time()restituisce "il numero di secondi dall'epoca di Unix (1 gennaio 1970 00:00:00 GMT)". Nota GMT. Il fatto che per impostazione predefinita il sistema lo converta nel fuso orario per la visualizzazione è una comodità dell'utente. Internamente, è sempre GMT.
ToolmakerSteve


47

Come già risposto qui , a partire da PHP 5.2.0 è possibile utilizzare l'estensioneDateTime classe e specificare il fuso orario UTC con un'istanza di DateTimeZone.

La documentazione di DateTime __construct () suggerisce di passare "now" come primo parametro quando si crea un'istanza di DateTime e si specifica un fuso orario per ottenere l'ora corrente.

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

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC

3
La documentazione di DateTime __construct () non suggerisce più di omettere il primo parametro per ottenere l'ora corrente. Ora dice che dovresti usare una stringa di "adesso".
PaulSkinner

Grazie @PaulSkinner, ho modificato la risposta.
Jessedc

Grazie, qual è lo scopo dei backslash prima DateTime? Eseguendolo da solo, sembra funzionare bene senza di loro.
Neve

1
@Snow Se questo codice viene inserito nel codice con spazio dei nomi, diciamo che il tuo file ha una namespace Adichiarazione in alto, PHP presumerà DateTimeche si riferisca A\DateTime, il che è sbagliato. L'aggiunta della barra rovesciata risolve il problema. È una buona abitudine da prendere anche se non usi ancora i namespace, secondo me.
Niavlys

35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);

3
@AlainTiemblo non proprio; devi sottrarre l'offset per farlo funzionare
sanmai


14

Ottenere la data UTC

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

Ottenere il timestamp UTC

time();

Il risultato non sarà diverso anche tu hai date_default_timezone_setsul tuo codice.


@ زياد Grazie per la correzione, ho modificato la mia risposta
StefansArya

Ho pensato che gmdate () restituisse GMT e non UTC. "Identica alla funzione date () tranne per il fatto che l'ora restituita è Greenwich Mean Time (GMT)". Mi sto perdendo qualcosa? Questi risultano equivalenti?
Jordan

3
@Jordan In pratica UTC e GMT rappresentano la stessa ora. stackoverflow.com/questions/48942916/...
Martti

12

Oltre a chiamare gmdatepuoi anche mettere questo codice prima del resto del codice:

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

Ciò farà sì che il resto delle chiamate relative a data / ora utilizzino il fuso orario GMT / UTC.


Non più nelle ultime versioni di PHP.
Khom Nazid,

1
@KhomNazid "UTC" come parametro è ancora valido. php.net/manual/en/…
Harikrishna

6

Puoi utilizzare la funzione gmmktime senza argomenti per ottenere il timestamp UTC corrente:

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

gmmktime funzionerà solo se l'ora del tuo server utilizza UTC. Ad esempio, il mio server è impostato su US / Pacific. la funzione sopra elencata rievoca l'ora del Pacifico.


gmmktime () è deprecato
Jonny

2

con stringa GMT / UTC +/- 0400 o GMT / UTC +/- 1000 in base ai tempi locali

Manca solo il tuo formato personalizzato Oper darti le differenze di fuso orario rispetto all'ora locale.

Differenza rispetto all'ora di Greenwich (GMT) in ore Esempio: +0200

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

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

Tuttavia, per la massima portabilità / interoperabilità, consiglierei di utilizzare il formato data 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

Puoi anche usare gmdatee la stringa di offset del fuso orario sarà sempre+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


1

Puoi usare quanto segue per ottenere l'ora 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');

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)
        );
    }

0

Di seguito trovi il codice PHP per ottenere l'ora UTC (Coordinated Universal Time) corrente

<?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");
?>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.