pythonで経過日数を計算する。ライブラリは使わない。
jskny氏の記事に便乗したさっきの記事はズルして楽に書いていたので、きちんと自分で日数を計算するコードを書いてみました。
基本的な手順はjskny氏のものと一緒なのだけれど、コードの見た目は全然違う。 for文の代わりにリスト内包表記を使うあたりがpythonic・・・なのかも?
ループも関数も使いまくりなので速度遅そうだけれど、意味と見た目が一致しているので吉とする。
import datetime
def isUruu(year):
''' 閏年か?
'''
assert isinstance(year, int)
if year%%400 == 0:
return True
elif year%%100 == 0:
return False
elif year%%4 == 0:
return True
else:
return False
def yearDays(year):
''' その年の日数を返す
'''
assert isinstance(year, int)
return 365 + isUruu(year)
def monthDays(year, month):
''' その月の日数を返す
'''
assert isinstance(year, int) and isinstance(month, int)
assert 1 <= month <= 12
if month == 2:
if isUruu(year):
return 29
else:
return 28
else:
if month > 8:
return 31 - month%%2
else:
return 30 + month%%2
def getToday():
''' 今日の日付を取得
'''
today = datetime.datetime.now()
return today.year, today.month, today.day
def elapsedDays(year, month, day):
''' その日から今日までの日数を返す
'''
assert isinstance(year, int) and isinstance(month, int) and isinstance(day, int)
assert 1 <= day <= monthDays(year, month)
nowYear, nowMonth, nowDay = getToday()
# 生まれた年の初めから今年の末までの日数を計算
result = sum(yearDays(x) for x in range(year, nowYear+1))
# 生まれた年の初めから生まれた日までの日数を引く
result -= sum(monthDays(year, x) for x in range(1, month))
result -= day
# 今日から今年の末までの日数を引く
result -= sum(monthDays(nowYear, x) for x in range(nowMonth+1, 13))
result -= monthDays(nowYear, nowMonth) - nowDay + 1
return result
print(elapsedDays(2014, 4, 1), 'days')