2010-10-07 85 views
1

基本上我有一个网站,允许商店存储他们的打开/关闭时间。MySQL/PHP中的时区偏移(和st/dst更改)

现在,我试图添加让访客能够查看商店是否关闭的功能。

我明白我可以运行一个查询,如:

SELECT * FROM `store_hours` WHERE TIME(NOW()) BETWEEN `opens` AND `closes` 

...和查询工作,并检索当前打开的商店。不过,起初这个查询没有考虑到商店的时区。

所以..我决定到商店的开启/关闭时间与转换为UTC附加存储:

ID | store_id |打开|关闭| utc_opens | utc_closes

现在我可以查询,像这样:

SELECT * FROM `store_hours` WHERE TIME(NOW()) BETWEEN `utc_opens` AND `utc_closes` 

所以,现在我可以很容易地得到一个全局列表中有多少商店是开放的,它甚至不不管他们在哪里。

现在我来解决这个问题。通过PHP,我所做的只是添加偏移时间戳:

date('H:i', strtotime($values['closes']) + $offset) 

然后我开始思考太平洋标准时间,然后夏令时。

我想添加这个打开/关闭功能,它将成为系统的一个重要组成部分。如果我休息一小时,那只会让我失去很多收入。

回答

2

我从来没有处理这之前(我也不以往任何时候都愿意这样做,因为它是一个烦人复杂的问题)。这就是说,有一些方法来解决这个问题:

how do you deal with timezone issues?

看来,如果你希望你的系统并不完美,但相当该死的,你必须潜入这样的事情:

http://en.wikipedia.org/wiki/Zoneinfo

总之,问题是粒度复杂性之一。无论您尝试多么努力,您都无法编写一个简单的脚本,只给出一个静态GMT偏移量来确定商店的准确时间。为了解决这个问题,人们把公共数据库放在一起,这些数据库几乎涵盖了时区中固有的所有小角落和裂缝。即使你知道用户在美国西部(落基山脉以西),你也不知道他是在巴斯托还是凤凰城(亚利桑那州不做DST,所以半年的时间与洛杉矶的时间相同,另一半与丹佛一样)。

所以回到数据输入你去...你只需要在每个商店的确切时区代码,并查询zoneinfo数据库来确定当前的偏移应该是什么。