Cum obții setarea WordPress pentru Fus Orar?

3 feb. 2011, 00:38:06
Vizualizări: 88.9K
Voturi: 65

Îmi poate spune cineva cum să obțin fusul orar care este setat în WordPress Admin?

De exemplu, dacă blogul este setat la ora de Est, am nevoie să afișez exact acest șir de caractere:

US/Eastern

Aceasta este pentru o funcție care se află în functions.php în tema mea.

0
Toate răspunsurile la întrebare 8
3
96

dacă ai nevoie de gmt_offset atunci

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

acesta va returna un întreg precum 2 sau -2.

iar dacă ai nevoie de șirul timezone folosește

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

acesta va returna un șir precum America/Indianapolis

3 feb. 2011 01:42:35
Comentarii

Opțiunea timezone_string este în baza de date dar este goală, chiar și după selectarea unei alte fus orar în pagina de setări. Care ar putea fi cauza? (WP3.6)

user2019515 user2019515
14 sept. 2013 01:48:34

Parametrul gmt_offset ține cont de ora de vară în funcție de setarea fusului orar al site-ului?

squarecandy squarecandy
19 dec. 2013 06:04:38

@user2019515 Dacă alegi un oraș ca fus orar acesta va fi salvat în opțiunea "timezone_string", dar dacă alegi un Offset Manual (UTC+1 de exemplu) acesta este salvat în opțiunea "gmt_offset" (ca "1") iar timezone_string rămâne gol.

Berend Berend
27 mar. 2017 21:06:51
7
26

Situația nefericită este că există într-adevăr două opțiuni diferite:

  1. Noua opțiune timezone_string, care salvează fusul orar în stil PHP.
  2. Vechea opțiune gmt_offset, care salvează offset-ul numeric în ore (valoare flotantă).

Dar în mediile mai noi, timezone_string de fapt suprascrie gmt_offset, valoarea returnată de aceasta din urmă va fi bazată pe prima. Totuși, inversul nu este adevărat — gmt_offset poate fi valid, în timp ce timezone_string poate fi gol.

WordPress 5.3 a livrat funcția wp_timezone(), care abstractizează acest lucru și returnează un obiect valid DateTimeZone, indiferent de setările din WP.

Înainte de aceasta, am avut o implementare proprie în biblioteca mea WpDateTime (ca o curiozitate, aceasta a fost folosită ca bază pentru implementarea din nucleu):

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determină fusul orar din opțiunile WordPress și îl returnează ca obiect.
     *
     * @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 );
    }
}
16 oct. 2017 17:33:17
Comentarii

Acesta ar trebui să fie răspunsul acceptat. Oamenii vor întâmpina erori dacă se bazează doar pe get_option('timezone_string').

DiscoInfiltrator DiscoInfiltrator
14 aug. 2018 23:25:59

Acesta este răspunsul corect.

Lucas Bustamante Lucas Bustamante
9 dec. 2018 17:41:08

Utilizarea lui (int) pentru $hours și floor pentru $minutes nu este problematică? Conform documentației, (int) și floor sunt aproape la fel, cu excepția faptului că (int) va rotunji -4.5 la -4 iar floor îl va rotunji la -5. Se pare că acest lucru va da offset-uri de fus orar negative incorecte?

Mikepote Mikepote
13 mai 2019 16:22:31

@Mikepote da, această problemă a fost rezolvată în bibliotecă acum mult timp, doar că răspunsul de aici conține o versiune învechită a codului.

Rarst Rarst
15 mai 2019 13:54:47

Oh Doamne, de ce au implementat așa ceva... Mi-a luat o oră întreagă de nervi

Blackbam Blackbam
21 iun. 2019 18:29:11

Biblioteca gestionează faptul că un fus orar poate avea mai multe offset-uri? Vezi: https://stackoverflow.com/tags/timezone/info

DarkNeuron DarkNeuron
27 nov. 2019 13:49:34

@DarkNeron biblioteca lasă asta pe seama PHP-ului, care include și folosește baza de date Olson.

Rarst Rarst
29 nov. 2019 14:10:49
Arată celelalte 2 comentarii
0

Verificați pagina de referință pentru opțiuni. Opțiunea gmt_offset returnează un întreg. De exemplu, dacă fusul orar este setat la ora Estului (de exemplu, America/New_York), gmt_offset ar trebui să fie -5.

