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')