Como obter a configuração de fuso horário do WordPress?

50

Alguém pode me dizer como obter o fuso horário definido no WordPress Admin?

Por exemplo, se o blog estiver definido como horário do leste, preciso dessa string exata para imprimir:

EUA / Leste

Isto é para uma função que vive em functions.php no meu tema.

user1462
fonte

Respostas:

79

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

Bainternet
fonte
6
Meu timezone_string está no banco de dados, mas está vazio, mesmo depois de selecionar um fuso horário diferente na página de configurações. Qual pode ser o caso? (WP3.6)
user2019515
O gmt_offest leva em consideração o horário de verão com base na configuração de fuso horário do site?
Squarecandy
6
@ user2019515 Se você escolher uma cidade como fuso horário, ela será salva na opção "timezone_string", mas se você escolher um deslocamento manual (UTC + 1 por exemplo), ela será salva na opção "gmt_offset" (como "1") e no timezone_string permanece vazio.
Berend 27/03
15

A situação lamentável é que existem de fato duas opções diferentes:

  1. Mais recente timezone_string, que salva o fuso horário no estilo PHP.
  2. Mais antigo gmt_offset, que salva o deslocamento numérico da flutuação em horas.

Porém, em ambientes mais novos, timezone_stringna verdade , substitui gmt_offset , o valor retornado pelo último será baseado no primeiro. No entanto, o oposto não é verdadeiro - gmt_offsetpode ser válido, enquanto timezone_stringestá vazio.

Gastei bastante tempo com essas coisas e a versão mais atual que implementei na minha WpDateTimebiblioteca é 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.

Rarst
fonte
11
Essa deve ser a resposta aceita. As pessoas encontrarão bugs se confiarem apenas em get_option ('timezone_string').
DiscoInfiltrator 14/08/18
Essa é a resposta correta.
Lucas Bustamante
O uso de (int)por $ horas e floorpor $ minutos é problemático? De acordo com a documentação, (int)e floorsão quase os mesmos, exceto (int)que arredondará -4,5 a -4 e floorarredondará para -5. Parece que isso dará compensações incorretas do fuso horário negativo?
Mikepote
11
@ Mikepote sim, isso foi corrigido na lib há muito tempo, apenas cópia obsoleta do código na resposta aqui.
Rarst
Oh meu deus, por que eles implementá-lo como este .... Ele me custou uma hora de inclinação
Blackbam
9

Verifique a página de referência da opção . A opção gmt_offsetretorna 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_offsetdeve ser -5.

Travis Northcutt
fonte
2

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.
 ?>
maçãs douradas
fonte
Isso é desnecessário. Os padrões de fuso horário fazem parte do PHP desde a versão 5.2, assim como o objeto DateTimeZone e as funções padrão relacionadas.
haz
1

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)

Jeff
fonte
0

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_offsetAND timezone_stringe 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.

Ryan Taylor
fonte
0

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>";
Pål Bergquist
fonte