我正试图在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()
答案 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