Cum obții setarea WordPress pentru Fus Orar?
Î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.

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

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)

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

Situația nefericită este că există într-adevăr două opțiuni diferite:
- Noua opțiune
timezone_string
, care salvează fusul orar în stil PHP. - 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 );
}
}

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

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 da, această problemă a fost rezolvată în bibliotecă acum mult timp, doar că răspunsul de aici conține o versiune învechită a codului.

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

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

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.

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>";

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

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.

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)

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.

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.
