2013-12-11 5 views
0

Теперь я использую django-сельдерей для отправки запланированных писем пользователю. он отлично работает, если все пользователи в тот же часовой пояс. Но если пользователь в другой часовой пояс, он получит не в нужное время.сельдерей для разных часовых поясов

Например, я планировал отправить электронное письмо пользователю a, пользователю b в 8 утра каждый день с CrontabSchedule, сервером является GMT, пользователь a GMT, пользователь b GMT + 1, пользователь a получит это письмо в 8 утра но пользователь b получит его в 9 утра.

Как я могу назначить задачи для разных часовых поясов с сельдереем?

+0

Так пользователь B имеет интерфейс для установки времени он хочет получить электронную почту? – kanu

+0

@kanu Да, мы знаем все часовые пояса пользователей – xfx

ответ

1

Когда пользователь B установил часовой пояс на «Европа/Вена», он будет по Гринвичу + 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) 
Смежные вопросы