Answers:
如果您需要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
为$分钟有问题?根据文档,除了将-4.5舍入到-4 并将其舍入到-5 之外(int)
,floor
它们几乎相同。这似乎会给错误的负时区偏移量?(int)
floor
检查“ 选项参考”页面。该选项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.
?>
有几种选择,没有一个真的能很好地工作。这是一个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_offset
AND 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)
代码来获取一个时间戳实际上是正确的。