芹菜为不同的时区

时间:2013-12-11 05:55:07

标签: django celery

现在我使用django-celery向用户发送预定的电子邮件。如果所有用户在同一时区,它工作正常。但是如果用户处于不同的时区,他将在合适的时间内获得。

例如,我安排了一封电子邮件发送给用户a,用户b每天早上8点用CrontabSchedule,服务器是GMT时间,用户a是GMT,用户b是GMT + 1,用户a将在早上8点收到该电子邮件但是用户b将在上午9点获得它。

如何使用芹菜安排不同时区的任务?

1 个答案:

答案 0 :(得分:1)

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

解决方案可能是每日脚本,它计算每个用户的交付日期时间,并使用正确的日期时间作为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)