告别相差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_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 函数。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/64163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

相关推荐

软文友链广告合作联系站长qq81118366