日期之间的日子(Python)

时间:2015-04-04 05:20:07

标签: python date

我正试图在Udacity的CS-101课程上解决这个可选问题 - 它要求计算两个日期之间的天数。我的代码适用于所有测试用例但由于某种原因它不适用于案例1(2012年1月1日 - 2012年2月28日),它返回56但实际答案是58.我无法绕过那么,任何建议都将受到高度赞赏。

def leap_year(year):
    if year % 4 != 0:
        return "Common Year"
    elif year % 100 != 0:
        return "Leap Year"
    elif year % 400 != 0:
        return "Common Year"
    else:
        return "Leap Year"

def days_in_month(month):
    months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    i = 0
    days = 0
    while i <= month:
        days += months[i- 1]
        i += 1
    return days


def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    i = year1
    leap_count = 0
    while i <= year2:
        if leap_year(i) == "Leap Year":
            leap_count += 1
        i += 1
    return ((year2 - year1) * 365 + (days_in_month(month2) - days_in_month(month1)) + (day2 - day1)) + leap_count

# Test routine

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"
        else:
            print "Test case passed!"

test()

2 个答案:

答案 0 :(得分:4)

您的daysBetweenDates函数正文中有几个问题 - 日历计算非常困难所以我推荐您尝试它们,但是,伙计!你为了一个痛苦的世界(与Python无关 - 这完全取决于我们的日历有多疯狂! - )。

例如,考虑最后的return ed表达式:

((year2 - year1) * 365 + (days_in_month(month2) - days_in_month(month1)) + (day2 - day1)) + leap_count

为什么要添加leap_count(以前计算为第1年和第2年之间的闰年数)无条件?!想一想。获得边缘案例以简化您的推理。假设year1和year与month1和month2相同,同样适用于month1和month2。现在leap_count将是1,如果年份是bisextile,否则0 - 和为什么可能年度性质可能完全来计算之间的日期,例如Jan 1和1月9日,或5月1日和5月9日?!

然而,根据你的公式,你制作这一点无关紧要 - 所以你 会声称这些差异在2012年不相等(bisextile)vs 2013年(不是bisextile),你知道是错误的。

这只是你可能陷入的许多日历计算技巧中的一个例子,唉!

我认为你需要一个完全不同的算法。我怀疑最简单的区分开始和结束日期是否在同一年。如果是的话,只有在二月份的两个日期之间,你才会关心闰年。如果不是,那么计算中间年份的天数确实需要检查闰年(大致就像你现在所做的那样)。无论哪种方式,辅助功能,如“从一年开始的日子”和/或“天到年”都是你的朋友......! - )

答案 1 :(得分:2)

对于后来寻找如何以普通Python方式执行此操作的人,您应该这样做:

import datetime

def delta_days(year1, month1, day1, year2, month2, day2):
    return abs(datetime.date(year1, month1, day1) - \
               datetime.date(year2, month2, day2)).days