3

我们正在建立一个将在全球范围内查看的网站,因此需要我们的日期和时间来了解时区。我正在使用来自https://bitbucket.org/pellepim/jstimezonedetect的库来恢复用户的时区以及他们是否观察 DST。

在检索到这些信息后,我的问题是我有点困惑如何处理它。我们将所有 UTC 信息存储在数据库中,但是当我们从图书馆收到偏移量时,我们如何处理 DST 以及它们来自北半球还是南半球。另外我们如何在服务器端处理它。我的想法是在 PHP 上以标准 UTC 处理所有日期和时间,然后在处理视图后应用偏移量。

任何帮助将不胜感激。

亲切的问候

4

1 回答 1

3

首先,您应该只使用 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
于 2012-12-06T09:41:42.497 回答