我必须维护一些旧的浏览器游戏,在这个游戏中,用户有生产资源的行星。当用户打开行星视图时,通过构建行星上次更新与当前时间之间的差值来计算资源的数量,如下所示:
$secondsBetweenUpdate = time() - $lastUpdate; // Timestamps
这个晚上有时间偏移(至少在德国是从夏令时到正常时间,或者用德语来说是从"夏令时间"到"冬令时间"),所以在"新的"凌晨2点和"新的"凌晨3点之间,上述差异是负的,所以玩家失去而不是得到资源。
如果$secondsBetweenUpdate
变为负值,我可以通过将其设置为零来避免丢失,但是是否有正确处理移位的方法?老实说,我甚至不确定什么是正确的-无论是从夏令时改为正常时间还是从正常时间改为夏令时。
我看到了这个关于夏令时和时区最佳实践的帖子,其中一个建议是将所有时间存储为祖鲁时间。我该如何做到这一点,我该如何为用户正确地显示时间——这意味着他看到的时间和他的手表上的时间是一样的?
我们使用PHP(当然还有CSS和JavaScript), Mysql,并部分迁移到cakePHP框架。
在您的服务器上使用GMT时区,它没有时间偏移。
执行此操作的方式因系统而异。例如,在Ubuntu中,你可以这样做:
sudo dpkg-reconfigure tzdata
并选择GMT选项。
然后,如果你需要显示日期,你可以使用PHP的日期库来改变时区以适应你的客户端的偏好,例如(对于东部标准时间):
$date = new DateTime($lastUpdate);
$date->setTimezone(new DateTimeZone('EST'));
PHP将处理时移,例如由于美国的DST