Python で日時を扱うには datetime モジュール を使用します。datetime には次のようなデータ型が定義されています。
データ型 保持する情報 datetime.datetime 日付+時刻 datetime.date 日付 datetime.time 時刻 datetime.timedelta 時間差(マイクロ秒)すべてのオブジェクトは immutable(不変)で、ハッシュのキーとして使用できます。
日時を表す datetime オブジェクトdatetime.datetime オブジェクト は、日付と時刻の両方の情報を保持します。datetime.date と datetime.time の情報を合わせたものです。以下、datetime.datetime オブジェクトを datetime オブジェクトと記述します。
現在の日時を表す datetime オブジェクトdatetime.now() で、ローカルな現在日時を表す datetime オブジェクトを取得できます。datetime オブジェクトには、年月日時分秒などの各フィールドの値を取り出す属性が定義されています。
import datetime from datetimedt = datetime.now()print(dt) # 2021-01-13 20:10:58.598240print(dt.year)# 2021print(dt.month)# 1print(dt.day) # 13print(dt.hour)# 20print(dt.minute) # 10print(dt.second) # 58print(dt.microsecond) # 598240print(dt.tzinfo) # Noneタイムゾーン (Aware/Naive)datetime オブジェクトはタイムゾーン情報(tzinfo 属性)を持つことができ、この情報が存在するとき(tzinfo が None でないとき)、そのオブジェクトは Aware であるといいます。逆に、タイムゾーン情報を持たないとき(tzinfo が None のとき)、そのオブジェクトは Naive であるといいます。
アプリケーション内で、タイムゾーンを意識した時刻情報を扱いたい場合は、Aware な datetime オブジェクトを生成する必要があります。
下記の datetime クラスメソッドはすべて現在日時を表す datetime オブジェクトを生成しますが、内部的に保持するタイムゾーン情報に違いがあります。
現在日時の取得方法 意味 datetime.now() Naive なローカル日時 (tzinfo == None) datetime.utcnow() Naive な UTC 日時 (tzinfo == None) datetime.now().astimezone() Aware なローカル日時 (tzinfo == システム設定) datetime.now(timezone.utc) Aware な UTC 日時 (tzinfo == timezone.utc)下記のサンプルコードを実行すると、これらの違いを調べることができます。
from datetime import datetime, timezonedt_local_naive = datetime.now()print(dt_local_naive.isoformat()) # 2021-01-13T20:46:50.587950print(dt_local_naive.tzinfo)# Nonedt_utc_naive = datetime.utcnow()print(dt_utc_naive.isoformat())# 2021-01-13T11:46:50.587950print(dt_utc_naive.tzinfo) # Nonedt_local_aware = datetime.now().astimezone()print(dt_local_aware.isoformat()) # 2021-01-13T20:46:50.587950+09:00print(dt_local_aware.tzinfo)# JSTdt_utc_aware = datetime.now(timezone.utc)print(dt_utc_aware.isoformat())# 2021-01-13T11:46:50.587950+00:00print(dt_utc_aware.tzinfo) # UTC日付を表す date オブジェクトdatetime.date オブジェクト は、日付(年月日)の情報を保持します。タイムゾーン情報(Aware/Naive)は意識しません。
from datetime import datedt = date.today()print(dt.isoformat()) # 2021-01-13print(dt.year) # 2021print(dt.month)# 1print(dt.day) # 13時刻を表す time オブジェクトdatetime.time オブジェクト は、時刻(時分秒)の情報を保持します。datetime オブジェクトと同様、tzinfo 属性でタイムゾーン情報を扱うため、Aware/Naive の区別があります。
from datetime import datetime, time, timezone# t = time(hour=20, minute=30, second=55, tzinfo=timezone.utc)t = datetime.now().astimezone().timetz()print(t.isoformat()) # 20:30:55.364310+09:00print(t.hour) # 20print(t.minute)# 30print(t.second)# 55print(t.microsecond) # 0print(t.tzinfo)# JST時間差を表す timedelta オブジェクトdatetime.timedelta オブジェクト は、2 つの日時の差分を表します。
datetime、date、time すべてのオブジェクトに対して、timedelta オブジェクトを加算、減算することができます。次の例では、datetime オブジェクトに対して、1 日の時間差を表す timedelta オブジェクトを使って演算処理しています。timedelta の属性名は、days、hours、seconds のように複数形になることに注意してください。
from datetime import datetime, timedeltadt = datetime(year=2021, month=1, day=1, hour=15, minute=30, second=0)delta = timedelta(days=1)print(dt) # 2021-01-01 15:30:00print(dt + delta) # 2021-01-02 15:30:00print(dt + delta * 2) # 2021-01-03 15:30:00print(dt - delta) # 2020-12-31 15:30:00print(dt - delta * 2) # 2020-12-30 15:30:00日時を表すオブジェクト (datetime / date / time) 同士で引き算すると、その時間差を表す timedelta オブジェクトを取得することができます。
from datetime import date, timedeltad1 = date(year=2021, month=1, day=1)d2 = date(year=2021, month=1, day=20)delta = d2 - d1print(delta)# 19 days, 0:00:00print(delta.days) # 19print(delta.total_seconds()) # 1641600.0あと、時間差ではないですが、等号・不等号で 2 つの日時データの大小を比較することができます。
from datetime import datetimedt1 = datetime(year=2000, month=1, day=1)dt2 = datetime(year=2000, month=1, day=2)print(dt1 > dt2) # Falseprint(dt1