Respostas:
se você precisar do gmt_offset,
<?php echo get_option('gmt_offset'); ?>
isso lhe dará um número inteiro como 2 ou -2 .
e se você precisar da string de fuso horário, use
<?php echo get_option('timezone_string'); ?>
isso lhe dará uma sequência como America / Indianapolis
A situação lamentável é que existem de fato duas opções diferentes:
timezone_string
, que salva o fuso horário no estilo PHP.gmt_offset
, que salva o deslocamento numérico da flutuação em horas.Porém, em ambientes mais novos, timezone_string
na verdade , substitui gmt_offset
, o valor retornado pelo último será baseado no primeiro. No entanto, o oposto não é verdadeiro - gmt_offset
pode ser válido, enquanto timezone_string
está vazio.
Gastei bastante tempo com essas coisas e a versão mais atual que implementei na minha WpDateTime
biblioteca é a seguinte:
class WpDateTimeZone extends \DateTimeZone {
/**
* Determine time zone from WordPress options and return as object.
*
* @return static
*/
public static function getWpTimezone() {
$timezone_string = get_option( 'timezone_string' );
if ( ! empty( $timezone_string ) ) {
return new static( $timezone_string );
}
$offset = get_option( 'gmt_offset' );
$hours = (int) $offset;
$minutes = abs( ( $offset - (int) $offset ) * 60 );
$offset = sprintf( '%+03d:%02d', $hours, $minutes );
return new static( $offset );
}
}
Isso tentará instanciar um objeto de fuso horário significativo em todos os casos possíveis, desde que todas as informações estejam disponíveis.
(int)
por $ horas e floor
por $ minutos é problemático? De acordo com a documentação, (int)
e floor
são quase os mesmos, exceto (int)
que arredondará -4,5 a -4 e floor
arredondará para -5. Parece que isso dará compensações incorretas do fuso horário negativo?
Verifique a página de referência da opção . A opção gmt_offset
retorna um número inteiro. Por exemplo, se o fuso horário estiver definido como Horário do Leste (por exemplo, América / Nova_Iorque), gmt_offset
deve ser -5.
Não pense que você obterá uma string como US / Eastern sem armazenar todas as strings que deseja em uma matriz e se referir a elas. Usando PHP, você pode obter a abreviação do fuso horário, ou seja, EST ; e se você tiver esses valores armazenados em uma matriz com as seqüências desejadas, poderá procurá-los.
<?php date_default_timezone_set(get_option('timezone_string'));
echo date('T'); // will give you three-character string like "EST"
$timezones = array (
'EST' => 'US/Eastern',
'CST' => 'US/Central',
// etc, etc, etc.
);
echo $timezones [ date('T') ]; // should be what you want.
?>
Para adicionar à Bainternet (estou adicionando isso como resposta porque não posso comentar - tenho menos de 50 pontos na pilha de desenvolvimento do WP).
O WordPress armazenará apenas uma sequência de fuso horário se você selecionar uma sequência de fuso horário nas configurações gerais. A seleção UTF é o padrão da lista, mas você pode rolar até as seqüências de fuso horário. Se você definir uma sequência de fuso horário, as sequências UTF e Fuso Horário serão definidas. Eles serão os mesmos (ou seja, o UTF será redefinido para a nova zona quando você selecionar um fuso horário da cadeia do fuso horário).
(WordPress 4)
Existem algumas opções, nenhuma das quais realmente funciona muito bem. Este é um bug do WordPress, e é realmente péssimo, porque a hora está errada, a menos que você defina seu site como UTC ... o que é confuso e nem sempre é possível.
Acho que este próximo código só funcionará se você escolher seu fuso horário (em Configurações -> Geral em admin) como uma cidade nomeada em vez de um deslocamento de número GMT. Eu não testei isso, mas é muito possível que get_option('gmt_offset')
seja definido quando get_option('timezone_string')
não for.
date_default_timezone_set(get_option('timezone_string'));
A desvantagem disso é que o WordPress assume que o PHP está definido como UTC ao criar registros de data e hora do mysql, para que você possa estragar seu banco de dados um pouco sempre que mudar de fuso horário! Sem mencionar outros plugins do WP, podemos supor que o ambiente PHP esteja sempre no UTC.
Portanto, se você deseja apenas um horário correto - pode forçar seu carimbo de data / hora para estar no UTC com:
get_post_time('c', true); //should work for non-post objects.
Infelizmente, embora correto, o fuso horário será definido como UTC.
E note que você não pode tanto usar o "verdadeiro" bandeira e a função timezone_set padrão.
Qualquer solução adequada será um trecho de código que é responsável por gmt_offset
AND timezone_string
e os usa para definir um fuso horário em alguma entrada. O WP pressupõe que o PHP esteja definido como UTC ao executar registros de data e hora do mysql, e poderá quebrar outros plugins.
Existe uma dessas soluções em https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ mas, novamente, este é um BUG; portanto, você deve usar o get_post_time($date_format, TRUE)
código para obter um carimbo de data e hora que está realmente correto.
Dado que o wordpress mantém a string de fuso horário na tabela de opções, você pode usar a maneira orientada a objetos para obter a hora certa no seu site wordpress:
$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);
$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";