php convert datetime to UTC

89

Estou precisando de uma maneira fácil de converter um carimbo de data e hora em UTC (de qualquer fuso horário em que o servidor esteja) ESPERAMENTE, sem usar nenhuma biblioteca.

Jeremey
fonte

Respostas:

28

Experimente getTimezone e setTimezone , veja o exemplo

(Mas isso usa uma classe)

ATUALIZAR:

Sem nenhuma aula, você poderia tentar algo assim:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

NOTA: pode ser necessário definir o fuso horário de volta ao original também

Phill Pafford
fonte
54
Você deve apenas usar em gmdatevez de alterar o fuso horário padrão para UTC. Porque gmdateusa UTC automaticamente.
cutucar
28
-1 porque você não deseja alterar o fuso horário padrão global para isso. Ele apenas pede efeitos colaterais indesejados.
Ward Bekker
@Phill O que está 'sz' aqui?
Shahid Karimi
2
Eu acho que deveria ser "Ym-dTG ..." em vez de "Yd-mTG ..."
Alex Angelico
Não está funcionando para mim no projeto laravel. Seu retorno na mesma data
Dharmender Tuli
108

Use strtotime para gerar um carimbo de data / hora a partir da string fornecida (interpretado como hora local) e use gmdate para obtê-lo como uma data UTC formatada de volta.

Exemplo

Conforme solicitado, aqui está um exemplo simples:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
cutucar
fonte
7
Um pequeno exemplo talvez?
Cherouvim
2
@cherouvim Não acho que seja necessário, mas adicionou um de qualquer maneira… Espero que ajude.
cutucar
5
gmdate () é uma daquelas funções PHP que eu gostaria de ter encontrado há muito tempo. nl2br, alguém?
Charlie Schliesser
1
GMT e UTC não são sempre iguais.
Jay Sheth,
1
@poke GMT respeita o horário de verão, UTC não e é por isso que é usado para que você não precise levar em consideração nada mais
Necro
68

Usando DateTime:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
joerx
fonte
A pergunta diz para converter um carimbo de data / hora em carimbo de data / hora e DateTime não aceita um carimbo de data / hora como entrada. Você teria que convertê-lo em uma string de alguma forma e depois convertê-lo de volta.
felwithe
14

Se você tiver uma data neste formato AAAA-MM-HH dd: mm: ss, você pode enganar o php adicionando um UTC no final de sua "string de data e hora" e usar strtotime para convertê-lo.

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

Isso irá imprimir isto:

2009-01-01 13:00:00
2009-06-01 14:00:00

E como você pode ver, ele também cuida do problema do horário de verão.

Uma maneira um pouco estranha de resolver isso .... :)

João
fonte
Eu realmente não entendo por que o OP não escolheu sua sugestão:D
php_nub_qq
@php_nub_qq provavelmente porque funciona alterando o fuso horário de todo o script, o que pode não ser desejado e ter consequências indesejadas.
felwithe
@felwithe Não faria isso se você pular a primeira linha, que é apenas para demonstração
php_nub_qq
10

Converta a string de fuso horário local em string UTC.
por exemplo, fuso horário da Nova Zelândia

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • NZDT: UTC + 13: 00
    if $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
    if $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00
    if $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
    if $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand

Frank Hou
fonte
4

Como strtotime requer um formato de entrada específico, DateTime :: createFromFormat pode ser usado ( php 5.3+ é necessário )

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);
Christos Pontikis
fonte
4

Eu às vezes uso este método:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

Funciona todos MOST parte do tempo.

Aorcsik
fonte
3
Dois problemas aqui. Primeiro você não deve subtrair, você deve adicionar o deslocamento. Em segundo lugar, isso não funciona se o fuso horário local estiver atualmente no DST e a data desejada não estiver no DST. O deslocamento estaria atrasado em uma hora. Ou vice-versa. Então, sim, isso funciona na MAIORIA do tempo, mas nem sempre.
dia
4

Se você não se importa em usar a classe DateTime do PHP , que está disponível desde o PHP 5.2.0, há vários cenários que podem se adequar à sua situação:

  1. Se você tiver um $givenDtobjeto DateTime que deseja converter para UTC, isso o converterá para UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
  2. Se você precisar do original $givenDtposteriormente, poderá, como alternativa, clonar o objeto DateTime fornecido antes da conversão do objeto clonado:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
  3. Se você tiver apenas uma string de data e hora, por exemplo $givenStr = '2018-12-17 10:47:12', primeiro crie um objeto de data e hora e depois o converta. Observe que isso assume que $givenStrestá no fuso horário configurado do PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
  4. Se a string datetime fornecida estiver em algum fuso horário diferente daquele em sua configuração do PHP, crie o objeto datetime fornecendo o fuso horário correto (consulte a lista de fusos horários suportados pelo PHP ). Neste exemplo, assumimos o fuso horário local em Amsterdã:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
O coprolal
fonte
1

Com o PHP 5 ou superior, você pode usar a função datetime :: format (ver documentação http://us.php.net/manual/en/datetime.format.php )

 echo strftime( '%e %B %Y' , 
    date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
    );  // 4 May 2012
MUY Bélgica
fonte
0

experimentar

data de eco ('F d Y', strtotime ('2010-01-19 00:00:00'));

irá produzir:

19 de janeiro de 2010

você deve alterar o formato da hora para ver outra saída

StevieJ
fonte
0

Função de normalização de propósito geral para formatar qualquer carimbo de data / hora de qualquer fuso horário para outro. Muito útil para armazenar registros de data e hora de usuários de diferentes fusos horários em um banco de dados relacional. Para comparações de banco de dados, armazene o carimbo de data / hora como UTC e use comgmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

Uso:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
Sandeep
fonte
0

como alternativa, você pode tentar isto:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

isso resultará em:

25-10-2017 17:13:20 Ásia / Singapura

você pode usar isso dentro do atributo de valor de uma caixa de entrada de texto se desejar exibir apenas uma data somente leitura.

remova o 'e' se não quiser mostrar sua região / país.

Bruce Tong
fonte
0

Siga estas etapas para obter a hora UTC de qualquer fuso horário definido no sistema local do usuário (isso será necessário para aplicativos da web para salvar diferentes fusos horários em UTC):

  1. Javascript (lado do cliente):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
  2. Php (lado do servidor):

    public function convert_utc_time($date)
    {
        $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
        if($time_difference != ''){
            $time = strtotime($date);
            $time = $time + ($time_difference*60); //minutes * 60 seconds
            $date = date("Y-m-d H:i:s", $time);
        } //on failure of js, default timezone is set as UTC below
        return $date;
    }
    ..
    ..
    //in my function
    $timezone = 'UTC';
    $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
    echo strtotime($date. ' '. $timezone)
Pradeep Kumar Prabaharan
fonte
-1

Como uma melhoria na resposta de Phill Pafford (não entendi seu 'Yd-mTG: i: sz' e ele sugeriu reverter o fuso horário). Então, proponho isso (compliquei alterando o formato HMTL em texto simples / ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>
7 Tonin
fonte
2
Você deve editar sua resposta para explicar como isso melhora a resposta de Phil. O que você alterou no código e por que está melhor?
Cody Gray
Alterar o fuso horário do PHP padrão para converter dois timestamps é um hack que funciona, mas não uma solução elegante.
The Coprolal