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

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


US / Eastern


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

#1 楼

如果需要gmt_offset,则

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

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

,并且如果您需要时区字符串使用

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

这将为您提供类似于America / Indianapolis
的字符串

评论


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

–user2019515
13年9月13日在22:48

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

– squarecandy
2013年12月19日下午4:04

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

– Berend
17 Mar 27 '17在18:06



#2 楼

不幸的是,确实有两种选择:



较新的timezone_string,节省了PHP样式的时区。
较旧的gmt_offset,节省了以小时为单位的数字浮点偏移量。

但是在较新的环境中,timezone_string实际上会覆盖gmt_offset,后者返回的值将基于前者。但是相反的情况并不正确-gmt_offset可能有效,而timezone_string为空。

WordPress 5.3附带了wp_timezone()函数,该函数对其进行抽象并返回有效的DateTimeZone对象,而与基础WP设置无关。 br />
在此之前,我先在自己的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 );
    }
}


评论


这应该是公认的答案。如果人们仅依靠get_option('timezone_string')会遇到错误。

– DiscoInfiltrator
18年8月14日在20:25



这是正确的答案。

–卢卡斯·布斯塔曼特(Lucas Bustamante)
18/12/9在15:41

使用(int)花费$ hours和使用地板数$ minutes是否有问题?根据文档,(int)和floor几乎相同,除了(int)会将-4.5舍入到-4以及floor将其舍入到-5。这似乎会给出错误的负时区偏移量?

–迈克波特
19年5月13日在13:22



@Mikepote是的,很久以前它已在lib中修复,这里的答案只是过时的代码副本。

–稀有
19年5月15日在10:54

哦,天哪,他们为什么要像这样实现它....我花了整整一个小时的时间

– Blackbam
19年6月21日在15:29



#3 楼

检查“选项参考”页面。选项gmt_offset返回一个整数。例如,如果将时区设置为东部时间(例如America / New_York),则gmt_offset应为-5。

#4 楼

不要以为如果不将想要的所有字符串存储在数组中并引用它们,就将得到像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
18-10-24在3:18



#5 楼

鉴于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>";


#6 楼

要添加到Bainternet(我将其添加为答案,因为我无法发表评论-WP开发堆栈上的积分不足50分)。

如果您选择时区,WordPress仅会存储时区字符串常规设置中的字符串。 UTF选择是列表中默认的位置,但是您可以向上滚动到时区字符串。如果设置时区字符串,则将同时设置UTF和时区字符串。它们将是相同的(意味着,当您选择时区字符串时区时,UTF会重置为新区域)。

(WordPress 4)

#7 楼

有几种选择,没有一个真的能很好地工作。这是一个WordPress错误,确实很烂,因为时间不对,除非您将网站设置为UTC ...这是令人困惑的,甚至并非总是可能。

我认为这下一个代码仅在以下情况下才有效您选择时区(在设置下->管理员中的常规)作为命名城市,而不用GMT数字偏移量。我还没有测试过,但是很有可能在没有设置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。

请注意,您不能同时使用“ true标记和默认的timezone_set函数。

任何正确的解决方案都应该是同时解决gmt_offsettimezone_string并使用它们在某些输入上设置时区的代码段。 WP假设在执行mysql时间戳时,PHP设置为UTC,并且可能会破坏其他插件。

https://www.skyverge.com/blog/down-the-rabbit- Hole-wordpress-and-timezones /,但这又是一个BUG,因此您应该使用get_post_time($date_format, TRUE)代码获取实际上正确的时间戳。