如何使用重复事件处理事件调度应用程序中的时区?

时间:2015-09-13 21:15:25

标签: date datetime events timezone

我尝试实施一个事件安排,允许用户选择工作日以及开始和结束时间。我遇到了与时区有关的问题。 这是我的表(重要的一栏):

create table event (
  id                int not null auto_increment,
  name              varchar(100) not null,
  repeat_event      tinyint(1) default null,
  every_sunday      tinyint(1) default null,
  every_monday      tinyint(1) default null,
  every_tuesday     tinyint(1) default null,
  every_wednesday   tinyint(1) default null,
  every_thursday    tinyint(1) default null,
  every_friday      tinyint(1) default null,
  every_saturday    tinyint(1) default null,
  start_time        time null default null,
  end_time          time null default null,
  start_date        datetime null default null,
  end_date          datetime null default null,
)

应用程序有两种类型的事件调度:循环和非循环(根据repeat_event列,值为1或0)。 另一个过程是负责读取当天的所有事件并通知用户事件的开始或结束(我使用javascript setTimeout函数通知 - 用当前日期毫秒减去start_date毫秒)。

当repeat_event为0时,我使用start_date和end_date来存储事件日期。在这种情况下,使用datetime列(没有timezome信息)。我在这里没有问题,因为用户将同时收到通知,与时区无关。我在用户时区显示事件日期。

当repeat_event为1时,我使用每个_ ***列,start_time和end_time来存储工作日工作日和时间。

问题
如何将重复信息存储在数据库中? 例如:如果我在GMT-03:00中将活动安排在星期六的22:00 - 23:00。这不是星期六的UTC,所以列every_saturday存储"错误"。 我应该用用户时区存储这些信息吗?

1 个答案:

答案 0 :(得分:1)

对于未来的日程安排,尤其是对于重复发生的事件,您不应该以UTC的形式存储值。相反,您需要根据与该事件相关的时区存储值,并且还需要存储该时区的标识符(例如"America/Los_Angeles"

为了方便地订购这些事件,您可以另外计算事件的发生的UTC时间,但您应该准备重新计算它 - 因为时区的规则经常会发生变化。下一个事件发生的UTC时间应该在另一列中,或者完全在另一个表中。

请记住,安排未来事件是一个困难的问题。有多个部分可以正确地完成它。你不应该寻找一个简单的解决方案。请阅读我之前撰写的有关此主题的其他一些帖子:herehere