web-dev-qa-db-ja.com

WordPressのタイムゾーン設定に基づいてDateTime()を表示時間に変換する方法

私はPHPのDateTime()を使う必要があります。現在、WordPress管理者のタイムゾーン設定(EST)に設定されている時間ではなく、GMT時間を表示しています。

タイムベースを表示するためにこれを変換する方法

$time = new DateTime();
echo $time->format("Y-m-d h:i:s");

// 2015-08-12 04:35:34 (gmt)
// 2015-08-12 12:35:34 (what i want -- EST)
5
user1462

私が知っている限り(そして documentation から)、EliasNSの答えが正しいとマークされている理由がわからない場合は、DateTime::__construct()の2番目のパラメータ(もしあれば)はDateTimeZoneインスタンスにすべきです。

問題は、どのようにしてDateTimeZoneインスタンスを作成するかということになります。ユーザーが自分のタイムゾーンとして都市を選択している場合はこれは簡単ですが、(非推奨の)Etc/GMTタイムゾーンを使用してオフセットを設定している場合は回避できます。

/**
 *  Returns the blog timezone
 *
 * Gets timezone settings from the db. If a timezone identifier is used just turns
 * it into a DateTimeZone. If an offset is used, it tries to find a suitable timezone.
 * If all else fails it uses UTC.
 *
 * @return DateTimeZone The blog timezone
 */
function wpse198435_get_blog_timezone() {

    $tzstring = get_option( 'timezone_string' );
    $offset   = get_option( 'gmt_offset' );

    //Manual offset...
    //@see http://us.php.net/manual/en/timezones.others.php
    //@see https://bugs.php.net/bug.php?id=45543
    //@see https://bugs.php.net/bug.php?id=45528
    //IANA timezone database that provides PHP's timezone support uses POSIX (i.e. reversed) style signs
    if( empty( $tzstring ) && 0 != $offset && floor( $offset ) == $offset ){
        $offset_st = $offset > 0 ? "-$offset" : '+'.absint( $offset );
        $tzstring  = 'Etc/GMT'.$offset_st;
    }

    //Issue with the timezone selected, set to 'UTC'
    if( empty( $tzstring ) ){
        $tzstring = 'UTC';
    }

    $timezone = new DateTimeZone( $tzstring );
    return $timezone; 
}

それからあなたは次のようにそれを使うことができます:

$time = new DateTime( null, wpse198435_get_blog_timezone() );
8
Stephen Harris

私は自分のライブラリで現在のWPのタイムゾーンを適切なオブジェクトとして取得するメソッドを開発しました: WpDateTimeZone::getWpTimezone()

timezone_stringは簡単です(すでに有効なタイムゾーン名です)が、gmt_offsetの場合は厄介です。私が思い付くことができる最高のものはそれを+00:00フォーマットに変換することです:

$offset  = get_option( 'gmt_offset' );
$hours   = (int) $offset;
$minutes = ( $offset - floor( $offset ) ) * 60;
$offset  = sprintf( '%+03d:%02d', $hours, $minutes )
3
Rarst

DateTimeは、WordPressのオプションから取得できるDateTimeZoneパラメータを追加したものです。何かのようなもの:

$time = new DateTime(NULL, get_option('gmt_offset'));

お役に立てれば。

編集:私はそれをテストしているのですが、エラーになります。 timezone stringDateTimeZoneオブジェクトに変換する方法がわかりませんが、それが方法です。

0
EliasNS