如何在PHP应用程序中处理夏令时移位


How to handle DST time shifts in a PHP application?

我必须维护一些旧的浏览器游戏,在这个游戏中,用户有生产资源的行星。当用户打开行星视图时,通过构建行星上次更新与当前时间之间的差值来计算资源的数量,如下所示:

$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