#python-3.x #django #celery
Вопрос:
Я работаю над приложением для торговых точек в Джанго, в котором клиент заказывает товар, и он доставляется в течение 45 дней. Я могу узнать дату доставки при бронировании, используя следующее:
from datetime import datetime, timedelta
DELIVERY_IN_DAYS = 45
delivery_on = datetime.today() timedelta(days=DELIVERY_IN_DAYS)
delivery_on = delivery_on.strftime('%Y-%m-%d')
теперь я хочу delivery_on
, чтобы он оставался неизменным в течение 5 дней и изменился на 6-й день. могу ли я сделать это без использования фоновой работы с сельдереем?
Заранее спасибо.
Комментарии:
1. Что такое день «смещения» (день первого «изменения» с пятью днями)?
Ответ №1:
Да, мы можем определить дату по модулю числа дней с:
from datetime import date, timedelta
today = date.today()
offset_date = date(2000, 1, 1)
dt = today - offset_date
delivery_on = today timedelta(days=DELIVERY_IN_DAYS - dt.days % 5)
Мы можем обернуть логику в функцию:
def to_deliver_day(day):
offset_date = date(2000, 1, 1)
dt = day - offset_date
return day timedelta(days=DELIVERY_IN_DAYS - dt.days % 5)
Если мы назовем эту логику с 1 по 10 июля, мы получим:
>>> to_deliver_day(date(2021, 7, 1))
datetime.date(2021, 8, 13)
>>> to_deliver_day(date(2021, 7, 2))
datetime.date(2021, 8, 13)
>>> to_deliver_day(date(2021, 7, 3))
datetime.date(2021, 8, 13)
>>> to_deliver_day(date(2021, 7, 4))
datetime.date(2021, 8, 18)
>>> to_deliver_day(date(2021, 7, 5))
datetime.date(2021, 8, 18)
>>> to_deliver_day(date(2021, 7, 6))
datetime.date(2021, 8, 18)
>>> to_deliver_day(date(2021, 7, 7))
datetime.date(2021, 8, 18)
>>> to_deliver_day(date(2021, 7, 8))
datetime.date(2021, 8, 18)
>>> to_deliver_day(date(2021, 7, 9))
datetime.date(2021, 8, 23)
>>> to_deliver_day(date(2021, 7, 10))
datetime.date(2021, 8, 23)
Установив по offset_date
-другому, вы можете изменить момент, когда результат совершает «прыжок».