web-dev-qa-db-ja.com

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

WordPress管理者に設定されているタイムゾーンを取得する方法を教えてもらえますか。

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

アメリカ/東部

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

46
user1462

もしあなたがgmt_offsetを必要とすれば

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

これは 2や-2 のような整数になります。

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

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

これはあなたに America/Indianapolis のような文字列を与えるでしょう。

75
Bainternet

残念ながら、2つの異なる選択肢があります。

  1. PHPスタイルのタイムゾーンを節約する、新しいtimezone_string
  2. 古いgmt_offset。これは、数値の浮動小数点オフセットを時間単位で節約するものです。

しかし、新しい環境ではtimezone_stringは実際に をオーバーライドして gmt_offsetを返すので、後者によって返される値は前者に基づきます。ただし、 反対の は正しくありません - gmt_offsetは有効である可能性がありますが、timezone_stringは空です。

私はこれらのことにかなりの時間を費やしており、私が私の WpDateTime library に実装した最新のテイクは以下の通りです:

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

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

12
Rarst

オプション参照ページ を確認してください。オプションgmt_offsetは整数を返します。たとえば、タイムゾーンが東部標準時(アメリカ/ニューヨークなど)に設定されている場合、gmt_offsetは-5になります。

9

あなたが 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.
 ?>
2
goldenapples

Bainternetに追加するには(私はコメントできないのでこれを回答として追加しています - 私はWP開発スタックに50ポイント未満しかありません).

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

(ワードプレス4)

1
Jeff

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>";
0
Pål Bergquist

いくつかの選択肢がありますが、どれも実際にはうまくいきません。これはWordPressのバグであり、あなたのサイトをUTCに設定しない限り時間が間違っているために本当に厄介です。

この次のコードは、GMT番号のオフセットではなく、名前付きの都市としてタイムゾーン([設定] - > [一般]の下)を選択した場合にのみ機能すると思います。私はこれをテストしていませんが、get_option('gmt_offset')が設定されていないのにget_option('timezone_string')が設定されている可能性が非常に高いです。

date_default_timezone_set(get_option('timezone_string'));

この欠点は、MySQLのタイムスタンプを作成するときにWordPressが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
Ryan Taylor