3 feb. 2011 00:44:06
0

Având în vedere faptul că WordPress păstrează șirul fusului orar în tabelul de opțiuni, puteți utiliza metoda orientată pe obiect pentru a obține ora corectă pe site-ul dvs. WordPress:

$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);

$page .= "<p> Data și ora " . $dt->format("Y-m-d H:i:s") . "</p>";
5 aug. 2019 23:01:56
1

Nu credeți că veți obține un șir precum US/Eastern fără a stoca toate șirurile dorite într-un array și a le referenția. Folosind PHP puteți obține abrevierea fusului orar, adică EST; iar dacă aveți aceste valori stocate într-un array împreună cu șirurile dorite, le puteți căuta.

<?php date_default_timezone_set(get_option('timezone_string'));

      echo date('T'); // va returna un șir de trei caractere precum "EST"

      $timezones = array (
          'EST' => 'US/Eastern',
          'CST' => 'US/Central',
          // etc, etc, etc.
          );

      echo $timezones [ date('T') ]; // ar trebui să fie ceea ce doriți.
 ?>
3 feb. 2011 07:42:20
Comentarii

Acest lucru este inutil. Standardele de fus orar fac parte din PHP încă de la versiunea 5.2, la fel ca și obiectul DateTimeZone și funcțiile standard asociate.

haz haz
24 oct. 2018 06:18:01
0

Pentru a adăuga la Bainternet (adaug acest lucru ca răspuns deoarece nu pot comenta -- am mai puțin de 50 de puncte pe WP Development stack).

WordPress va stoca doar un șir de fus orar dacă selectați un șir de fus orar în setările generale. Selecția UTF este locul în care aceasta este implicită în listă, dar puteți derula mult în sus pentru a găsi șirurile de fus orar. Dacă setați un șir de fus orar, atât UTF cât și șirul de fus orar vor fi setate. Acestea vor fi la fel (adică UTF este resetat la noua zonă atunci când selectați un fus orar sub formă de șir).

(WordPress 4)

11 dec. 2014 08:11:00
0

Cum a spus Rarst, acum poți folosi wp_timezone() care returnează un obiect de fus orar.

Sau pentru a obține fusul orar ca șir de caractere, wp_timezone_string(), care returnează 'Europe/București', 'UTC', sau offset-ul UTC precum '-6:00'.

Și dacă dorești abrevierea, wp_date('T') returnează de asemenea fusul orar localizat.

4 iun. 2021 18:15:29
0

Există câteva opțiuni, dar niciuna nu funcționează cu adevărat bine. Acesta este un bug în WordPress și este foarte enervant pentru că ora este incorectă, cu excepția cazului în care setezi site-ul la UTC... ceea ce este confuz și nu este întotdeauna posibil.

Următorul cod cred că funcționează doar dacă alegi fusul orar (în Setări -> General în administrare) după un oraș specific și nu după un offset GMT. Nu am testat acest lucru, dar este foarte posibil ca get_option('gmt_offset') să fie setat când get_option('timezone_string') nu este.

date_default_timezone_set(get_option('timezone_string'));

Dezavantajul este că WordPress presupune că PHP este setat la UTC atunci când creează marcaje temporale în MySQL, așa că poți afecta ușor baza de date atunci când schimbi fusurile orare! Și nu în ultimul rând, alte plugin-uri WordPress pot presupune că mediul PHP este întotdeauna setat la UTC.

Deci, dacă vrei doar o oră corectă – poți forța marcajul temporal să fie în UTC cu:

get_post_time('c', true); //ar trebui să funcționeze și pentru obiecte care nu sunt postări.

Din păcate, deși corect, acest lucru va seta fusul orar la UTC.

Ține minte că nu poți folosi atât parametrul "true" cât și funcția implicită timezone_set.

Orice soluție corectă va fi un fragment de cod care ia în calcul atât gmt_offset cât și timezone_string și le folosește pentru a seta un fus orar pentru o anumită intrare. WordPress presupune că PHP este setat la UTC atunci când generează marcaje temporale MySQL, iar acest lucru poate afecta alte plugin-uri.

Există o astfel de soluție pe https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/, dar, repet, acesta este un BUG, așa că ar trebui să folosești codul get_post_time($date_format, TRUE) pentru a obține un marcaj temporal care este de fapt corect.

6 nov. 2015 02:35:13