【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日前について
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.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. あとがき
ああ、タイムゾーン入ってないなこれ…まあいいや。
Author And Source
この問題について(【Python3】定期券計算を使って「○年○月○日は何カ月前!」ってのを書いてみた), 我々は、より多くの情報をここで見つけました https://qiita.com/neonemo/items/cdb8af9647ff5320e92c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .