Python

Pythonで数ヶ月後の月数を算出する

どの言語にも言えることですが、月末日を対象にして数ヶ月後の日付を取得する際に、想像していた日付と結果が異なる場合があります。

例えば、「8月31日」の 1 ヶ月後だと「9月31日」になりますが、「9月31日」は存在しないので、どのように丸めるかはプログラム言語によって様々です。

9 月として扱う言語もあれば、10 月として扱う言語もあります。

今回、Python で半年後の日付を算出する機会があったので調べてみました。

Pythonで半年後の日付を確認する

datetime と relativedelta を使って半年後の日付を算出してみましょう。

この記事を書いているのは 2020 年 8 月 29 日になりますが、実行結果は以下の通りです。
(時間部分は省略します)

2021-02-28

2021 年は閏年(うるう年)ではないので、2 月 29 日は存在しませんが、Python では 2 月 28 日という結果になりました。

ということは、8 月 30 日に実行しても、8 月 31 日に実行しても同じ結果になりそうですね。

もし、半年後の月数(2月なので2)を求めるのであれば Python の場合はこのままのロジックで良さそうです。

PHPで半年後の日付を確認する

参考までに PHP で半年後の日付を確認してみましょう。

ベタに date と strtotime の関数を使った結果になります。

サクっとコマンドライン上から実行してみます。

こちらは Python の結果とは異なり、3 月 1 日という結果になりました。

2021-03-01

8 月 30 日に実行したら 2021-03-02、8 月 31 日に実行したら 2021-03-03 になるでしょう。

1日をベースに計算する

よって、PHP の標準的な関数を利用する場合は、当月の 1 日をベースに数か月後の日付を算出するのが無難なのですが、Python の場合も同様にするのがベターなのでしょうか。

少しロジックを調整してみましょう。

現在日時の日にちだけを 1 日に変換して、そこから半年後を計算してみます。

結果は以下の通り。
(時間部分は省略します)

2021-02-01

PHP も同様にしてみましょう。

2021-02-01

記事内では時間部分の表示を省略しましたが、Python で日付フォーマットを指定する場合は strftime を使えば簡単です。