我正在开发一个应用程序,用户可以在其时区每天的特定时间请求向他们发送电子邮件。例如,用户A住在伦敦,并在伦敦时间每天下午2点安排一封电子邮件,用户B住在纽约,并在纽约时间下午2点安排电子邮件。
我想知道我应该以何种方式配置我的数据库postgres,以便调度程序可以每分钟触发并查询在该分钟发送的所有电子邮件,无论他们在哪个时区。
我想避免的一件事是每个时区必须运行多个查询。
答案 0 :(得分:3)
由于世界各地的夏令时(DST)(相当愚蠢,非常坦率)规则,当地时间可能意味着绝对的所有事情(UTC时间)。
保存time
(不是timetz
!)和时区名称(不是缩写),以便何时发送电子邮件。这个相关问题下的棘手细节:
Time zone names with identical properties yield different result when applied to timestamp
CREATE TABLE event (
event_id serial PRIMARY KEY
, alarm_time time -- local alarm time
, tz text -- time zone name
, ...
);
使用以下表达式" cook"确切的每日时间点,考虑当地的夏令时设置:
SELECT current_date + alarm_time AT TIME ZONE tz;
示例:
SELECT current_date + '2:30'::time AT TIME ZONE 'Europe/London' AS alarm_ts
返回:
alarm_ts
2014-05-19 02:30:00+02
在整个应用程序中使用timestamp with time zone
(timestamptz
)。一定要了解它是如何工作的。这篇综合文章可能会有所帮助(也解释了AT TIME ZONE
结构:
Ignoring timezones altogether in Rails and PostgreSQL
要清楚,一旦你做了#34;煮熟的"每日UTC时间,您也可以将其翻译成当地时间并与之合作。但在UTC中完成所有其他工作可能不那么令人困惑。