如何从另一个日期计算回去的工作日日期

2 投票
8 回答
1980 浏览
提问于 2025-04-15 13:46

我需要计算一个日期(年、月、日),这个日期是从另一个日期往回推18个工作日。只要把周末去掉就可以了。

举个例子:我有一个日期是2009年8月21日,还有一个参数是18个工作日,正确的答案应该是2009年7月27日。

谢谢大家的帮助!

8 个回答

2

这里有一种方法可以实现这个功能。注意一下:(1) 你没有说明如果开始日期不是工作日的话,你希望得到什么结果。(2) 你的例子是错误的。

C:\junk\so>type workdays.py
import datetime

def add_workdays(adate, nworkdays):
    if nworkdays < 0:
        incr = -1
        nworkdays = - nworkdays
    else:
        incr = 1
    delta_weeks, delta_days = divmod(nworkdays, 5)
    one_day = datetime.timedelta(days=incr)
    if delta_weeks:
        wdate = adate + one_day * 7 * delta_weeks
    else:
        wdate = adate
    while delta_days:
        wdate += one_day
        if wdate.weekday() < 5: # Mon-Fri
            delta_days -= 1
    return wdate

if __name__ == "__main__":
    start = datetime.date(2009, 8, 21)
    for i in range(10, -19, -1):
        end = add_workdays(start, i)
        print "%3d %s" % (i, end.strftime("%a %Y-%m-%d"))

C:\junk\so>\python26\python workdays.py
 10 Fri 2009-09-04
  9 Thu 2009-09-03
  8 Wed 2009-09-02
  7 Tue 2009-09-01
  6 Mon 2009-08-31
  5 Fri 2009-08-28
  4 Thu 2009-08-27
  3 Wed 2009-08-26
  2 Tue 2009-08-25
  1 Mon 2009-08-24
  0 Fri 2009-08-21
 -1 Thu 2009-08-20
 -2 Wed 2009-08-19
 -3 Tue 2009-08-18
 -4 Mon 2009-08-17
 -5 Fri 2009-08-14
 -6 Thu 2009-08-13
 -7 Wed 2009-08-12
 -8 Tue 2009-08-11
 -9 Mon 2009-08-10
-10 Fri 2009-08-07
-11 Thu 2009-08-06
-12 Wed 2009-08-05
-13 Tue 2009-08-04
-14 Mon 2009-08-03
-15 Fri 2009-07-31
-16 Thu 2009-07-30
-17 Wed 2009-07-29
-18 Tue 2009-07-28

C:\junk\so>
2

我建议你去看看这个链接:http://docs.python.org/library/calendar.html。这个页面可以帮助你轻松找出某个日期是星期几,然后你就可以往回推算,记得要考虑到周末哦。

0

我猜你是在使用日期时间(datetime),不过这个方法应该可以用(date是一个日期时间,days是一个整数):

def goback(date, days):
    delta = datetime.timedelta( days=days + 2*(days//5) )
    if date.weekday() == 5:
        delta += datetime.timedelta(days=1)
    elif date.weekday() == 6:
        delta += datetime.timedelta(days=2)
    else:
        leftover = date.weekday() - days % 5
        if leftover < 0: 
            delta += datetime.timedelta(days=2)
    return date - delta

注意,你描述中的例子我觉得是错的……在21号之前的18个工作日是28号。

撰写回答