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.


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.


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


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

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

3
@AlainTiemblo no del todo; necesita restar el desplazamiento para que funcione
sanmai


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.


@ زياد 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.


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.


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


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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.