WordPressタイムゾーン設定を取得する方法


50

WordPress Adminで設定されているタイムゾーンを取得する方法を教えてもらえますか?

たとえば、ブログが東部標準時間に設定されている場合、印刷するにはこの正確な文字列が必要です。

米国/東部

これは、私のテーマのfunctions.phpにある関数用です。

回答:


79

gmt_offsetが必要な場合は、

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

これにより、2または-2のような整数が得られます。

タイムゾーン文字列が必要な場合は

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

これにより、America / Indianapolisのような文字列が得られます


6
私のtimezone_stringはデータベースにありますが、設定ページで別のタイムゾーンを選択した後でも空です。何が起こるのでしょうか?(WP3.6)
ユーザー2019515

gmt_offestは、サイトのタイムゾーン設定に基づいて夏時間を考慮しますか?
squarecandy

6
@ user2019515タイムゾーンとして都市を選択した場合、「timezone_string」オプションに保存されますが、手動オフセット(例えば、UTC + 1)を選択した場合、「gmt_offset」オプション(「1」として)およびtimezone_stringに保存されます空のままです。
ベレンド

15

残念なことに、実際には2つの異なるオプションがあります。

  1. 新しいtimezone_string、PHPスタイルのタイムゾーンを節約します。
  2. Older 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 );
    }
}

これは、すべての情報が利用可能である限り、すべての可能な場合に意味のあるタイムゾーンオブジェクトをインスタンス化しようとします。


1
これは受け入れられた答えでなければなりません。get_option( 'timezone_string')のみに依存していると、人々はバグに遭遇します。
DiscoInfiltrator

これは正解です。
ルーカスブスタマンテ

(int)$ hoursとfloor$ minutesの使用に問題はありませんか?マニュアルに従って、(int)およびfloor以外はほぼ同じである(int)意志ラウンド-4.5 -4及びfloor-5それを丸めます。これは、不正確な負のタイムゾーンオフセットを与えるようです?
マイクポテ

1
@Mikepoteええ、これはかなり前にライブラリで修正されました。答えのコードの古いコピーです。
ラースト

ああ、私の神は、なぜ彼らはこのようにそれを実装しなかった....それは私に完全な時間の負けましチルト
Blackbam


2

必要なすべての文字列を配列に保存して参照せずに、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.
 ?>

これは不要です。タイムゾーンの基準はありとして、5.2以来PHPの一部となっているDateTimeZoneをオブジェクトと関連する標準機能を。
haz

1

Bainternetに追加するには(コメントできないため、これを回答として追加しています。WP開発スタックのポイントは50未満です)。

一般設定でタイムゾーン文字列を選択した場合、WordPressはタイムゾーン文字列のみを保存します。UTF選択はリストのデフォルトの場所ですが、タイムゾーン文字列までスクロールできます。タイムゾーン文字列を設定すると、UTFとタイムゾーン文字列の両方が設定されます。それらは同じです(つまり、タイムゾーン文字列timezoneを選択すると、UTFは新しいゾーンにリセットされます)。

(WordPress 4)


0

いくつかのオプションがありますが、どれも本当にうまく機能しません。これは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_offsettimezone_stringし、いくつかの入力にタイムゾーンを設定するためにそれらを使用しています。WPは、mysqlタイムスタンプの実行時にPHPがUTCに設定されていると想定しているため、他のプラグインが破損する可能性があります。

https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/にそのようなソリューションが1つありますが、これもバグであるため、get_post_time($date_format, TRUE)コードを使用してタイムスタンプを取得する必要があります実際に正しいです。


0

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>";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.