Wie bekomme ich die Zeitzoneneinstellung von WordPress?

50

Kann mir jemand sagen, wie ich die im WordPress-Admin eingestellte Zeitzone erhalte?

Wenn das Blog beispielsweise auf Eastern Time eingestellt ist, benötige ich genau diese Zeichenfolge zum Ausdrucken:

US / Eastern

Dies ist für eine Funktion, die in functions.php in meinem Thema lebt.

user1462
quelle

Antworten:

79

wenn du den gmt_offset dann brauchst

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

Dies gibt Ihnen eine ganze Zahl wie 2 oder -2 .

und wenn Sie die Zeitzonenzeichenfolge benötigen, verwenden Sie

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

Das ergibt eine Saite wie America / Indianapolis

Bainternet
quelle
6
Mein timezone_string befindet sich in der Datenbank, ist aber leer, auch wenn Sie auf der Einstellungsseite eine andere Zeitzone ausgewählt haben. Was könnte der Fall sein? (WP3.6)
user2019515
Berücksichtigt gmt_offest die Sommerzeit basierend auf der Zeitzoneneinstellung der Site?
Squarecandy
6
@ user2019515 Wenn Sie eine Stadt als Zeitzone auswählen, wird sie in der Option "timezone_string" gespeichert. Wenn Sie jedoch einen manuellen Versatz (z. B. UTC + 1) auswählen, wird sie in der Option "gmt_offset" (als "1") und in der Option "timezone_string" gespeichert bleibt leer.
Berend
15

Die unglückliche Situation ist, dass es in der Tat zwei verschiedene Möglichkeiten gibt:

  1. Neuere Version timezone_string, die Zeitzone im PHP-Stil spart.
  2. Älter gmt_offset, wodurch der numerische Float-Offset in Stunden eingespart wird.

Aber in neueren Umgebungen timezone_stringtatsächlich überschreibt gmt_offset , wird der Wert von diesem zurückgegeben wird auf dem ehemaligen basieren. Das Gegenteil ist jedoch nicht der Fall - gmt_offsetkann gültig sein, solange timezone_stringleer ist.

Ich habe ziemlich viel Zeit mit diesen Dingen verbracht und die aktuellste Einstellung, die ich in meiner WpDateTimeBibliothek implementiert habe, ist folgende:

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

Auf diese Weise wird in allen möglichen Fällen versucht, ein aussagekräftiges Zeitzonenobjekt zu instanziieren, sofern überhaupt Informationen verfügbar sind.

Rarst
quelle
1
Dies sollte die akzeptierte Antwort sein. Menschen werden auf Bugs stoßen, wenn sie sich ausschließlich auf get_option ('timezone_string') verlassen.
DiscoInfiltrator
Das ist die richtige Antwort.
Lucas Bustamante
Ist die Verwendung von (int)für $ Stunden und floorfür $ Minuten problematisch? Laut Dokumentation, (int)und floorsind fast gleich, außer (int)wird -4,5 auf -4 floorrunden und wird es auf -5 runden. Dies scheint, als würde es falsche negative Zeitzonenoffsets geben.
Mikepote
1
@Mikepote ja, das wurde vor langer Zeit in der lib behoben, nur veraltete Kopie des Codes in der Antwort hier.
Selten
Oh mein Gott , warum haben sie es so umzusetzen .... Es kostete mich eine volle Stunde Neigung
Blackbam
9

Überprüfen Sie die Optionsreferenzseite . Die Option gmt_offsetgibt eine Ganzzahl zurück. Wenn die Zeitzone beispielsweise auf Eastern Time (z. B. America / New_York) eingestellt ist, gmt_offsetsollte sie -5 sein.

Travis Northcutt
quelle
2

Denken Sie nicht, dass Sie eine Zeichenfolge wie US / Eastern erhalten, ohne alle gewünschten Zeichenfolgen in einem Array zu speichern und auf sie zu verweisen. Mit PHP können Sie die Abkürzung für die Zeitzone erhalten, dh EST ; Wenn Sie diese Werte in einem Array mit den gewünschten Zeichenfolgen gespeichert haben, können Sie sie nachschlagen.

