WordPress Saat Dilimi ayarı nasıl yapılır?


50

Birisi bana WordPress Yöneticisi'nde ayarlanan saat dilimini nasıl bulacağımı söyleyebilir mi?

Örneğin, blog Doğu saatine ayarlanmışsa, yazdırmak için bu tam dizgeye ihtiyacım var:

ABD / Doğu

Bu, temamda functions.php'da yaşayan bir işlev içindir.

Yanıtlar:


79

gmt_offset’e ihtiyacınız varsa, o zaman

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

bu size 2 ya da -2 gibi bir tam sayı verecektir .

ve saat dilimi dizesinin kullanılması gerekiyorsa

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

bu size America / Indianapolis gibi bir dize verecek


6
Benim zaman dilimim_string veritabanında ama ayarlar sayfasında farklı bir zaman dilimi seçtikten sonra bile boş. Durum ne olabilir? (WP3.6)
user2019515

Gmt_offest, sitenin saat dilimi ayarına göre gün ışığı tasarrufunu dikkate alıyor mu?
squarecandy

6
@ user2019515 Bir zaman dilimi olarak bir şehir seçerseniz, "timezone_string" seçeneğine kaydeder, ancak bir Manuel Ofset (örneğin UTC + 1) seçerseniz "gmt_offset" seçeneğine ("1" gibi) ve timezone_string seçeneğine kaydedilir. boş kalır.
Berend,

15

Talihsiz durum aslında iki farklı seçenek olmasıdır:

  1. Daha yeni timezone_string, PHP tarzı zaman dilimi kazandırır.
  2. Daha eski gmt_offset, bu sayı cinsinden yüzdürme dengesini saat cinsinden kurtarır.

Ancak, yeni ortamlarda timezone_stringgerçekte geçersiz kılınır gmt_offset , ikincisinin döndürdüğü değer öncekine dayanır. Ancak bunun tersi doğru değil - boş gmt_offsetolabilir, geçerli olabilir timezone_string.

Bu şeylere epeyce zaman harcıyorum ve WpDateTimekütüphanemde uyguladığım en güncel süreç şöyle :

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

Bu, herhangi bir bilgi mevcut olduğu sürece, olası tüm durumlarda anlamlı bir saat dilimi nesnesini başlatmaya çalışacaktır.


1
Bu kabul edilen cevap olmalı. İnsanlar sadece get_option ('timezone_string') 'e güvenirlerse, hatalarla karşılaşırlar.
DiscoInfiltrator

Bu doğru cevap.
Lucas Bustamante,

(int)Dolar ve saatlerce dolar kullanmak floorproblemli değil mi? Belgelere göre (int)ve floordışında hemen hemen aynı (int)-4 -4.5 yuvarlak ve floor-5 ° C yuvarlak olacaktır. Bu yanlış negatif zaman dilimi ofsetleri verecek gibi görünüyor?
Mikepote

1
@Mikepote evet, bu uzun zaman önce libde düzeltildi, cevaptaki kodun eski kopyası.
Rarst

Oh aman tanrım neden böyle uyguladılar .... Bana tam bir saat eğim yaptı
Blackbam


2

İstediğiniz tüm dizileri bir dizide saklamadan ve bunlara atıfta bulunmadan ABD / Doğu gibi bir dize alacağınızı düşünmeyin . PHP kullanarak saat dilimi kısaltmasını, yani EST'yi alabilirsiniz . ve bir dizide saklanan bu değerleri istediğiniz dizelere sahipseniz, bunlara bakabilirsiniz.

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

Bu gereksiz. Saat dilimi standartları , DateTimeZone nesnesi ve ilgili standart işlevler gibi 5.2'den beri PHP'nin bir parçasıdır .
haz

1

Bainternet'e eklemek için (Bunu bir cevap olarak ekliyorum çünkü yorum yapamıyorum - WP Geliştirme yığınında 50 puanım daha az).

WordPress, genel ayarlarında bir saat dilimi dizesi seçtiyseniz yalnızca bir saat dilimi dizesi depolar. UTF seçimi, listedeki varsayılan konumdur, ancak saat dilimi dizelerine kadar kaydırma yapabilirsiniz. Bir zaman dilimi dizesi ayarlarsanız, hem UTF hem de Zaman dilimi dizesi ayarlanır. Bunlar aynı olacaktır (yani, bir saat dilimi dizgesi zaman dilimi seçtiğinizde UTF yeni bölgeye sıfırlanır).

(WordPress 4)


0

Hiçbiri gerçekten iyi çalışmayan birkaç seçenek var. Bu bir WordPress hatasıdır ve gerçekten berbat bir durumdur çünkü sitenizi UTC'ye ayarlamadığınız sürece zaman yanlış olur; bu da kafa karıştırıcıdır ve her zaman mümkün değildir.

Bu sonraki kod, yalnızca Saat Dilimi ayarını (Ayarlar altında -> Genel olarak yönetici altında) GMT numarası ofset yerine adlandırılmış bir şehir olarak seçtiyseniz çalışır. Bunu test etmedim ancak olmadığında get_option('gmt_offset')ayarlanması çok mümkün get_option('timezone_string').

date_default_timezone_set(get_option('timezone_string'));

Bunun dezavantajı, WordPress'in MySQL zaman damgaları yaparken PHP'nin UTC'ye ayarlanmış olduğunu varsaymasıdır, böylece zaman dilimlerini değiştirdiğinizde veritabanınızı biraz karıştırırsınız! Diğer WP eklentilerinden bahsetmiyorum bile, PHP ortamının her zaman UTC'de olduğunu varsayabilir.

Bu nedenle, doğru bir zaman istiyorsanız, zaman damgasınızı UTC’de olması için zorlayabilirsiniz:

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

Maalesef, doğru olmasına rağmen, saat diliminin UTC'ye ayarlanmasını sağlar.

Ve unutmayın , her iki "gerçek" bayrağını kullanmak ve varsayılan timezone_set fonksiyonunu.

Herhangi uygun bir çözüm olacak hem hesaba katan bir kod parçacığı olacak gmt_offsetVE timezone_stringve bazı girişe bir zaman dilimini ayarlamak için bunları kullanır. WP, PHP'nin mysql zaman damgaları yaparken UTC'ye ayarlandığını ve diğer eklentileri bozabileceğini varsayar.

Https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ adresinde böyle bir çözüm var ama yine de bu bir HATA, bu nedenle get_post_time($date_format, TRUE)bir zaman damgası almak için kodu kullanmalısınız. aslında doğru.


0

Wordpress'in zaman dilimi dizesini seçenekler tablosunda tuttuğu gerçeği göz önüne alındığında, wordpress sitenizde doğru zamanı bulmak için nesne yönelimli yolunu kullanabilirsiniz:

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

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.