如何获取WordPress时区设置?


50

有人可以告诉我如何获取WordPress Admin中设置的时区吗?

例如,如果博客设置为东部时间,则需要此确切的字符串才能打印出来:

美国/东部

这是针对生活在我主题中的functions.php中的函数。

Answers:


79

如果您需要gmt_offset然后

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

这将为您提供2或-2这样的整数。

以及是否需要使用时区字符串

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

这会给你像美国/印第安纳波利斯这样的字符串


6
我的timezone_string在数据库中,但是它是空的,即使在设置页面上选择了其他时区也是如此。可能是什么情况?(WP3.6)
user2019515 2013年

gmt_offest是否根据网站的时区设置考虑夏令时?
squarecandy 2013年

6
@ user2019515如果您选择城市作为时区,它将保存到“ timezone_string”选项,但是如果您选择“手动偏移”(例如,UTC + 1),它将保存到“ gmt_offset”选项(如“ 1”)和timezone_string保持为空。
Berend

15

不幸的是,确实存在两种不同的选择:

  1. 较新timezone_string,节省了PHP样式的时区。
  2. 较旧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)了$小时floor为$分钟有问题?根据文档,除了将-4.5舍入到-4 并将其舍入到-5 之外(int)floor它们几乎相同。这似乎会给错误的负时区偏移量?(int)floor
Mikepote

1
@Mikepote是的,这很久以前已在lib中修复,这里的答案只是代码的陈旧副本。
拉斯特

噢,我的上帝,他们为什么实现它这样的....非常贵了整整一个小时倾斜
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 Development堆栈上的得分不足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_offsetAND timezone_string并使用它们在某些输入上设置时区。WP假定在执行mysql时间戳时将PHP设置为UTC,并且它可能会破坏其他插件。

https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/上有一个这样的解决方案,但这又是一个BUG,因此您应该使用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>";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.