Меняйте будущую дату каждые пять дней

#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 -другому, вы можете изменить момент, когда результат совершает «прыжок».