LoginSignup
0
1

自分が生後何か月なのか計算するコードを実装する

Posted at

はじめに

datetime型を使用した計算をすることがあると思います(例えば日付の差分や指定した日数経過後に日付など)。
私は自分が生後何日か、何か月なのかを求めてみようと思いdatetime型を使っていたのですが、
datetime型だけだと月の差分が求められなかったので備忘メモとして残したいと思います。

やりたいこと

自分が生後何日・何か月なのか計算させたい

結論

日にちの減算の計算はdatetime、月の減算の計算はrelativedeltaが良さそう

動作環境

Windows11
Google Colaboratory

日時の差分と月の差分を求める

当初はdatetime.now() - datetime(任意の日付)で日時の差分を求めることができるので、月の差分も一緒に求められるのではと思っていました。
ところが、実行してみて中身を確認すると分かるのですが、以下のように日、秒、マイクロ秒の差分は取得できるのですが、月の差分は取得できませんでした。

how_many_days_old = datetime.now() - datetime(year=2014, month=10, day=25)
print(how_many_days_old)
---------------------------------------------------------------------------
datetime.timedelta(days=3475, seconds=40337, microseconds=557785)

公式ドキュメントを確認したところ、日、秒、マイクロ秒、分、時間、週は取得できるようですが、月は取得できないようでした。

月の差分を求めるにはrelativedeltaが必要

そこで調べたところ、dateutilというサードパーティーライブラリのrelativedeltaをimportすると月の差分を求められるようでした。
pip install python-dateutilでインストールして早速使ってみようと思います。

以下ドキュメント

サンプルコード

from datetime import datetime

from dateutil.relativedelta import relativedelta

# 試しにPyLadies Tokyoができた日を入力
birthday = datetime(year=2014, month=10, day=25)

# 生後何日
how_many_days_old = datetime.now() - datetime()
print("あなたは生後" + str(how_many_days_old.days) + "日です")
# 生後何ヶ月
how_many_old_relativedelta = relativedelta(datetime.now(), birthday)
how_many_months_old = (
    how_many_old_relativedelta.years * 12
) + how_many_old_relativedelta.months
print("あなたは生後" + str(how_many_months_old) + "ヶ月です")

-----------------------------------------------------------------------
実行結果
あなたは生後3475日です
あなたは生後114ヶ月です

ネット上に在る複数の日付や月の差分を求められるツールを使用して確認したところ合っていました。
日付の差分を求めたい場合はdatetime月の差分を求めたい場合はdateutil.relativedeltaを使用すると良さそうです。

コード全文はこちら

所感

生後何日かの計算結果については、日付計算ツール等を使って確認したのですが、
時間があったらテストコードも実装してみたいと思います。
おそらくモックを使わないと確認できなさそうなのでまた記事にしたいと思います。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1