計算機是如何計算兩個日期之間的天數的,這個問題看起來好像很簡單,但是仔細一想,好像還沒那么簡單,月與月之間天數不一樣,平年和閏年也會影響天數。
舉個例子:
2017年2月1日-2017年6月1日中間有多少天?那么計算機應該如何計算?如果是你的話你應該怎么去算呢?
一般人:
按照月份加 :28+31+30+31+1
笨一點的人:找一本日歷,一天一天的數,雖然慢一點,但只要會數數肯定也可以數出來
第一種算法對人類來說確實是簡單的,但是有前提,你知道每個月有幾天,今年是否是閏年,這個計算包含兩部分,整月數,非整月數,人類幾乎口算就可以;但是如果計算機實現起來,其實會復雜的多,因為計算機只會做一些簡單重復的勞動,而且速度非???。
下圖是我用python實現的一個簡單版本,基本實現了此項需求
import math
def isLeapYear(year):
'''judge a year is leapyear'''
if math.fmod(year, 4) == 0 and math.fmod(year, 100) != 0:
return True
if math.fmod(year, 400) == 0:
return True
return False
def daysInMonth(month, isLeapYear):
assert month >= 1 and month <= 12
monthDays = (31,28,31,30,31,30,31,31,30,31,30,31)
day = monthDays[month-1]
if isLeapYear and month == 2:
day += 1
return day
def nextDay(year, month, day):
isleap = isLeapYear(year)
monthDay = daysInMonth(month, isleap)
if day < monthDay:
return year, month, day + 1
else:
if month == 12:
return year + 1, 1, 1
else:
return year, month + 1, 1
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
days = 0
nextday = (year1, month1, day1)
while True:
nextday = nextDay(nextday[0], nextday[1], nextday[2])
days += 1
if nextday == (year2, month2, day2):
return days
return None
核心算法是daysBetweenDates()和nextDay(), daysBetweenDates()的思想是,從第一個日期開始數,一直數到第二個日期返回; nextDay()實現了數日期的正確性,內部屏蔽了閏年和月份對天數的影響。
什么是閏年這個很多人一直忽略的問題,以及它的算法為什么是這個樣子,這里貼一個鏈接。