如何从另一个日期计算回去的工作日日期
我需要计算一个日期(年、月、日),这个日期是从另一个日期往回推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号。