Ответы:
если вам нужен gmt_offset тогда
<?php echo get_option('gmt_offset'); ?>
это даст вам целое число, например 2 или -2 .
и если вам нужна строка часового пояса, используйте
<?php echo get_option('timezone_string'); ?>
это даст вам строку, как Америка / Индианаполис
Неудачная ситуация заключается в том, что действительно есть два разных варианта:
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)
течение $ часов и floor
$ минут проблематичным? Согласно документации, (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.
?>
Чтобы добавить в Bainternet (я добавляю это как ответ, потому что я не могу комментировать - у меня меньше 50 очков в стеке разработки WP).
WordPress будет хранить строку часового пояса, только если вы выберете строку часового пояса в общих настройках. Выбор UTF - то, где это по умолчанию в списке, но вы можете прокрутить путь до строк часового пояса. Если вы установите строку часового пояса, то будут установлены как UTF, так и строка часового пояса. Они будут одинаковыми (то есть UTF будет сброшен в новую зону при выборе строки часового пояса timezone).
(WordPress 4)
Есть несколько вариантов, ни один из которых не работает отлично. Это ошибка WordPress, и она действительно отстой, потому что время не подходит, если вы не установите свой сайт на UTC ... что сбивает с толку и не всегда даже возможно.
Этот следующий код, я думаю, работает только в том случае, если вы выберете часовой пояс («Настройки» -> «Общие в админке») в качестве названного города вместо смещения номера по Гринвичу. Я не проверял это, но вполне возможно, что get_option('gmt_offset')
установлен, когда get_option('timezone_string')
нет.
date_default_timezone_set(get_option('timezone_string'));
Недостатком этого является то, что WordPress предполагает, что PHP установлен на UTC при создании меток времени mysql, так что вы можете немного испортить свою базу данных при каждом переключении часовых поясов! Не говоря уже о других плагинах WP, можно предположить, что среда PHP всегда находится в UTC.
Итак, если вы просто хотите указать правильное время - вы можете принудительно установить временную метку в UTC с помощью:
get_post_time('c', true); //should work for non-post objects.
К сожалению, хотя это правильно, часовой пояс будет установлен на UTC.
И заметьте , что вы не можете одновременно использовать «истинный» флаг и функции в timezone_set по умолчанию.
Любое правильное решение - это фрагмент кода, который учитывает оба gmt_offset
AND timezone_string
и использует их для установки часового пояса для некоторого ввода. WP предполагает, что PHP устанавливает UTC при выполнении меток времени mysql, и это может нарушить работу других плагинов.
На https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ есть одно такое решение, но, опять же, это ошибка, поэтому вы должны использовать 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>";