指定时区"立即打开"函数


Timezone specific "Open Now" function

我需要一个'现在是开放的' php函数在一个网站我正在建设。看看之前的问题,我已经建立了我的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. 阅读MySQL中的时区支持,并确保您的MySQL数据库配置了当前时区表。定期更新。

  2. 将每个位置与命名的IANA/Olson时区关联,例如"America/Los_Angeles""Europe/London"。请参阅此处的列表。如果您有经纬度,您可以通过以下方法之一查找时区。

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

  4. 使用转换的时间的星期几和一天中的时间来检查位置条目中的日期和范围。

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

可以工作的另一种方法是预先确定未来一段时间的特定UTC开始和停止时间(至少到下一个,但可能更远)。然后你可以用UTC时间扫描这个列表。当您有数千个或更多的单独条目要检查时,这种方法在规模上效果更好。但在较小的范围内,通常不值得这样的开销。

同样地,你可以有一个后台进程,它只在每条记录上设置一个"现在打开"标志,但它必须不断地与你的数据库工作,你永远不能检查其他时间,而不是"现在"。

相关文章: