首先,您应该只使用 jsTimezoneDetect 来猜测用户的时区。它应该是用户可配置的,因为它可能不正确,并且因为用户可能希望使用与他实际所在的时区不同的时区。至少如果您有一个用户登录的系统,或者如果您有一个系统用户正在进入时代。
对于仅查看内容的临时访问者,在用户碰巧所在的任何时区显示时间应该没问题,尽管如果 jsTimezoneDetect 猜测错误的时区并且夏令时规则不同,您可能会在一小时内出错。如果您依赖 jsTimezoneDetect 的猜测,请确保清楚地显示您猜测用户所在的时区。
其次,您需要将 UTC 日期转换为用户配置的时区(或 jsTimezoneDetect 已猜到)。您可以使用幸运的是 PHP 支持的 zoneinfo/tz/Olsen 数据库(一个数据库,多个名称)来做到这一点。
我能找到的大多数在 PHP 中执行此操作的方法都涉及为整个 php 设置时区,然后格式化日期。不要那样做,那太疯狂了,始终保持 php 的时区与您的系统时区相同。
相反,在DateTime 库的 DateTimeZone 对象中,支持为 DateTimes 设置时区并对其进行格式化。这就是前进的道路。
所以你可以做这样的事情。首先使用从数据库中获取的数据创建一个 UTC 格式的 DateTime 对象。
php > $date = new DateTime('2000-01-01', new DateTimeZone('UTC'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
2000-01-01 00:00:00+00:00
然后您可以将其转换为用户时区:
php > $date->setTimezone(new DateTimeZone('Pacific/Chatham'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
2000-01-01 13:45:00+13:45
或者另一个:
php > $date->setTimezone(new DateTimeZone('US/Eastern'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
1999-12-31 19:00:00-05:00