Conversão de timestamps para hora local com date_l18n ()

12

Eu tenho uma tarefa cron do WordPress que envia um e-mail periodicamente e salva o registro de data e hora quando ele é enviado como uma opção, e gostaria de exibir uma data em uma página de configurações. Algo como: "O último email foi enviado em 'x'". Eu estou na costa oeste dos EUA, então nosso tempo está atualmente a sete horas da UTC.

Minha saída esperada de date_i18n (), passando o carimbo de data / hora, seria uma data formatada localmente com um ajuste de sete horas a partir do UTC. No entanto, retorna a hora no UTC. Mesmo tentando obter o tempo atual não retorna o que eu acho que seria o resultado esperado.

Por exemplo: echo date_i18n('F d, Y H:i'); outputs April 05, 2013 11:36 como esperado, mas echo date_i18n('F d, Y H:i',time()); outputs April 05, 2013 18:36.

Isso é intencional? Como posso retornar uma data formatada localmente a partir de um registro de data e hora preexistente? Obrigado por qualquer ajuda.

    
por Andrew Bartel 05.04.2013 / 20:48

5 respostas

27

Eu sei que estou atrasado três meses, mas a função que você quer aqui é get_date_from_gmt() .

A função aceita uma data GMT / UTC no formato Y-m-d H:i:s como primeiro parâmetro e o formato de data desejado como o segundo parâmetro. Ele converterá sua data no fuso horário local, conforme definido na tela Configurações.

Exemplo de uso:

echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );

    
por John Blackbourn 20.07.2013 / 16:37
4

Do códice :

  

current_time ('timestamp') deve ser usado no lugar do tempo () para retornar   a hora local do blog. No WordPress, o tempo do PHP () sempre retornará   UTC e é o mesmo que chamar current_time ('timestamp', true).

Tente isto:

define( 'MY_TIMEZONE', (get_option( 'timezone_string' ) ? get_option( 'timezone_string' ) : date_default_timezone_get() ) );
date_default_timezone_set( MY_TIMEZONE );
echo date_i18n('F d, Y H:i', 1365194723);

Isto define a data PHP padrão para a opção timezone_string do WP, se disponível, pela duração do script.

    
por vancoder 05.04.2013 / 21:18
1

date_i18n($format, $timestamp) formatos de acordo com a localidade, mas não o fuso horário. get_date_from_gmt($datestring, $format) formata de acordo com o fuso horário, mas não com a localidade. Para obter a formatação de acordo com o fuso horário e a localidade, estou fazendo o seguinte:

function local_date_i18n($format, $timestamp) {
    $timezone_str = get_option('timezone_string') ?: 'UTC';
    $timezone = new \DateTimeZone($timezone_str);

    // The date in the local timezone.
    $date = new \DateTime(null, $timezone);
    $date->setTimestamp($timestamp);
    $date_str = $date->format('Y-m-d H:i:s');

    // Pretend the local date is UTC to get the timestamp
    // to pass to date_i18n().
    $utc_timezone = new \DateTimeZone('UTC');
    $utc_date = new \DateTime($date_str, $utc_timezone);
    $timestamp = $utc_date->getTimestamp();

    return date_i18n($format, $timestamp, true);
}

Exemplo de programa:

$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Local: ", $local, " UTC: ", $gmt;

Saída para o fuso horário de Los Angeles:

  

Local: 05 de abril de 2013 11:36 UTC: 05 de abril de 2013, 18:36

    
por antonakos 18.02.2014 / 16:34
1

Adicione o deslocamento do fuso horário ao seu timestamp.

$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );

ou melhor;

$tz = new DateTimeZone( get_option( 'timezone_string' ) );
$offset_for_that_time = timezone_offset_get ( $tz , new DateTime("@{$ts}") );
return date_i18n ( get_option( 'date_format' ), $ts + offset_for_that_time );
    
por ecabuk 16.02.2015 / 03:24
0

Isto é o que parece funcionar na minha máquina (nenhuma das outras coisas funcionou):

$tz = new DateTimeZone(get_option('timezone_string'));
$dtz = new DateTimeZone('GMT');
foreach($posts as $key => $post){
    $gmt_date = DateTime::createFromFormat('Y-m-d H:i:s', $post->PostDateGMT, $dtz);
    $gmt_date->setTimeZone($tz);
    $posts[$key]->PostDateGMT = $gmt_date->format('Y-m-d H:i:s');
}

Código original: enlace

Não está usando date_l18n() , mas acho que é possível usá-lo mais tarde ...

    
por NoOne 28.12.2015 / 19:33