<?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.
 ?>
goldenapples
quelle
Das ist unnötig. Die Zeitzonenstandards sind seit 5.2 Bestandteil von PHP, ebenso wie das DateTimeZone-Objekt und die zugehörigen Standardfunktionen.
Haz
1

Zum Bainternet hinzufügen (ich füge dies als Antwort hinzu, weil ich keine Kommentare abgeben kann - ich habe weniger als 50 Punkte auf dem WP Development Stack).

WordPress speichert eine Zeitzonenzeichenfolge nur, wenn Sie in den allgemeinen Einstellungen eine Zeitzonenzeichenfolge auswählen. Bei der UTF-Auswahl wird die Standardeinstellung in der Liste verwendet, Sie können jedoch einen Bildlauf bis zu Zeitzonenzeichenfolgen durchführen. Wenn Sie eine Zeitzonenzeichenfolge festlegen, werden sowohl die UTF- als auch die Zeitzonenzeichenfolge festgelegt. Sie sind identisch (dh, die UTF wird auf die neue Zone zurückgesetzt, wenn Sie eine Zeitzonenzeichenfolge auswählen).

(WordPress 4)

Jeff
quelle
0

Es gibt einige Optionen, von denen keine wirklich gut funktioniert. Dies ist ein WordPress-Fehler, und es ist wirklich zum Kotzen, weil die Zeit falsch ist, es sei denn, Sie setzen Ihre Site auf UTC ... was verwirrend und nicht immer möglich ist.

Dieser nächste Code funktioniert meiner Meinung nach nur, wenn Sie Ihre Zeitzone (unter Einstellungen -> Allgemein in Admin) als benannte Stadt anstatt durch einen GMT-Nummernversatz auswählen. Ich habe das nicht getestet, aber es ist sehr gut möglich, dass festgelegt get_option('gmt_offset')wird, wann get_option('timezone_string')nicht.

date_default_timezone_set(get_option('timezone_string'));

Der Nachteil dabei ist, dass WordPress davon ausgeht, dass PHP bei der Erstellung von MySQL-Zeitstempeln auf UTC eingestellt ist, sodass Sie Ihre Datenbank ein wenig durcheinander bringen können, wenn Sie die Zeitzone wechseln! Ganz zu schweigen von anderen WP-Plugins kann davon ausgegangen werden, dass die PHP-Umgebung immer in UTC ist.

Wenn Sie also nur eine korrekte Uhrzeit wünschen, können Sie erzwingen, dass Ihr Zeitstempel in UTC angezeigt wird:

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

Leider wird die Zeitzone dadurch auf UTC gesetzt, obwohl dies korrekt ist.

Beachten Sie außerdem, dass Sie nicht sowohl das Flag "true" als auch die Standardfunktion "timezone_set" verwenden können.

Jede richtige Lösung wird ein Code-Snippet sein, das beide gmt_offsetUND-Verknüpfungen berücksichtigt timezone_stringund sie verwendet, um eine Zeitzone für einige Eingaben festzulegen. WP geht davon aus, dass PHP bei der Ausführung von MySQL-Zeitstempeln auf UTC gesetzt ist und möglicherweise andere Plugins beschädigt.

Es gibt eine solche Lösung auf https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ , aber auch dies ist ein BUG, ​​daher sollten Sie den get_post_time($date_format, TRUE)Code verwenden, um einen Zeitstempel dafür zu erhalten ist eigentlich richtig.

Ryan Taylor
quelle
0

Angesichts der Tatsache, dass WordPress die Zeitzonenzeichenfolge in der Optionstabelle beibehält, können Sie die objektorientierte Methode verwenden, um die richtige Uhrzeit für Ihre WordPress-Site zu ermitteln:

$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
quelle