我必须维护一些旧的浏览器游戏,在这个游戏中,用户拥有可以产生资源的行星。当用户打开星球 View 时,资源量是通过构建星球上次更新和当前时间之间的差异来计算的,如下所示:
$secondsBetweenUpdate = time() - $lastUpdate; // Timestamps
今晚有时间转换(至少在德国从夏令时到正常时间 - 或者正如我们在德语中所说的从“夏令时”到“冬令时”),因此在"new"凌晨 2 点和"new"之间"凌晨 3 点,上述差异为负数,因此玩家会失去资源而不是获得资源。
当然,如果它变得负数,我可以通过将 $secondsBetweenUpdate 设置为零来避免丢失,但是有没有办法正确处理转变?老实说,我什至不确定什么是正确的 - 无论秋季从夏令时更改为正常时间,还是从正常时间更改为夏令时。
有人可以给我一些建议来处理这样的时间转变吗?
我看到了这个关于 Daylight saving time and time zone best practices 的帖子一个建议是将所有时间存储为祖鲁时间。我该如何做到这一点以及如何正确地向用户显示时间 - 这意味着他看到的时间与他的时间相同,例如观看?
我们使用 PHP(当然还有 CSS 和 JavaScript)、Mysql,并部分迁移到 cakePHP 框架。
最佳答案
在您的服务器上使用 GMT 时区,该时区没有时移。
执行此操作的方式因系统而异。例如,在 Ubuntu 中,您将执行以下操作:
sudo dpkg-reconfigure tzdata
然后选择 GMT 选项。
然后,如果您需要显示日期,您可以使用 PHP 的日期库来更改时区以适应客户的偏好,例如(东部标准时间):
$date = new DateTime($lastUpdate);
$date->setTimezone(new DateTimeZone('EST'));
PHP 将处理时移,例如由于美国实行夏令时
关于php - 如何在 PHP 应用程序中处理 DST 时移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331238/