告别相差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 函数还能进行一些本地化工作。

比如要使用如上图所示后台设置的日期和时间格式显示当前的时间:

$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 也是相差 8x3600,也是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 方式,我也总结为两条规则:

  1. 进行格式化时间戳操作的时候:date 函数替换成 wp_date 函数
  2. 将日期和时间转换成时间戳的时候:strtotime 函数替换成 wpjam_strtotime 函数

©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。