Come ottenere l'impostazione del fuso orario di WordPress?


50

Qualcuno può dirmi come ottenere il fuso orario impostato nell'amministratore di WordPress?

Ad esempio, se il blog è impostato sull'ora orientale, ho bisogno di questa stringa esatta per stampare:

US / Eastern

Questo è per una funzione che vive in Functions.php nel mio tema.

Risposte:


79

se hai bisogno di gmt_offset allora

<?php echo get_option('gmt_offset'); ?>

questo ti darà un numero intero come 2 o -2 .

e se hai bisogno della stringa del fuso orario usa

<?php echo get_option('timezone_string'); ?>

questo ti darà una stringa come l' America / Indianapolis


6
Il mio timezone_string è nel database ma è vuoto, anche dopo aver selezionato un fuso orario diverso nella pagina delle impostazioni. Quale potrebbe essere il caso? (WP3.6)
user2019515

Gmt_offest tiene conto dell'ora legale in base all'impostazione del fuso orario del sito?
squarecandy,

6
@ user2019515 Se si sceglie una città come fuso orario, verrà salvata nell'opzione "timezone_string" ma se si sceglie un offset manuale (ad esempio UTC + 1) viene salvata nell'opzione "gmt_offset" (come "1") e timezone_string rimane vuoto.
Berenda,

15

La spiacevole situazione è che ci sono davvero due diverse opzioni:

  1. Più recente timezone_string, che consente di salvare il fuso orario in stile PHP.
  2. Più vecchio gmt_offset, che salva l'offset numerico del float in ore.

Ma in ambienti più recenti timezone_stringin realtà le sostituzioni gmt_offset , il valore restituito da quest'ultimo sarà basato sul precedente. Tuttavia, non è vero il contrario : gmt_offsetpotrebbe essere valido, mentre timezone_stringè vuoto.

Ho trascorso un bel po 'di tempo su queste cose e il take più attuale che ho implementato nella mia WpDateTimelibreria è il seguente:

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 );
    }
}

Ciò tenterà di creare un'istanza di un oggetto fuso orario significativo in tutti i casi possibili, a condizione che siano disponibili tutte le informazioni.


1
Questa dovrebbe essere la risposta accettata. Le persone si imbatteranno in bug se si basano esclusivamente su get_option ('timezone_string').
DiscoInfiltrator

Questa è la risposta corretta
Lucas Bustamante,

L'uso di (int)per $ ore e floorper $ minuti è problematico? Secondo la documentazione, (int)e floorsono quasi gli stessi tranne (int)che per arrotondare da -4,5 a -4 e floorper arrotondare a -5. Questo sembra che darà offset del fuso orario negativo errati?
Mikepote,

1
@Mikepote sì, questo problema è stato risolto nella libreria molto tempo fa, solo una copia non aggiornata del codice nella risposta qui.
Rarst

Oh mio Dio, perché l'hanno implementato in questo modo ... Mi è costato un'inclinazione di
Blackbam


2

Non pensare che otterrai una stringa come US / Eastern senza memorizzare tutte le stringhe che desideri in un array e riferirti ad esse. Utilizzando PHP è possibile ottenere l'abbreviazione del fuso orario, ovvero EST ; e se hai quei valori memorizzati in un array con le stringhe che desideri, puoi cercarli.

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

Questo non è necessario. Gli standard del fuso orario fanno parte di PHP dal 5.2, così come l' oggetto DateTimeZone e le relative funzioni standard.
haz

1

Da aggiungere a Bainternet (lo sto aggiungendo come risposta perché non posso commentare - ho meno di 50 punti nello stack di sviluppo WP).

WordPress memorizzerà una stringa di fuso orario solo se selezioni una stringa di fuso orario nelle impostazioni generali. La selezione UTF è la posizione predefinita nell'elenco, ma è possibile scorrere fino alle stringhe del fuso orario. Se si imposta una stringa del fuso orario, verranno impostate sia la stringa UTF che la stringa del fuso orario. Saranno gli stessi (ovvero, l'UTF viene reimpostato sulla nuova zona quando si seleziona un fuso orario stringa di fuso orario).

(WordPress 4)


0

Ci sono alcune opzioni, nessuna delle quali funziona davvero alla grande. Questo è un bug di WordPress e fa davvero schifo perché il tempo è sbagliato a meno che tu non imposti il ​​tuo sito su UTC ... il che è confuso e non sempre nemmeno possibile.

Questo prossimo codice penso che funzioni solo se scegli il tuo fuso orario (in Impostazioni -> Generale in admin) come una città con nome invece di un offset del numero GMT. Non l'ho provato ma è possibile che get_option('gmt_offset')sia impostato quando get_option('timezone_string')non lo è.

date_default_timezone_set(get_option('timezone_string'));

Il rovescio della medaglia di questo è che WordPress presuppone che PHP sia impostato su UTC quando si creano timestamp mysql, quindi puoi rovinare un po 'il tuo database ogni volta che cambi fuso orario! Per non parlare degli altri plugin WP, si può presumere che l'ambiente PHP sia sempre in UTC.

Quindi, se desideri solo un orario corretto, puoi forzare il timestamp in UTC con:

get_post_time('c', true); //should work for non-post objects.

Sfortunatamente, anche se corretto, il fuso orario verrà impostato su UTC.

E nota che non puoi usare sia il flag "true" che la funzione timezone_set predefinita.

Qualsiasi soluzione appropriata sarà uno snippet di codice che tiene conto di entrambi gmt_offsetAND timezone_stringe li utilizza per impostare un fuso orario su alcuni input. WP presuppone che PHP sia impostato su UTC durante l'esecuzione di timestamp mysql e che potrebbe interrompere altri plugin.

C'è una soluzione del genere su https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ ma, di nuovo, questo è un BUG, ​​quindi dovresti usare il get_post_time($date_format, TRUE)codice per ottenere un timestamp che è in realtà corretto.


0

Dato che wordpress mantiene la stringa del fuso orario nella tabella delle opzioni, puoi usare il modo orientato agli oggetti per ottenere il momento giusto sul tuo sito 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>";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.