我们正在构建一个可以在全球范围内查看的网站,因此需要我们的日期和时间具有时区意识。我使用的库来自https://bitbucket.org/pellepim/jstimezonedetect以恢复用户的时区以及他们是否观察到DST。
我的问题是,在检索到这些信息后,我有点困惑该怎么处理。我们将所有UTC信息存储在数据库中,但当我们从库中收到偏移量时,我们如何处理DST,以及它们是来自北半球还是南半球。还有我们如何在服务器端处理它。我的想法是在PHP上用标准UTC处理所有日期和时间,然后在处理视图时应用偏移量。
如有任何帮助,我们将不胜感激。
向致以诚挚的问候
首先,您应该只使用jsTimezoneDetect来猜测用户的时区。它应该是用户可配置的,既因为它可能不正确,也因为用户可能希望使用其他时区,而不是他实际所在的时区。至少如果你有一个用户登录的系统,或者如果你有用户输入时间的系统。
对于只查看东西的临时访客来说,在用户碰巧所在的任何时区显示时间应该是可以的,尽管如果jsTimezoneDetect猜测错误的时区和夏令时规则不同,你可能会错一个小时。如果您依赖jsTimezoneDetect的猜测,请确保清楚地显示您猜测用户所在的时区。
其次,您需要将UTC日期转换为用户配置的时区(或jsTimezoneDetect猜测的时区)。您可以使用zoneinfo/tz/Olsen数据库(一个数据库,多个名称)来实现这一点,幸运的是PHP支持该数据库。
我能找到的大多数在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