我正在建立的网站上需要一个'现在打开'的php功能。看一下之前的question,我构建了我的mysql表:
hours_id INT NOT NULL,
loc_id INT NOT NULL,
dow TINYINT NOT NULL,
open_time TIME NOT NULL,
close_time TIME NOT NULL,
然后使用:
"SELECT open_time, close_time
FROM opening_hours
WHERE dow=dayofweek(curdate())
AND loc_id=:loc_id"
如果它是开放的话我可以解决。我正在构建的产品是全球性的,我需要“立即打开”与位置所在的时区相关,而不是服务器位置或查看者位置。
我已经将国家代码和lat / lng的位置存储在相关的数据库中,所以我的想法是我从中获取时区,或者提供一种方法供用户选择,然后修改我的SQL不知。
我是朝着正确的方向前进吗?你的方法是什么?
答案 0 :(得分:2)
阅读time zone support in MySQL,确保您的mysql数据库配置了当前时区表。定期更新。
将每个位置与指定的IANA / Olson时区相关联,例如"America/Los_Angeles"
或"Europe/London"
。请参阅the list here。如果您有lat / lon,则可以通过one of these methods查找时区。
使用MySQL CONVERT_TZ
函数将当前UTC时间转换为特定区域。例如,CONVERT_TZ(UTC_TIMESTAMP(),'UTC','Asia/Tokyo')
使用已转换时间的星期几和时间来检查该地点条目中的日期和范围。
另外,请注意,其他人可能建议采用仅在数据库中存储UTC的方法,或者在与“now”值进行比较之前将所有值转换为UTC。这些方法中的任何一种都可能在边缘情况下失败,因为UTC星期几不一定与每个时区中的星期几相同。
工作的另一种方法,但需要付出更多努力,是预先确定特定的UTC开始和停止时间一段时间(至少下一个,但也许进一步)。然后,您可以使用UTC时间扫描此列表。当您要检查数千个或更多个别条目时,这可以更好地扩展。但是在较小的规模上,通常不值得花费。
同样,你可以有一个后台进程,只在每条记录上设置一个“now open”标志,但是它必须经常对你的数据库起作用,你永远不能检查“现在”以外的其他时间。 / p>