【Python3】定期券計算を使って「○年○月○日は何カ月前!」ってのを書いてみた


1. 概要

Python3でいわゆる定期券計算とdatetimeを使って、何日前、とか何カ月前みたいなのを出してみた。


という事が稀に良く起きるので。あ、手書きで漢字を書く時も稀に良くある。
耄碌したかな…。

2. 動作サンプル

https://paiza.io/projects/_YmaBQlwVecdO9JDagJKvA

3. ソース

from datetime import datetime

def test(old_datetime):
    today_datetime = datetime.today().replace(hour=0,minute=0,second=0,microsecond=0)

    # 日数と週の扱い
    date_diff = (today_datetime - old_datetime).days
    week_diff = date_diff // 7

    # 月の扱い
    month_diff = (today_datetime.month - old_datetime.month) + (today_datetime.year - old_datetime.year) * 12
    if today_datetime.day - old_datetime.day < 0:
        month_diff -= 1

    # 年の扱い
    years_diff = month_diff // 12

    print(f'{old_datetime} は、{years_diff} 年前、{month_diff} カ月前、{week_diff} 週間前、{date_diff} 日前')


print(f'今日は {datetime.today()} です。')
test(datetime(2021, 2, 4))
test(datetime(2021, 2, 3))
test(datetime(2021, 2, 1))
test(datetime(2021, 1, 31))
test(datetime(2020, 12, 4))
test(datetime(2020, 2, 6))
test(datetime(2020, 2, 5))
test(datetime(2020, 2, 4))

4. 解説

4.1. 1日前について

【昨日】って何?って話。これは、0時を回ったらという判断にした。
厳密には24時間経過したらってなるけど、感覚としては寝て起きたら、寝る前の時間は昨日じゃん?
って事で、datetimeは00:00:00.000で丸めてある。

4.2. 1ヵ月前、1年前について

定期券計算の肝なんだけど、2021/02/01から見て2021/01/31は、1日前だけど、1ヵ月前じゃない
先月の同じ日付のプラス1 が1ヵ月経過していない境界になるわけだ。

今日 調べる日 判定
2021/02/05 2021/02/05 0年前、0ヵ月前、0日前
2021/02/04 0年前、0ヵ月前、1日前
2021/01/06 0年前、0ヵ月前、30日前
2021/01/05 0年前、1ヵ月前、31日前
2020/02/06 0年前、11ヵ月前、365日前
2020/02/05 1年前、12ヵ月前、366日前

4.3. 1週間について

これは単純に日数を7で割った商でいい。

5. あとがき

ああ、タイムゾーン入ってないなこれ…まあいいや。