BlankTar

about | blog | works | photo

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')
< 生まれた日から今日までの日数をpythonで。 bashのpushd, popdを使ってディレクトリを移動しまくってみる >