Jak uzyskać ustawienie strefy czasowej WordPress?


50

Czy ktoś może mi powiedzieć, jak uzyskać strefę czasową ustawioną w Administratorze WordPress?

Na przykład, jeśli blog jest ustawiony na czas wschodni, muszę wydrukować ten ciąg:

US / Eastern

To jest dla funkcji, która żyje w functions.php w moim motywie.

Odpowiedzi:


79

jeśli potrzebujesz gmt_offset, to

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

to da ci liczbę całkowitą taką jak 2 lub -2 .

a jeśli potrzebujesz ciągu strefy czasowej, użyj

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

da ci to ciąg znaków jak Ameryka / Indianapolis


6
Mój ciąg strefy czasowej znajduje się w bazie danych, ale jest pusty, nawet po wybraniu innej strefy czasowej na stronie ustawień. Co może mieć miejsce? (WP3.6)
user2019515 13.09.13

Czy gmt_offest bierze pod uwagę oszczędności w świetle dziennym na podstawie ustawienia strefy czasowej witryny?
squarecandy

6
@ user2019515 Jeśli wybierzesz miasto jako strefę czasową, zostanie ono zapisane w opcji „timezone_string”, ale jeśli wybierzesz opcję ręcznego przesunięcia (na przykład UTC + 1), zostanie ono zapisane w opcji „gmt_offset” (jako „1”) i łańcuch_czasowy pozostaje pusty.
Berend

15

Niefortunna sytuacja polega na tym, że rzeczywiście istnieją dwie różne opcje:

  1. Nowszy timezone_string, który oszczędza strefę czasową w stylu PHP.
  2. Starsze gmt_offset, które zapisuje liczbowe przesunięcie pływaka w godzinach.

Ale w nowszych środowiskach timezone_stringfaktycznie zastępuje gmt_offset , wartość zwracana przez te ostatnie będą oparte na tych pierwszych. Jednak przeciwieństwo nie jest prawdą - gmt_offsetmoże być poprawne, dopóki timezone_stringjest puste.

Spędzam nad tym sporo czasu, a najbardziej aktualne podejście, które wdrożyłem w mojej WpDateTimebibliotece, jest następujące:

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

Spróbuje utworzyć instancję znaczącego obiektu strefy czasowej we wszystkich możliwych przypadkach, o ile w ogóle będą dostępne jakiekolwiek informacje.


1
To powinna być zaakceptowana odpowiedź. Ludzie napotkają błędy, jeśli polegają wyłącznie na get_option ('timezone_string').
DiscoInfiltrator

To jest poprawna odpowiedź.
Lucas Bustamante,

Czy korzystanie z (int)godzin $ i floorminut $ jest problematyczne? Zgodnie z dokumentacją (int)i floorsą prawie takie same, z wyjątkiem (int)zaokrągli -4,5 do -4 i floorzaokrągli ją do -5. Wygląda na to, że spowoduje nieprawidłowe przesunięcie ujemnej strefy czasowej?
Mikepote

1
@Mikepote tak, dawno temu zostało to naprawione w lib, po prostu przestarzała kopia kodu w odpowiedzi tutaj.
Rarst

O mój boże, dlaczego wprowadzili to w ten sposób ... Kosztowało mnie to pełne godziny pochylenia
Blackbam


2

Nie myśl, że otrzymasz ciąg taki jak US / Eastern bez przechowywania wszystkich ciągów, które chcesz w tablicy i odwoływania się do nich. Za pomocą PHP można uzyskać skrót strefy czasowej, tj. EST ; a jeśli masz te wartości zapisane w tablicy z ciągami, które chcesz, możesz je wyszukać.

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

To jest niepotrzebne. Standardy strefy czasowej są częścią PHP od 5.2, podobnie jak obiekt DateTimeZone i powiązane funkcje standardowe.
haz

1

Aby dodać do Bainternet (dodaję to jako odpowiedź, ponieważ nie mogę komentować - mam mniej niż 50 punktów na stosie WP Development).

WordPress zapisze ciąg strefy czasowej tylko wtedy, gdy wybierzesz ciąg strefy czasowej w ustawieniach ogólnych. Wybór UTF jest domyślnym miejscem na liście, ale można przewijać w górę do ciągów strefy czasowej. Jeśli ustawisz ciąg strefy czasowej, zarówno UTF, jak i ciąg strefy czasowej zostaną ustawione. Będą takie same (co oznacza, że ​​UTF zostanie zresetowany do nowej strefy po wybraniu strefy czasowej ciągu czasowego).

(WordPress 4)


0

Istnieje kilka opcji, z których żadna naprawdę nie działa świetnie. Jest to błąd WordPress i naprawdę jest do bani, ponieważ czas jest zły, chyba że ustawisz witrynę na UTC ... co jest mylące i nie zawsze możliwe.

Myślę, że ten następny kod działa tylko wtedy, gdy wybierzesz swoją Strefę Czasową (w Ustawieniach -> Ogólne w admin) jako nazwane miasto zamiast przesunięcia numeru GMT. Nie testowałem tego, ale jest bardzo możliwe, że get_option('gmt_offset')jest ustawiony, gdy get_option('timezone_string')nie jest.

date_default_timezone_set(get_option('timezone_string'));

Minusem tego jest to, że WordPress zakłada, że ​​PHP jest ustawione na UTC podczas tworzenia znaczników czasu mysql, dzięki czemu możesz trochę popsuć bazę danych za każdym razem, gdy zmieniasz strefy czasowe! Nie wspominając już o innych wtyczkach WP, które mogą zakładać, że środowisko PHP jest zawsze w UTC.

Jeśli więc chcesz tylko mieć właściwy czas - możesz zmusić swój znacznik czasu do wyświetlania w UTC za pomocą:

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

Niestety, choć poprawne, strefa czasowa zostanie ustawiona na UTC.

I pamiętaj, że nie można używać zarówno flagi „true”, jak i domyślnej funkcji timezone_set.

Wszelkie właściwe rozwiązanie to będzie fragment kodu, który stanowi zarówno gmt_offsetI timezone_stringi wykorzystuje je, aby ustawić strefę czasową na pewnym wejścia. WP zakłada, że ​​PHP ustawia UTC podczas wykonywania znaczników czasu mysql, i może uszkodzić inne wtyczki.

Jest takie rozwiązanie na https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/, ale znowu jest to BŁĄD, więc powinieneś użyć get_post_time($date_format, TRUE)kodu, aby uzyskać znacznik czasu, który jest właściwie poprawny.


0

Biorąc pod uwagę fakt, że wordpress utrzymuje ciąg strefy czasowej w tabeli opcji, możesz użyć zorientowanego obiektowo sposobu uzyskania odpowiedniego czasu na swojej stronie 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>";
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.