我仍然是编程的初学者,因此下一个代码是为了学习目的而制作的。
根据您的生日和当前日期,计算您的年龄 在几天内。补偿闰日。假设生日 和当前日期是正确的日期(并且没有时间旅行(。简而言之,如果您出生于2012年1月1日,而今天的日期是 2012 年 1 月 2 日 您是 1 天大。
为了解决这个问题,我想出了 2 种不同的方法,但它们都无法运行,它甚至不打印或 -1,它什么都不做。 最糟糕的部分(我想知道原因(是运行它后,我的计算机开始变慢,所以然后我需要重置或关闭我的 PC(Surface Book 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 不会无限。
你正在重新发明轮子。 您可以使用 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
变化,这意味着在第一个闰年之后的所有年份daysOfMonths[1]
都将29
我们不想要的。对此的解决方案是维护两个单独的daysOfMonths
列表或将daysOfMonths[1]
值放回28
。next_date(2000,1,31)
返回(2000, 1, 32)
但它应该是(2000, 2, 1)
.它的发生是因为elif
.如果年份是闰年,那么第 2 个、第 3 个条件day > daysOfMonths[month-1]
,month > 12
不会执行,因为它们处于elif
但我们希望检查这些条件,即使是闰年。解决方案不是将它们放在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 循环变成无限循环导致程序在您的编辑器中不返回任何内容。 但是Web编辑器可以检测到无限循环并会杀死该过程