如何在PHP应用程序中处理DST时移?

时间:2015-10-25 15:09:42

标签: php

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

$secondsBetweenUpdate = time() - $lastUpdate; // Timestamps

今晚有时间转变(至少德国从夏令时到正常时间 - 或者正如我们在德语中所说的“夏季时间”到“冬季时间”)所以在“新”2AM和“新”之间“凌晨3点,上述差异是负面的,因此玩家会失去资源而不是获得资源。

我确实可以通过将$secondsBetweenUpdate设置为零来避免松动,如果它变为负值但是有没有办法正确处理移位?说实话,我甚至不确定什么是正确的 - 无论从夏令时到正常时间的变化,还是从正常时间到夏令时的变化。

任何人都可以给我一些建议来处理这样的时间变化吗?

我看到这个关于Daylight saving time and time zone best practices的SO线程,并且一个建议是将所有时间都存储为祖鲁时间。我该怎么做?如何正确显示用户的时间 - 这意味着他看到的时间与他的时间相同观看?

我们使用PHP(当然还有CSS和JavaScript),Mysql并部分迁移到cakePHP框架。

1 个答案:

答案 0 :(得分:3)

在您的服务器上使用GMT时区,该时区不会有时移。

这样做的方式因系统而异。例如,在Ubuntu中,您将执行以下操作:

sudo dpkg-reconfigure tzdata

选择GMT选项。

然后,如果您需要显示日期,可以使用PHP的日期库来更改时区以适合您客户的偏好,例如(东部标准时间):

$date = new DateTime($lastUpdate);
$date->setTimezone(new DateTimeZone('EST'));

PHP将处理时移,例如由于美国的夏令时