我仍然是编程的初学者,因此编写下一个代码是出于学习目的。
给出您的生日和当前日期,计算您的年龄 在几天内。补偿leap日。假设生日 和当前日期是正确的日期(并且没有时间旅行)。简而言之,如果您是2012年1月1日出生,今天是 2012年1月2日,您1天大。
尝试解决此问题,我想出了2种不同的方法,但是它们都不运行,它甚至不打印或不打印-1,它什么也不做。最糟糕的部分(我想知道原因)是运行它之后,我的计算机开始减速,因此我需要重置或关闭我的PC(表面书2,所以我认为不是硬件)问题)。我是否正确安装了python?
代码如下:
daysOfMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def isLeapYear(year):
if year % 4 != 0:
return False
elif year % 100 != 0:
return True
elif year % 400 != 0:
return False
else:
return True
def next_date(year, month, day):
day += 1
if isLeapYear(year) == True:
daysOfMonths[1] = 29
elif day > daysOfMonths[month-1]:
day = 1
month += 1
elif month > 12:
month = 1
year += 1
return year, month, day
def daysBetweenDates(y1, m1, d1, y2, m2, d2):
days = 0
while [y1, m1, d1] < [y2, m2, d2]:
y1, m1, d1 = next_date(y1, m1, d1)
days += 1
return days
print daysBetweenDates(2000,01,10,2001,01,12)
我正在寻找答案,但是通常当问题与我的相似时,答案要么与调试有关,要么与循环有关(如果无限),但是我已经测试了功能isLeapYear
和next_date
。我还通过使用next_date函数将一个日期添加到第一个日期并告诉计算机在日期1和2相同时停止,来确保while不会变为无限。
答案 0 :(得分:0)
您正在重新发明轮子。您可以使用python的标准库datetime
在日期上执行各种操作
实施:
from datetime import datetime
def days_between_dates(date_1, date_2):
# date format: MM/DD/YYYY you can change to whatever format you need
date_format = "%m/%d/%Y"
# convert given date string to python datetime objects
date_1_object = datetime.strptime(date_1, date_format)
date_2_object = datetime.strptime(date_2, date_format)
# substracting date_1 from date_2 result python datetime delta object
delta = date_2_object - date_1_object
# return number of days in integer format from delta object
return delta.days
用法:
days_between_dates('12/12/2018', '12/12/2018') # returns 0
days_between_dates('12/12/2018', '12/13/2018') # returns 1
days_between_dates('12/12/2017', '12/12/2018') # returns 365
为什么您的代码无法正常工作
next_year
函数的实现是错误的。错误是
声明daysOfMonths[1] = 29
会永久更改daysOfMonths
,这意味着在第一个leap年daysOfMonths[1]
之后的所有年份中,29
都是我们不想要的。解决方案是维护两个单独的daysOfMonths
列表或将daysOfMonths[1]
的值放回28
。
next_date(2000,1,31)
返回(2000, 1, 32)
,但应该是(2000, 2, 1)
。它的发生是因为elif
。如果year是leap年,则将不会执行2nd,3rd条件day > daysOfMonths[month-1]
,month > 12
,因为它们位于elif
中,但是我们想检查这些条件,即使是leap年。解决方案不是将它们放在elif
块中,以便所有条件都将始终执行。
next_year
的正确实现将是
commonYear = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def next_date(year, month, day):
day += 1
daysOfMonths = commonYear
if isLeapYear(year) == True:
daysOfMonths = leapYear
if day > daysOfMonths[month-1]:
day = 1
month += 1
if month > 12:
month = 1
year += 1
return year, month, day
为什么您的程序未在编辑器中运行?可能是因为while循环变成了无限循环,导致程序没有在编辑器中返回任何内容。但是网络编辑器可以检测到无限循环并杀死进程