2013-12-11 48 views
0

现在我用django-celery发送预定的电子邮件给用户。如果所有用户在同一个时区,它工作正常。但是如果用户在不同的时区,他会得到不正确的时间。例如,我每天早上8点用CrontabSchedule安排一封电子邮件发送给用户a,用户b,服务器是GMT时间,用户a是格林威治标准时间,用户b是格林威治标准时间+1,用户a将在上午8点得到该电子邮件但用户b将在上午9点获得。不同时区的芹菜

如何使用芹菜计划不同时区的任务?

+0

因此,用户B有一个接口来设置他想接收电子邮件的时间? – kanu

+0

@kanu是的,我们知道所有用户的时区 – xfx

回答

1

当用户B的时区设置为“欧洲/维也纳”时,他将在冬季的GMT + 1和夏季的GMT + 2。 每日交货时间需要与日期结合,以了解UTC需要发送的时间。

解决方案可能是一个每日脚本,用于计算每个用户的交付日期时间,并将正确日期的芹菜任务作为ETA发送。 (我希望send_task仍然以这种方式工作)

from pytz import timezone, utc 
from datetime import date, datetime 
from celery.execute import send_task 

def daily_delivery(delivery_time, delivery_timezone, task_name, task_args, task_kwargs): 

    tz = timezone(delivery_timezone) 
    today = date.today() 
    local_delivery = datetime.combine(today, delivery_time) 
    utc_delivery = utc.normalize(tz.localize(local_delivery).astimezone(utc)) 
    return send_task(task_name, task, args=task_args, kwargs=task_kwargs, eta=utc_delivery)