obtener la hora UTC en PHP

122

¿Cómo puedo obtener la marca de tiempo UTC / GMT +/- usando la función date () de PHP? Por ejemplo, si intento

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

Obtendré la marca de tiempo de Unix; pero necesito obtener la marca de tiempo UTC / GMT con la cadena GMT / UTC +/- 0400 o GMT / UTC +/- 1000 según los horarios locales.

Robin Michael Poothurai
fuente
1
@JeffPuckettII GMT no cambia para el horario de verano. El Reino Unido cambia de GMT a BST en el verano, pero GMT permanece igual y siempre coincide con UTC.
lewis

Respuestas:

111

El uso gmdatesiempre devolverá una fecha GMT. La sintaxis es la misma que para date.

nikc.org
fuente
12
@sanmai: una marca de tiempo Unix es, por definición, siempre UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: El problema es que gmdate ("U"), devuelve lo mismo que time (), que no es la marca de tiempo UTC si la zona horaria del sistema del servidor es diferente. La única forma en que pude obtener una marca de tiempo real basada en UTC fue strtotime (gmdate ("M d YH: i: s")), que es diferente a gmdate ("U"), cuando la zona horaria del sistema de su servidor es diferente a UTC
bksi
@bksi No puedo repetir su comportamiento descrito. (Mi máquina no está en GMT y mis marcas de tiempo de UNIX son correctas. También gmdate("U") == time().) Suena como un comportamiento potencialmente defectuoso. Verifique dos veces y presente un error con el proyecto PHP.
nikc.org
Usé un script php simple para probar el escenario: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Timezone:" .date ("Z"). "\ n"; ?> Cuando lo ejecuté, obtengo este resultado: 1456342082 === 1456338482 Zona horaria: 3600 El resultado de la fecha del comando de shell es: miércoles 24 de febrero 20:28:11 CET 2016
bksi
1
@bksi - ¿Quizás está confundiendo la representación interna de datetime con la representación externa de datetime? tiempo sin un especificador de zona frente a tiempo con un especificador de zona? Como dice nikc (y la documentación), time()devuelve "número de segundos desde la época de Unix (1 de enero de 1970 00:00:00 GMT)". Nota GMT. El hecho de que, de forma predeterminada, su sistema lo convierta en su zona horaria para mostrarlo, es una conveniencia para el usuario. Internamente, siempre es GMT.
ToolmakerSteve
90

Un simple gmdate () será suficiente

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

Como se respondió anteriormente aquí , desde PHP 5.2.0 puede usar la DateTimeclase y especificar la zona horaria UTC con una instancia deDateTimeZone .

La documentación de DateTime __construct () sugiere pasar "ahora" como primer parámetro al crear una instancia de DateTime y especificar una zona horaria para obtener la hora actual.

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

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
Jessedc
fuente
3
La documentación de DateTime __construct () ya no sugiere omitir el primer parámetro para obtener la hora actual. Ahora dice que debería usar una cadena de "ahora".
PaulSkinner
Gracias @PaulSkinner, he modificado la respuesta.
Jessedc
Gracias, ¿cuál es el propósito de las barras invertidas antes DateTime? Al ejecutarlo yo mismo, parece funcionar bien sin ellos.
Nieve
1
@Snow Si este código se inserta en un código de espacio de nombres, digamos que su archivo tiene una namespace Adeclaración en la parte superior, PHP asumirá DateTimeque se refiere A\DateTime, lo cual es incorrecto. Agregar la barra invertida soluciona el problema. En mi opinión, es un buen hábito incluso si aún no usas espacios de nombres.
Niavlys
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Sudhir Bastakoti
fuente
3
@AlainTiemblo no del todo; necesita restar el desplazamiento para que funcione
sanmai
14
date("Y-m-d H:i:s", time() - date("Z"))
Allanrbo
fuente
14

Obtención de la fecha UTC

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

Obtención de la marca de tiempo UTC

time();

El resultado no será diferente incluso si lo tiene date_default_timezone_seten su código.

StefansArya
fuente
@ زياد Gracias por la corrección, he modificado mi respuesta
StefansArya
Pensé que gmdate () devuelve GMT y no UTC. "Idéntica a la función date () excepto que la hora devuelta es la hora media de Greenwich (GMT)". ¿Me estoy perdiendo de algo? ¿Estos salen equivalentes?
Jordania
3
@Jordan En la práctica, UTC y GMT representan la misma hora. stackoverflow.com/questions/48942916/…
martti
12

Además de llamar gmdate, también puede poner este código antes del resto del código:

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

Eso hará que el resto de sus llamadas relacionadas con la fecha / hora usen la zona horaria GMT / UTC.

anubhava
fuente
Ya no en las últimas versiones de PHP.
Khom Nazid
1
@KhomNazid "UTC" como parámetro sigue siendo válido. php.net/manual/en/…
Harikrishna
6

Puede usar la función gmmktime sin argumentos para obtener la marca de tiempo UTC actual:

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

gmmktime solo funcionará si la hora de su servidor usa UTC. Por ejemplo, mi servidor está configurado en EE.UU. / Pacífico. la función listada arriba hace eco a la hora del Pacífico.

RicoRico
fuente
gmmktime () está obsoleto
Jonny
2

con cadena GMT / UTC +/- 0400 o GMT / UTC +/- 1000 según los horarios locales

Su formato personalizado solo falta Opara darle las compensaciones de zona horaria con respecto a la hora local.

Diferencia con la hora de Greenwich (GMT) en horas Ejemplo: +0200

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

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

Sin embargo, para maximizar la portabilidad / interoperabilidad, recomendaría usar el formato de fecha 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

También puede usar gmdatey la cadena de desplazamiento de zona horaria siempre será+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
fuente
1

Puede usar lo siguiente para obtener la hora 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
fuente
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
fuente
0

A continuación, busque el código PHP para obtener la hora UTC (hora universal coordinada) actual

<?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
fuente