我目前正在使用开源应用程序:WeBid(可用here)
这是问题:
-
用户在DB中存储了首选时区
-
该站点在DB中存储了默认时区
-
所有数据库存储日期都存储在"GMT-0"
应用程序无法正确计算DST(夏令时),因为它使用以下代码:
(包括/ functions_global.php)
$this->ctime = time() + (($this->SETTINGS['timecorrection'] + gmdate('I')) * 3600);
$this->tdiff = ($this->SETTINGS['timecorrection'] + gmdate('I')) * 3600;
gtpotyf解释说:
gmdate('I') - >如果DST处于活动状态则返回1,如果未处于活动状态则返回0 . 然而,由于gmdate总是使用GMT(0)并且该时区没有DST,它将始终返回0.使用日期('I')而不是gmdate('I')将更好地工作,但是仍然不正确,因为它使用了来自服务器的时区,但仍不是用户时区 .
WeBid的最新版本没有采用最终修正,请帮我解决这个问题 .
2 回答
为了正确理清时区,你需要做很多事情 .
将服务器设置为UTC,以便PHP的
time
和date
函数返回UTC时间戳 . (除了相关的功能,如strftime
.根据您的数据库,您也可以将其时区设置为UTC . MySQL关于这个主题的文档是here .
如果尚未存储,则需要将存储在其中的日期时间迁移到UTC . (我不确定你对GMT-0的意思 . )
让用户选择PHP的DateTimeZone类支持的格式为“Europe / London”的时区 .
经过一些研究,我把以下一系列时区放在一个下拉框中给用户,因为我不想重复(例如阿姆斯特丹和布鲁塞尔在同一时区 . )我不会声称它尽管如此 . 根据您的用户群,您可能需要更详细地调查某些时区 .
当日期从数据库中出来时,它们需要从UTC转换为用户的时区 .
您需要通过WeBid应用程序并修改相应的部分才能正确转换 .
所以,使用上面的代码,你需要一些像这样的函数:
然后在你的班上:
bcmcfc答案的替代解决方案(几乎说明了一切):
从WeBid中删除任何时区支持(至少禁用任何自定义)并将所有内容保存为UTC(如果尚未保存) .
修改界面以使用Javascript显示日期和时间戳 . 浏览器将根据浏览器或操作系统的设置正确转换unix时间戳(don 't forget to multiply by 1000, Javascript' s
Date
预计毫秒,而不是PHP中的秒数) .例如,不输出2012-08-18 09:33:43,而是输出
<script>document.write(new Date(1345282423*1000).toString());</script>
,其中1345282423
直接从数据库获得,或者使用strtotime
.您只需要更改显示日期和时间戳的功能,并禁用时区自定义(强制UTC / GMT)(不要忘记
date_default_timezone_set("UTC");
) .这对我来说似乎微不足道 .