我正在尝试建立一个数据库,该数据库存储用户指定的每日警报时间。例如,如果每天7:00 AM至7:30 AM之间满足某些条件,则用户希望接收警报。在尝试实现这一点时,我需要适应夏令时。这是我尝试的解决方案:
将用户本地时区(长格式,例如“ US / Eastern”)信息存储在一个表中(例如userInfo),将警报时间存储在另一个表中(例如userAlarms)。 查询userAlarms表时,通过将UTC时间转换为userInfo表中存储的tz列所指定的用户本地时间CONVERT_TZ(UTC_TIME(), 'UTC', userInfo.tz)。 问题1.根据我的理解,指定时区名称(例如美国/美国东部)应考虑夏令时。例如,CONVERT_TZ('00:00:00', 'UTC', 'US/EASTERN')在1月1 日致电应产生'19:00:00',但在7月1日致电应产生'20:00:00'。我对么?
问题2.如果Q1是正确的,我是否需要不断更新MySQL的时区表以使时区UTC偏移保持最新?
问题3. 在我的服务器上运行时,MySQL文档中给出的示例会SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')产生“ NULL”。这可能是由于未设置时区表引起的吗?
我该如何检查?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
如果产生的结果为空,则尚未设置TZ表:
SELECT CONVERT_TZ(now(),'US/Eastern','US/Central'); 如果您没有设置时区表,则可以更新用户表中的小时偏移量,然后执行以下操作:
select utc_timezone() - interval user_timezone_offset_in_hours hour from userinfo a where user_id = 999; 但是,您仍然需要一种方法来更新用户的时区。
如果您是为Web应用程序编写此代码,则可以通过javascript获取时区,这是一篇文章,介绍了如何进行操作(没有尝试过,但是看起来可以使用)。
关于上述“间隔”的一些解释...
MySQL中更技巧性的结构之一是INTERVAL 关键字的使用,如示例所示(数字值可以是表达式或字段值)
select now() today, now() - interval 1 day yesterday; +---------------------+---------------------+ | today | yesterday | +---------------------+---------------------+ | 2011-05-26 13:20:55 | 2011-05-25 13:20:55 | +---------------------+---------------------+ 您可以随意添加和减去它们,这就是为什么我从不 理会日期/时间的加/减/转换功能
select now() a, now() - interval 1 day + interval 4 hour + interval 8 minute b; +---------------------+---------------------+ | a | b | +---------------------+---------------------+ | 2011-05-26 13:24:16 | 2011-05-25 17:32:16 | +---------------------+---------------------+ 您可以使用负数(对于负时区偏移量应该很好),它们是相同的:
select now() - interval 1 month a, now() + interval -1 month b; +---------------------+---------------------+ | a | b | +---------------------+---------------------+ | 2011-04-26 13:38:05 | 2011-04-26 13:38:05 | +---------------------+---------------------+来源:stack overflow