【Python】文字列型とdatetime型の日付を計算するコード

Webアプリケーションなどを作っていると、たとえば「3日前に投稿されました」みたいな感じで、ある日付が今日から何日目なのかを求めたい場合ってありますよね。

そんなときはPythonの標準ライブラリであるdatetimeライブラリを使います。
具体的には、今日の日付をnow関数やtoday関数で取得し、そこから比較対象の日時を引くと答えが出ます。

ただ、このとき比較対象になる日時と今日の日時がどちらもdatetimeオブジェクトなら問題なく計算できるのですが、
もしも片方が文字列型などdatetimeオブジェクト以外であれば、それをdatetimeオブジェクトに変換してから計算しなければなりません。

僕もそういう場面に遭遇して、そのときに作った関数をご紹介します。

今日から何日前なのかを求める

文字列型の日付とdatetimeオブジェクトの日付を計算する場合、以下の関数で答えを求められます。

from datetime import datetime

def calculate(date):
now = datetime.now()
day_dt = datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
days = now - day_dt
return days.days

まず、この行で今の日時を求めます。

now = datetime.now()

つぎに、このコードで文字列型のデータをdatetimeオブジェクトに変換します。
datetimeライブラリの中にあるstrptimeメソッドを使用すると変換できます。

day_dt = datetime.strptime(date, '%Y-%m-%d %H:%M:%S')

最後に今日の日付から計算対象の日付を引き算して、daysメソッドで計算結果を取得します。

days = now - day_dt
return days.days

実行結果

それでは、実際にこの関数に文字列型の日付を入れてみましょう。
この記事を書いた日は2018年4月27日なので、そこから2018年4月26日を引いた数である「1」が返ってきていますね。

>>>str_day = "2018-04-26 01:45:23"
>>>calculate(str_day)
1

月が変わってもちゃんと計算できます。

>>>str_day = "2018-03-26 01:45:23"
>>>calculate(str_day)
32

もちろん年が変わってもきっちり計算できます。
2018年4月27日のちょうど一年前の日付を渡すと「365」が返ってきていますね。

>>>str_day = "2017-04-27 01:45:23"
>>>calculate(str_day)
365

じゃあ次は、歴史的な日が2018年4月27日から見て何日前だったのかを見てみましょう。

例えば、アメリカ合衆国の独立は1776年7月4日です。
この日は8万8,320日前になるみたいですね。

>>>str_day = "1776-07-04 01:45:23"
>>>calculate(str_day)
88320

次は天正10年6月2日。本能寺の変があった日です。
戦国の英雄・織田信長が、家臣の明智光秀の謀反によって滅亡したという事件ですね。

天正10年6月2日は旧暦での日付なので、これを西暦に直すと1582年6月21日になります。
本能寺の変は15万9,191日前になるようですね。

>>>str_day = "1582-06-21 01:45:23"
>>>calculate(str_day)
159191

では最後に、だいたい僕はあと何日生きられるのか計算してみましょう。

日本の平均寿命が83歳で、僕は現在33歳です。
なので、僕が死ぬ日を今から50年後の2068年4月27日に設定しました。

計算してみると、僕はあと1万8,263日生きられるようです。
もう2万日を切ってますね~。。これを見ると一日一日を大切に生きようって気になりますね♪

>>>str_day = "2068-04-27 01:45:23"
>>>calculate(str_day)
-18263

さて、シンプルなコードですが、ちゃんと機能していましたね。
アイデア次第では面白い使い方もできるかもしれません。

それでは今回はこのあたりで!
最後までお読みいただいてありがとうございました!