例如,如果博客设置为东部时间,我需要以下确切的字符串才能打印出来:
US / Eastern
这是针对存在于我主题中的functions.php中的函数。
#1 楼
如果需要gmt_offset,则<?php echo get_option('gmt_offset'); ?>
这将为您提供2或-2这样的整数。
,并且如果您需要时区字符串使用
<?php echo get_option('timezone_string'); ?>
这将为您提供类似于America / Indianapolis
的字符串
#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_offset
和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)
代码获取实际上正确的时间戳。
评论
我的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