Bagaimana cara mendapatkan pengaturan Zona Waktu WordPress?

50

Dapatkah seseorang memberi tahu saya cara mendapatkan zona waktu yang diatur di Admin WordPress?

Misalnya, jika blog disetel ke waktu Timur, saya perlu string persis ini untuk mencetak:

AS / Timur

Ini untuk fungsi yang hidup di functions.php dalam tema saya.

pengguna1462
sumber

Jawaban:

79

jika Anda memerlukan gmt_offset maka

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

ini akan memberi Anda bilangan bulat seperti 2 atau -2 .

dan jika Anda membutuhkan penggunaan string zona waktu

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

ini akan memberi Anda string seperti Amerika / Indianapolis

Bainternet
sumber
6
Timezone_string saya ada di basis data tetapi kosong, bahkan setelah memilih zona waktu yang berbeda pada halaman pengaturan. Apa yang mungkin terjadi? (WP3.6)
user2019515
Apakah gmt_offest memperhitungkan penghematan siang hari berdasarkan pengaturan zona waktu situs?
squarecandy
6
@ user2019515 Jika Anda memilih kota sebagai zona waktu, kota itu akan disimpan ke opsi "timezone_string" tetapi jika Anda memilih Offset Manual (misalnya UTC + 1), ia disimpan ke opsi "gmt_offset" (sebagai "1") dan timezone_string tetap kosong.
Berend
15

Situasi yang tidak menguntungkan adalah bahwa memang ada dua opsi yang berbeda:

  1. Lebih baru timezone_string, yang menghemat zona waktu gaya PHP.
  2. Lebih lama gmt_offset, yang menghemat offset float numerik dalam hitungan jam.

Tetapi dalam lingkungan yang lebih baru timezone_stringbenar-benar menimpa gmt_offset , nilai yang dikembalikan oleh yang terakhir akan didasarkan pada yang pertama. Namun sebaliknya tidak benar - gmt_offsetmungkin valid, sementara timezone_stringitu kosong.

Saya telah menghabiskan sedikit waktu untuk hal-hal ini, dan langkah terbaru yang saya terapkan di WpDateTimeperpustakaan saya adalah sebagai berikut:

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

Ini akan mencoba untuk instantiate objek zona waktu yang berarti dalam semua kasus yang mungkin, selama ada informasi sama sekali.

Jarang
sumber
1
Ini harus menjadi jawaban yang diterima. Orang akan menemui bug jika mereka hanya mengandalkan get_option ('timezone_string').
DiscoInfiltrator
Ini jawaban yang benar.
Lucas Bustamante
Bukankah penggunaan (int)untuk $ jam dan flooruntuk $ menit bermasalah? Menurut dokumentasi, (int)dan floorhampir sama kecuali (int)akan membulatkan -4,5 ke -4 dan floorakan membulatkannya menjadi -5. Ini sepertinya akan memberikan offset zona waktu negatif yang salah?
Mikepote
1
@Mikepote ya, ini sudah diperbaiki di lib sejak lama, hanya basi salinan kode dalam jawaban di sini.
Jarang
Ya Tuhan, mengapa mereka menerapkannya seperti ini .... Harganya miring
Blackbam
9

Periksa halaman Referensi Pilihan . Opsi gmt_offsetmengembalikan bilangan bulat. Misalnya, jika zona waktu diatur ke waktu Timur (mis. Amerika / New_York), gmt_offsetharus -5.

Travis Northcutt
sumber
2

Jangan berpikir Anda akan mendapatkan string seperti AS / Timur tanpa menyimpan semua string yang Anda inginkan dalam array dan merujuknya. Menggunakan PHP Anda bisa mendapatkan singkatan zona waktu, yaitu EST ; dan jika Anda memiliki nilai-nilai yang disimpan dalam array dengan string yang Anda inginkan, Anda bisa mencarinya.

<?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.
 ?>
lempengan emas
sumber
Ini tidak perlu. Standar zona waktu telah menjadi bagian dari PHP sejak 5.2, seperti halnya objek DateTimeZone dan fungsi standar terkait.
haz
1

Untuk menambahkan ke Bainternet (saya menambahkan ini sebagai jawaban karena saya tidak dapat berkomentar - Saya memiliki kurang dari 50 poin pada tumpukan WP Development).

WordPress hanya akan menyimpan string zona waktu jika Anda memilih string zona waktu di pengaturan umum. Pilihan UTF adalah tempat defaultnya dalam daftar, tetapi Anda dapat menggulir hingga string zona waktu. Jika Anda mengatur string zona waktu, string UTF dan zona waktu akan ditetapkan. Mereka akan sama (artinya, UTF akan diatur ulang ke zona baru saat Anda memilih zona waktu string zona waktu).

(WordPress 4)

Jeff
sumber
0

Ada beberapa opsi, tidak ada yang benar-benar berfungsi dengan baik. Ini adalah bug WordPress, dan itu benar-benar menyebalkan karena waktunya salah kecuali Anda mengatur situs Anda ke UTC ... yang membingungkan dan bahkan tidak selalu mungkin.

Kode berikut ini saya pikir hanya berfungsi jika Anda memilih Zona Waktu Anda (Di Bawah Pengaturan -> Umum di admin) sebagai kota bernama alih-alih dengan offset nomor GMT. Saya belum menguji ini tetapi sangat mungkin yang get_option('gmt_offset')diatur kapan get_option('timezone_string')tidak.

date_default_timezone_set(get_option('timezone_string'));

Kelemahan dari ini adalah bahwa WordPress menganggap PHP diatur ke UTC saat membuat stempel waktu mysql, sehingga Anda dapat mengacaukan database Anda sedikit setiap kali Anda beralih zona waktu! Belum lagi plugin WP lain mungkin berasumsi bahwa lingkungan PHP selalu dalam UTC.

Jadi, jika Anda hanya ingin waktu yang tepat - Anda dapat memaksa cap waktu Anda berada di UTC dengan:

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

Sayangnya, meskipun benar, itu akan membuat zona waktu diatur ke UTC.

Dan catatan bahwa Anda tidak dapat baik menggunakan "benar" bendera dan fungsi standar timezone_set.

Setiap solusi yang tepat akan menjadi potongan kode yang menyumbang untuk gmt_offsetDAN timezone_stringdan menggunakannya untuk menetapkan zona waktu pada beberapa input. WP mengasumsikan bahwa PHP disetel ke UTC saat melakukan cap waktu mysql, dan itu mungkin merusak plugin lain.

Ada satu solusi seperti itu di https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ tetapi, sekali lagi ini adalah BUG, ​​jadi Anda harus menggunakan get_post_time($date_format, TRUE)kode untuk mendapatkan stempel waktu yang sebenarnya benar.

Ryan Taylor
sumber
0

Mengingat fakta bahwa wordpress menyimpan string zona waktu dalam tabel opsi, Anda dapat menggunakan cara berorientasi objek untuk mendapatkan waktu yang tepat di situs wordpress Anda:

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