回答:
gmt_offsetが必要な場合は、
<?php echo get_option('gmt_offset'); ?>
これにより、2または-2のような整数が得られます。
タイムゾーン文字列が必要な場合は
<?php echo get_option('timezone_string'); ?>
これにより、America / Indianapolisのような文字列が得られます
残念なことに、実際には2つの異なるオプションがあります。
timezone_string
、PHPスタイルのタイムゾーンを節約します。gmt_offset
、これは数値の浮動小数点オフセットを時間単位で保存します。しかし、新しい環境でtimezone_string
は、実際にをオーバーライド gmt_offset
し、後者によって返される値は前者に基づいています。ただし、その反対は真実ではありません。空のgmt_offset
場合は有効かもしれませんtimezone_string
。
私はこれらのことにかなりの時間を費やしてきましたが、私がWpDateTime
ライブラリーに実装した最新の取り組みは次のとおりです。
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 );
}
}
これは、すべての情報が利用可能である限り、すべての可能な場合に意味のあるタイムゾーンオブジェクトをインスタンス化しようとします。
(int)
$ hoursとfloor
$ minutesの使用に問題はありませんか?マニュアルに従って、(int)
およびfloor
以外はほぼ同じである(int)
意志ラウンド-4.5 -4及びfloor
-5それを丸めます。これは、不正確な負のタイムゾーンオフセットを与えるようです?
オプション参照ページを確認してください。オプションgmt_offset
は整数を返します。たとえば、タイムゾーンが東部標準時間(たとえば、America / New_York)に設定されている場合、gmt_offset
-5 にする必要があります。
必要なすべての文字列を配列に保存して参照せずに、US / Easternなどの文字列を取得するとは思わないでください。PHPを使用すると、タイムゾーンの略語、つまりESTを取得できます。必要な文字列を含む配列にこれらの値が保存されている場合は、それらを検索できます。
<?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.
?>
いくつかのオプションがありますが、どれも本当にうまく機能しません。これはWordPressのバグであり、サイトをUTCに設定しない限り時間が間違っているため、本当にひどいものです。
この次のコードは、GMT番号のオフセットではなく、タイムゾーン([設定]-> [管理]の[全般])を名前付き都市として選択した場合にのみ機能します。私はこれをテストしていませんが、そうでないget_option('gmt_offset')
場合に設定される可能性は非常に高いget_option('timezone_string')
です。
date_default_timezone_set(get_option('timezone_string'));
この欠点は、WordPressがmysqlタイムスタンプを作成するときにPHPがUTCに設定されていると想定しているため、タイムゾーンを切り替えるたびにデータベースを少し混乱させる可能性があることです!言うまでもなく、他のWPプラグインは、PHP環境が常にUTCであると想定する場合があります。
したがって、正しい時刻が必要な場合は、タイムスタンプを強制的にUTCにすることができます。
get_post_time('c', true); //should work for non-post objects.
残念ながら、正確ではありますが、タイムゾーンはUTCに設定されます。
また、「true」フラグとデフォルトのtimezone_set関数の両方を使用することはできません。
任意の適切な解決策は、両方を考慮したコード・スニペットなるつもりであるgmt_offset
とtimezone_string
し、いくつかの入力にタイムゾーンを設定するためにそれらを使用しています。WPは、mysqlタイムスタンプの実行時にPHPがUTCに設定されていると想定しているため、他のプラグインが破損する可能性があります。
https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/にそのようなソリューションが1つありますが、これもバグであるため、get_post_time($date_format, TRUE)
コードを使用してタイムスタンプを取得する必要があります実際に正しいです。
wordpressがタイムゾーン文字列をオプションテーブルに保持しているという事実を考えると、wordpressサイトで適切な時間を取得するオブジェクト指向の方法を使用できます。
$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);
$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";