特定于时区的“立即打开”功能

时间:2015-07-21 20:43:00

标签: php mysql timezone

我正在建立的网站上需要一个'现在打开'的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不知。

我是朝着正确的方向前进吗?你的方法是什么?

1 个答案:

答案 0 :(得分:2)

  1. 阅读time zone support in MySQL,确保您的mysql数据库配置了当前时区表。定期更新。

  2. 将每个位置与指定的IANA / Olson时区相关联,例如"America/Los_Angeles""Europe/London"。请参阅the list here。如果您有lat / lon,则可以通过one of these methods查找时区。

  3. 使用MySQL CONVERT_TZ函数将当前UTC时间转换为特定区域。例如,CONVERT_TZ(UTC_TIMESTAMP(),'UTC','Asia/Tokyo')

  4. 使用已转换时间的星期几和时间来检查该地点条目中的日期和范围。

  5. 另外,请注意,其他人可能建议采用仅在数据库中存储UTC的方法,或者在与“now”值进行比较之前将所有值转换为UTC。这些方法中的任何一种都可能在边缘情况下失败,因为UTC星期几不一定与每个时区中的星期几相同。

    工作的另一种方法,但需要付出更多努力,是预先确定特定的UTC开始和停止时间一段时间(至少下一个,但也许进一步)。然后,您可以使用UTC时间扫描此列表。当您要检查数千个或更多个别条目时,这可以更好地扩展。但是在较小的规模上,通常不值得花费。

    同样,你可以有一个后台进程,只在每条记录上设置一个“now open”标志,但是它必须经常对你的数据库起作用,你永远不能检查“现在”以外的其他时间。 / p>