【问题标题】:celery for different timezones不同时区的芹菜
【发布时间】:2013-12-11 05:55:07
【问题描述】:

现在我使用 django-celery 向用户发送预定的电子邮件。如果所有用户都在同一时区,它工作正常。但是如果用户在不同的时区,他会得到不正确的时间。

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

如何使用 celery 为不同时区安排任务?

【问题讨论】:

  • 那么用户B有一个界面来设置他想要接收邮件的时间?
  • @kanu 是的,我们知道所有用户的时区

标签: django celery


【解决方案1】:

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

一个解决方案可能是一个每日脚本,它计算每个用户的交货日期时间,并以正确的日期时间作为 ETA 发送 celery 任务。 (我希望 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)

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2023-01-05
    • 2019-06-27
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    相关资源
    最近更新 更多