我们正在构建一个将在全局范围内查看的站点,因此需要我们的日期和时间能够识别时区。我正在使用 https://bitbucket.org/pellepim/jstimezonedetect 中的库恢复用户的时区以及他们是否观察 DST。
在检索到这些信息后,我的问题是什么,我对如何处理它感到有些困惑。我们将所有信息以 UTC 格式存储在数据库中,但是当我们从图书馆收到偏移量时,我们如何处理 DST 以及它们是来自北半球还是南半球。还有我们如何在服务器端处理它。我的想法是在 PHP 上以标准 UTC 处理所有日期和时间,然后在处理 View 后应用偏移量。
如有任何帮助,我们将不胜感激。
亲切的问候
最佳答案
首先,您应该只使用 jsTimezoneDetect 来猜测用户的时区。它应该是用户可配置的,既因为它可能不正确,也因为用户可能想使用与他实际所在的时区不同的时区。至少如果你有一个用户登录的系统或者你有一个系统用户正在输入时间。
对于仅查看内容的临时访问者,显示用户恰好所在时区的时间应该没问题,尽管如果 jsTimezoneDetect 猜测错误的时区和夏令时规则不同,您可能会出错一个小时。如果您依赖 jsTimezoneDetect 的猜测,请确保清楚地显示您猜测用户所在的时区。
其次,您需要将 UTC 日期转换为用户配置的时区(或 jsTimezoneDetect 猜测的时区)。您可以使用幸运的 PHP 支持的 zoneinfo/tz/Olsen 数据库(一个数据库,多个名称)来做到这一点。
我能找到的大多数在 PHP 中执行此操作的方法都涉及为整个 PHP 设置时区,然后格式化日期。不要那样做,那太疯狂了,始终保持 php 的时区与您的系统时区相同。
取而代之的是 DateTime library的 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
关于php - 使用时区数据来锻炼本地用户时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13725596/