2013-07-24 3 views
2

Мне нужно реализовать условный разрыв, который использует рабочие дни. У меня есть класс с DateField, и если эта дата будет меньше 5 рабочих дней в будущем, произойдет что-то (действие a), иначе произойдет b. Как определить количество рабочих дней между двумя объектами?Рабочие дни в Django

Очевидно, мне нужно будет рассчитать, какие 5 рабочих дней с сегодняшнего дня. Найти 5 дней в будущем было бы легко, используя простую временную дельта, но для учета рабочих дней она становится более сложной. Я думаю, что я могу спокойно игнорировать праздники на данный момент (это не самый лучший случай, но я думаю, что я могу сделать это, только имея рабочие дни с понедельника по пятницу). Может ли кто-нибудь дать мне некоторое руководство относительно того, как я мог бы сделать что-то вроде: target = today + 5 business_days?

Благодаря

+3

Если вы не считаете праздники, и вы всегда считаете пять рабочих дней, разве это не одна календарная неделя каждый раз? Пять рабочих дней с понедельника в следующий понедельник и т. Д. –

+1

О, боже ... конечно ... –

+0

@PeterDeGlopper - Только если начальная дата также является рабочим днем ​​ –

ответ

3

Вот общее решение, даже если ваш случай ошеломляюще прост; P

from datetime import timedelta, date 

def add_business_days(from_date, number_of_days): 
    to_date = from_date 
    while number_of_days: 
     to_date += timedelta(1) 
     if to_date.weekday() < 5: # i.e. is not saturday or sunday 
      number_of_days -= 1 
    return to_date 

И результат.

>>> date.today() 
datetime.date(2013, 7, 25) 
>>> add_business_days(date.today(), 6) 
datetime.date(2013, 8, 2) 

Бонусные баллы, если вы проверяете, выпадает ли дата праздника в инструкции if.

+0

Спасибо! Я соглашусь с этим ответом, но я бы сказал, что это было так просто, чтобы даже не требовать этого. Я чувствую себя невероятно глупым, потому что не могу придумать это самостоятельно. –

+0

«Только если начальная дата также является рабочим днем» «В этом случае я могу в значительной степени гарантировать, что это будет». Можете ли вы на самом деле это гарантировать? Если нет, вы можете в конечном итоге использовать этот код. – Thomas

Смежные вопросы