obter a hora UTC em PHP

122

Como posso obter o carimbo de hora UTC / GMT +/- usando a função date () do PHP? Por exemplo, se eu tentar

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

Vou obter o carimbo de data / hora Unix; mas preciso obter o carimbo de hora UTC / GMT com a string GMT / UTC +/- 0400 ou GMT / UTC +/- 1000 com base nos horários locais.

Robin Michael Poothurai
fonte
1
@JeffPuckettII GMT não muda para horário de verão. O Reino Unido muda de GMT para BST no verão, mas o GMT permanece o mesmo e sempre corresponde ao UTC.
lewis de

Respostas:

111

Usar gmdatesempre retornará uma data GMT. A sintaxe é a mesma de date.

nikc.org
fonte
12
@sanmai: um timestamp Unix é, por definição, sempre UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: O problema é que gmdate ("U"), retorna o mesmo que time () que não é o carimbo de data / hora UTC se o fuso horário do sistema do seu servidor for diferente. A única maneira de obter um carimbo de data / hora real baseado em UTC foi strtotime (gmdate ("M d YH: i: s")), que é diferente de gmdate ("U"), quando o fuso horário do sistema do seu servidor é diferente do UTC
bksi
@bksi Não consigo repetir o comportamento descrito. (Minha máquina não está no GMT e meus carimbos de data / hora UNIX estão corretos. Além disso gmdate("U") == time().) Parece um comportamento potencialmente problemático. Verifique e registre um bug com o projeto PHP.
nikc.org
Eu usei um script php simples para testar o cenário: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Fuso horário:" .date ("Z"). "\ n"; ?> Quando o executei, obtive este resultado: 1456342082 === 1456338482 Fuso horário: 3600 O resultado da data do comando shell é: Quarta, 24 de fevereiro 20:28:11 CET 2016
bksi
1
@bksi - Talvez você esteja confundindo representação interna de data e hora com representação externa de data e hora? tempo w / oa especificador de zona vs tempo com um especificador de zona? Como diz o nikc (e a documentação), time()retorna "número de segundos desde a Época do Unix (1 de janeiro de 1970 00:00:00 GMT)". Nota GMT. O fato de que, por padrão, seu sistema converte isso para seu fuso horário para exibição, é uma conveniência do usuário. Internamente, é sempre GMT.
Toolmaker Steve
90

Um simples gmdate () será suficiente

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

Como respondido anteriormente aqui , desde o PHP 5.2.0 você pode usar a DateTimeclasse e especificar o fuso horário UTC com uma instância de DateTimeZone.

A documentação DateTime __construct () sugere passar "agora" como o primeiro parâmetro ao criar uma instância de DateTime e especificar um fuso horário para obter a hora atual.

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

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
Jessedc
fonte
3
A documentação DateTime __construct () não sugere mais a omissão do primeiro parâmetro para obter a hora atual. Agora diz que você deve usar uma string de 'agora'.
PaulSkinner de
Obrigado @PaulSkinner, alterei a resposta.
Jessedc
Obrigado, qual é o propósito das barras invertidas antes DateTime? Executando-o sozinho, parece funcionar muito bem sem eles.
Neve de
1
@Snow Se este código for inserido em um código com espaço de nomes, digamos que seu arquivo tenha uma namespace Adeclaração no topo, o PHP assumirá DateTimeque se refere a A\DateTime, o que está errado. Adicionar a barra invertida corrige o problema. É um bom hábito a ser adotado mesmo que você ainda não use namespaces, na minha opinião.
Niavlys
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Sudhir Bastakoti
fonte
3
@AlainTiemblo não exatamente; você precisa subtrair o deslocamento para fazê-lo funcionar
sanmai
14
date("Y-m-d H:i:s", time() - date("Z"))
Allanrbo
fonte
14

Obtenção da data UTC

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

Obtendo carimbo de data / hora UTC

time();

O resultado não será diferente mesmo que você tenha date_default_timezone_setem seu código.

StefansArya
fonte
@ زياد Obrigado pela correção, eu modifiquei minha resposta
StefansArya
Achei que gmdate () retornasse GMT e não UTC. "Idêntica à função date () exceto que a hora retornada é Greenwich Mean Time (GMT)". Estou esquecendo de algo? São equivalentes?
Jordan
3
@Jordan Na prática, UTC e GMT representam a mesma hora. stackoverflow.com/questions/48942916/…
março
12

Além de ligar, gmdatevocê também pode colocar este código antes do restante do código:

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

Isso fará com que o restante de suas chamadas relacionadas a data / hora usem o fuso horário GMT / UTC.

anubhava
fonte
Não está mais nas últimas versões do PHP.
Khom Nazid
1
@KhomNazid "UTC" como parâmetro ainda é válido. php.net/manual/en/…
Harikrishna
6

Você pode usar a função gmmktime sem argumentos para obter o carimbo de data / hora UTC atual:

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

O gmmktime só funcionará se o horário do seu servidor estiver usando UTC. Por exemplo, meu servidor está definido como US / Pacific. a função listada acima reflete o horário do Pacífico.

RicoRico
fonte
gmmktime () está obsoleto
Jonny
2

com string GMT / UTC +/- 0400 ou GMT / UTC +/- 1000 com base nos horários locais

Seu formato personalizado está faltando Opara fornecer a você as diferenças de fuso horário da hora local.

Diferença para o horário de Greenwich (GMT) em horas Exemplo: +0200

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

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

No entanto, para maximizar a portabilidade / interoperabilidade, eu recomendaria usar o formato de data ISO8601c

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

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

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

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

Você pode usar também gmdatee a string de deslocamento de fuso horário sempre será+00:00

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

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

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

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

Jeff Puckett
fonte
1

Você pode usar o seguinte para obter a 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
fonte
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
fonte
0

Abaixo, encontre o código PHP para obter a hora UTC (Coordinated Universal Time) atual

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