告别相差8小时问题,在 WordPress 正确使用 Date 和 Time

使用 Date 和 Time 是 WordPress 第三方开发者非常日常的工作,我们知道 PHP 提供了非常多的时间相关的函数和类,但是 WordPress 对时间的处理 , 有自己一套的逻辑 。
很多人刚开始在 WordPress 处理时间相关的功能或者问题的时候,经常碰到一些意外的情况,这是因为对 WordPress 的一些设置和处理逻辑不熟悉造成的 。下面讲解下在 WordPress 中使用 Date 和 Time 的经验和坑:
UTC 时区
在 PHP 中,我们可以使用 date 函数格式化一个时间戳,比如:
echo date(Y-m-d H:i:s, 1669043745); // 2022-11-21 23:15:45如果我们在 WordPress 也这么使用 , 将会输出:2022-11-21 15:15:45,将会相差8小时,这是为什么呢?
因为 WordPress 为了防止因为系统不同设置造成的问题,先把默认的时区设置为 UTC,也就是格林威治标准时间,和北京时间正好差8个小时 。这个是在 wp-settings.php 大概 68行的位置:
// WordPress calculates offsets from UTC. // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set date_default_timezone_set( UTC );wp_date那么在 WordPress 要正确基于时间戳显示当地的时间如何办呢?使用 wp_date 函数:
echo wp_date(Y-m-d H:i:s, 1669043745); // 2022-11-21 23:15:45这个函数将会自动获取在 WordPress 后台设置的时区(如下图所示),然后按照该时区格式化时间戳 。
所以在 WordPress 进行格式化时间戳操作的时候,只需要记住这条规则:把 date 函数替换成 wp_date 函数即可 。
除了能够正确获取本地时区之外 , wp_date 函数还能进行一些本地化工作 。

告别相差8小时问题,在 WordPress 正确使用 Date 和 Time

文章插图
比如要使用如上图所示后台设置的日期和时间格式显示当前的时间:
$date_format = get_option(date_format); $time_format = get_option(time_format); echo wp_date("{$date_format} {$time_format}"); // 2022年11月21日 下午23:15wp_timezonewp_date 函数之所以能够正确显示时间,是因为 WordPress 提供了两个时区的函数,他们能够正确返回后台设置的时区:
wp_timezone_string() 用于获取当前站点的时区,后台无论是通过 timezone_string(比如: Asia/Shanghai )还是 gmt_offset(比如:UTC+8)方式设置都可以 。wp_timezone() 也是获取当前站点的时区,但是返回的是 DateTimeZone 对象 。wpjam_strtotime
前面解决了在 WordPress 中基于时间戳正确显示时间的问题,然后还有一个常见的操作就是将日期转换为日期戳,PHP 提供了一个 strtotime 的函数:
echo strtotime("2022-11-21 23:15:45"); // 1669072545和上面输入的 1669043745 也是相差 8×3600 , 也是8小时,同样的原因 , 这个函数也是基于系统默认的时区的,前面可知 , WordPress 设置默认的时区是 UTC 时区 。
所以为了方便将当地时间正确转换成时间戳,所以我写了一个函数 wpjam_strtotime:
function wpjam_strtotime($string){ return date_create($string, wp_timezone())->getTimestamp(); }利用前面介绍的 WordPress 提供的函数 wp_timezone() , 这个获取时间戳:
echo wpjam_strtotime("2022-11-21 23:15:45"); // 1669043745wpjam_strtotime 很快会在 WPJAM Basic 新版本中发布,所以有了第二条规则:在 WordPress 进行日期和时间转换成时间戳操作的时候,把 strtotime 函数替换成 wpjam_strtotime 函数即可 。
总结
一句话总结,我们在 WordPress 中可以使用 Date 和 Time 做很多事情,但是一定使用 WordPress 方式,WordPress 方式 , 我也总结为两条规则:
进行格式化时间戳操作的时候:
把 date 函数替换成 wp_date 函数 。将日期和时间转换成时间戳的时候:
【告别相差8小时问题,在 WordPress 正确使用 Date 和 Time】把 strtotime 函数替换成 wpjam_strtotime 函数 。