Yanıtlar:
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
Talihsiz durum aslında iki farklı seçenek olmasıdır:
timezone_string
, PHP tarzı zaman dilimi kazandırır.gmt_offset
, bu sayı cinsinden yüzdürme dengesini saat cinsinden kurtarır.Ancak, yeni ortamlarda timezone_string
gerç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_offset
olabilir, geçerli olabilir timezone_string
.
Bu şeylere epeyce zaman harcıyorum ve WpDateTime
kü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.
(int)
Dolar ve saatlerce dolar kullanmak floor
problemli değil mi? Belgelere göre (int)
ve floor
dışı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?
Seçenek Referans sayfasını kontrol edin . Seçenek gmt_offset
bir tamsayı döndürür. Örneğin, saat dilimi Doğu saatine ayarlanmışsa (örneğin, America / New_York), gmt_offset
-5 olmalıdır.
İ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.
?>
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)
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_offset
VE timezone_string
ve 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.
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>";