这个编码是为了找到日期之间的日子。我的编码不适用于我在代码的最后提到的注释的情况,请指出我的错误(注意:(y1,m1,d1) - >开始日期和(y2,m2,d2) - >结束日期)
def days_between_dates(y2,m2,d2,y1,m1,d1):
days = 0
tot = 0
while not(y1==y2 and m1==m2 and d1==d2):
days = days + 1
d1 = d1+1
if((m1 == 4 or m1 == 6 or m1 == 9 or m1 == 11) and d1 == 30):
d1 = 0
m1 = m1+1
if(d1 == 31):
d1 = 0
m1 = m1+1
if (((y1%4)!=0) and m1 == 2 and d1==28):
d1 = 0
m1 = m1+1
else:
if(m1 == 2 and d1 == 29):
d1 = 0
m1 = m1+1
if(m1>12):
m1 = 1
y1 = y1 + 1
if(y1==y2 and m1==m2 and d1==d2):
return days
break
return days
print days_between_dates(2011,1,1,2010,1,1)
print days_between_dates(2013,1,1,2012,1,1)
#print days_between_dates(2012,2,29,2012,2,28)
答案 0 :(得分:9)
避免重新发明轮子,而是使用datetime
模块:
from datetime import date
def days_between_dates(y2, m2, d2, y1, m1, d1):
return (date(y2, m2, d2) - date(y1, m1, d1)).days
至于你的错误:你使用的是基于0的日期算术;每当你到月底,你就会切换到下个月的第0天。这意味着,如果y2, m2, d1
天是该月的最后一天,您永远不会达到最终条件;在您测试2012, 2, 29
之前,您已将日期更改为2012, 3, 0
。
使用基于1的算术,并且仅在该月的最后一天超过时更改月份。
请注意,您可以测试元组之间的相等性,无需对每个元素进行完整测试。您的闰年计算也需要一点改进:
def is_leap_year(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
return year % 4 == 0
def days_between_dates(y2, m2, d2, y1, m1, d1):
days = 0
isleapyear = is_leap_year(y1)
while (y1, m1, d1) != (y2, m2, d2):
days += 1
d1 += 1
if (m1 == 2 and d1 == (30 if isleapyear else 29) or
m1 in (4, 6, 9, 11) and d1 == 31 or d1 == 32):
d1 = 1
m1 += 1
if m1 == 13:
m1 = 1
y1 += 1
isleapyear = is_leap_year(y1)
return days