Как преобразовать DateTime() для отображения времени на основе настройки часового пояса WordPress?


Мне нужно использовать PHP DateTime(). В настоящее время он отображает время по Гринвичу вместо времени, установленного для настройки часового пояса (EST) в администраторе WordPress.

Как это можно преобразовать, чтобы показать временную базу

$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)
Author: fuxia, 2015-08-12

3 answers

Я не уверен, почему ответ Элиаснса отмечен правильно, насколько мне известно (и из документации ), второй параметр DateTime::__construct(), если он указан, должен быть экземпляром 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
Author: Stephen Harris, 2017-04-01 13:36:58

Я разработал метод в своей библиотеке для извлечения текущего часового пояса 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
Author: Rarst, 2018-10-24 00:29:17

DateTime указывает параметр DateTimeZone, который вы можете получить из параметров WordPress. Что-то вроде:

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

Надеюсь, это поможет.

Редактировать: Я тестирую его и получаю ошибку. Я не знаю, как преобразовать timezone string в объект DateTimeZone, но это способ.

 -1
Author: EliasNS, 2017-04-13 12:37:53