使用 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
函数还能进行一些本地化工作。
比如要使用如上图所示后台设置的日期和时间格式显示当前的时间:
$date_format = get_option('date_format');
$time_format = get_option('time_format');
echo wp_date("{$date_format} {$time_format}"); // 2022年11月21日 下午23:15
wp_timezone
wp_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"); // 1669043745
wpjam_strtotime
很快会在 WPJAM Basic 新版本中发布,所以有了第二条规则:在 WordPress 进行日期和时间转换成时间戳操作的时候,把
函数替换成 strtotime
函数即可。wpjam_strtotime
总结
一句话总结,我们在 WordPress 中可以使用 Date 和 Time 做很多事情,但是一定使用 WordPress 方式,WordPress 方式,我也总结为两条规则:
- 进行格式化时间戳操作的时候:把
date
函数替换成wp_date
函数。 - 将日期和时间转换成时间戳的时候:把
函数替换成strtotime
函数。wpjam_strtotime