Python日期中间日期

Python日期中间日期,python,Python,我想我可能有一个无限循环,因为每当我运行代码时,我总是会收到一条错误消息,上面写着“程序因使用13秒CPU而关闭” 整个代码,应该以一个日期作为输入,并在第二天输出,此代码假设所有月份都是30天。除了daysbetween-dates功能外,其他功能似乎都运行良好。有人有什么建议吗?或者有人能告诉我我错过了什么 def daysInMonth(year, month): return 30 def nextDay(year, month, day): if day &l

我想我可能有一个无限循环,因为每当我运行代码时,我总是会收到一条错误消息,上面写着“程序因使用13秒CPU而关闭”

整个代码,应该以一个日期作为输入,并在第二天输出,此代码假设所有月份都是30天。除了
daysbetween-dates
功能外,其他功能似乎都运行良好。有人有什么建议吗?或者有人能告诉我我错过了什么

def daysInMonth(year, month):
        return 30

def nextDay(year, month, day):
    if day < 30:
        return year, month, day + 1
    else:
        if month == 12:
            return year + 1, 1, 1
        else:
            return year, month + 1, 1
        return

def dateIsBefore(year1, month1, day1, year2, month2, day2):
    if year1 < year2:
        return True  

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    days = 0
    while dateIsBefore(year1, month1, day1, year2, month2, day2):
        days += 1
    return days

def test():
    test_cases = [((2012,1,1,2012,2,28), 58),
                  ((2012,1,1,2012,3,1), 60),
                  ((2011,6,30,2012,6,30), 366),
                  ((2011,1,1,2012,8,8), 585 ),
                  ((1900,1,1,1999,12,31), 36523)]
    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
            print result
        else:
            print "Test case passed!"
test()
def daysInMonth(年、月):
返回30
def下一天(年、月、日):
如果日期<30:
返回年、月、日+1
其他:
如果月份==12:
返回年份+1,1,1
其他:
返回年份、月份+1、1
返回
def dateIsBefore(第1年、第1个月、第1天、第2年、第2个月、第2天):
如果第1年<第2年:
返回真值
def日期之间的日期(第1年、第1个月、第1天、第2年、第2个月、第2天):
天数=0
而dateIsBefore(第1年、第1个月、第1天、第2年、第2个月、第2天):
天数+=1
回归日
def test():
测试案例=[(2012,1,12012,2,28),58),
((2012,1,1,2012,3,1), 60),
((2011,6,30,2012,6,30), 366),
((2011,1,1,2012,8,8), 585 ),
((1900,1,1,1999,12,31), 36523)]
对于测试用例中的(参数,答案):
结果=日期之间的天数(*args)
如果有结果!=答复:
打印“测试数据:”,args,“失败”
打印结果
其他:
打印“测试用例通过!”
测试()

函数
dateIsBefore
不完整

def dateIsBefore(year1, month1, day1, year2, month2, day2):
    if year1 < year2:
        return True  
    if year1 == year2 and month1 < month2:
        return True
    if year1 == year2 and month1 == month2  and day1 < day2:
        return True
    return False
def dateIsBefore(第1年、第1个月、第1天、第2年、第2个月、第2天):
如果第1年<第2年:
返回真值
如果year1==year2,month1

(可以简化,但为了清晰起见,我将其保留为这样。当然,您也可以使用
datetime.date
——其他人已经做出了这样的评论;另请参见另一个答案,它告诉您增加year1、month1和day1)

您的
daysbetweeDates()
算法确实有一个无限循环

while dateIsBefore(year1, month1, day1, year2, month2, day2):
    days += 1
您永远不会修改循环中的任何年/月/日值,因此,如果条件为true一次,它将永远为true

从概念上讲,解决方案是每次将
day2
减少一天,因此当两个日期相等时,
days
将是它们之间的日差。然而,既然你说你假设每个月有30天,你就把事情复杂化了。通过将(年、月、日)元组转换为日值,可以找到两个日期之间的日差。比如说,

def days_between_dates(y1, m1, d1, y2, m2, d2):
    date1 = y1*360 + (m1-1)*30 + d1
    date2 = y2*360 + (m2-1)*30 + d2
    # assuming you want to return 0 if date2 is before date1
    return date2 - date1 if date2 >= date1 else 0

dateIsBefore将始终返回True。

此解决方案正确计算每月的天数,不涉及任何类型的无限循环,计算闰年中的正确日期,并提供输入的准确答案。 解决方案是用Python编写的

def日/月(m,y):

def下一天(y、m、d):

def日期之前(y1、m1、d1、y2、m2、d2):

def test():


test()

您是为自学目的编写的吗?您是否反对为作业使用内置的
datetime
模块?是的,您有一个无限循环。在日期之间的
days
中,您正在增加
days
而不做任何其他事情,因此如果
year1
,天数将无限增加,函数将永远不会结束(暂时忽略
dateIsBefore
只是比较年份,这很奇怪),我不确定他们是否会接受内置的datetime模块,但我会尝试-
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m ==10 or m == 12:
    return 31
else :
    if m == 2:
        if isLeapYear(y):
            return 29
        return 28
return 30
if d < daysInMonth(m,y):
    return y, m, d+1
else:
    if m == 12:
        return y + 1, 1, 1
    else:
        return y, m + 1, 1
if y % 400 == 0:
    return True
elif y % 4 == 0:
    return True
else:
   if y % 100 == 0:
       return False
   return False
days = 0                                          
if y1 < y2 :
    return True
if y1 == y2:
    if m1 < m2:
        return True
    if m1 == m2:
        return d1<d2
return False
days = 0
while dateIsBefore(y1, m1, d1, y2, m2, d2):
    y1, m1, d1 = nextDay(y1, m1, d1)
    days = days + 1
return days
test_cases = [((2012,1,1,2012,2,28), 58),
              ((2012,1,1,2012,3,1), 60),
              ((2011,6,30,2012,6,30), 366),
              ((2011,1,1,2012,8,8), 585 ),
              ((1900,1,1,1999,12,31), 36523)]
for (args, answer) in test_cases:
    result = daysbetweendates(*args)
    if result != answer:
        print "Test with data:", args, "failed"
        print result
    else:
        print "Test case passed!"