Pythonで日付や時刻を扱うときは、標準ライブラリのdatetime
が基本です。
この記事では、現在の日時の取得、日付と時刻の比較、そして見やすい表示方法を、Python初心者の方にも分かりやすく丁寧に解説します。
インポートの仕方から具体的なコード例、実行結果まで一通り確認できる内容です。
Pythonのdatetime入門
標準ライブラリdatetimeの基本
datetimeは標準ライブラリなので、追加インストールなしで使えます。
主に以下のクラスを使い分けます。
日付だけならdate
、時刻だけならtime
、両方をまとめて扱うならdatetime
という具合です。
日付の差分はtimedelta
で表現できます。
date/time/datetimeの違い
3つのクラスの違いは、どの情報を保持するかにあります。
初心者の方は、まず「何を持っているか」で選ぶと迷いにくいです。
クラス | 含む情報 | 例 | 主な用途 |
---|---|---|---|
date | 年・月・日 | 2025-05-01 | 休日判定、日付だけの比較や表示 |
time | 時・分・秒・マイクロ秒 | 09:30:00 | 営業時間の開始時刻などの表現 |
datetime | 年月日と時分秒の両方 | 2025-05-01 09:30:00 | 発生時刻の記録、並び替えや比較 |
迷ったらdatetime
で始めて、必要なときに.date()
や.time()
を取り出すのが扱いやすいです。
importの書き方(import datetime)
初心者の方には名前空間が分かりやすいimport datetime
をおすすめします。
クラス名がモジュール名と同じdatetime
なので、最初は「モジュール.クラス」の形で書けると安全です。
# 推奨: 明示的にモジュールを保ったまま使う
import datetime
now = datetime.datetime.now() # モジュール名(datetime) + クラス名(datetime)
# よく見る別解1: 必要なクラスだけ取り出す
from datetime import datetime, date
now2 = datetime.now()
today = date.today()
# 別解2: 短縮名を使う
import datetime as dt
now3 = dt.datetime.now()
チームで統一するなら、最初はimport datetime
に揃えると混乱が少ないです。
日付と時刻を取得する(now/today)
現在の日時を取得する(datetime.now)
現在の日時はdatetime.datetime.now()
で取得します。
取得されるのはローカルタイムで、タイムゾーン情報は含まれない「ナイーブ」なdatetime
です。
# 現在の日時を取得する基本
import datetime
now = datetime.datetime.now()
print(now) # デフォルトの文字列表現
print(now.isoformat()) # ISO 8601形式 (T区切り)
print(now.year, now.month, now.day) # 年・月・日を個別に参照
2025-09-16 10:23:45.678901
2025-09-16T10:23:45.678901
2025 9 16
タイムゾーン付きの扱いは入門範囲外ですが、将来必要になったらzoneinfo
やpytz
の知識が役立ちます。
今日の日付を取得する(date.today)
日付だけ欲しいときはdate.today()
が簡単です。
時刻は含まれません。
import datetime
today = datetime.date.today()
print(today) # デフォルト表現
print(today.isoformat()) # ISO 8601形式
print(today.year, today.month, today.day)
2025-09-16
2025-09-16
2025 9 16
特定の日時を作る(datetimeで生成)
好きな年月日時分秒を指定してdatetime
インスタンスを作れます。
日付だけ、時刻だけを作ることもできます。
import datetime
# 2024年12月31日 23時59分00秒の日時を作る
dt_specific = datetime.datetime(2024, 12, 31, 23, 59, 0)
print(dt_specific)
print(dt_specific.isoformat())
# 日付だけを作る
d = datetime.date(2025, 1, 2)
print(d)
# 時刻だけを作る
t = datetime.time(9, 30, 0)
print(t)
# うるう年の注意: 存在しない日付はValueErrorになる
try:
ok = datetime.date(2024, 2, 29) # 2024年はうるう年
print("OK:", ok)
bad = datetime.date(2023, 2, 29) # 存在しない日付
except ValueError as e:
print("ValueError:", e)
2024-12-31 23:59:00
2024-12-31T23:59:00
2025-01-02
09:30:00
OK: 2024-02-29
ValueError: day is out of range for month
うるう年や範囲に注意
月は1〜12、日は各月の範囲内である必要があります。
存在しない日付や時刻を渡すとValueError
になります。
日付と時刻を比較する(大小・同値)
比較演算子(>, <, ==)で比較
datetimeやdateはそのまま比較演算子で大小や等価を比較できます。
同じ種類同士の比較が基本です。
import datetime
a = datetime.datetime(2025, 5, 1, 9, 0)
b = datetime.datetime(2025, 5, 1, 18, 0)
c = datetime.datetime(2025, 5, 1, 9, 0)
print("a < b:", a < b) # 9時は18時より前
print("a == c:", a == c) # 同じ瞬間
print("b > c:", b > c) # 18時は9時より後
# 日付同士の比較もOK
d1 = datetime.date(2025, 5, 1)
d2 = datetime.date(2025, 5, 2)
print("d1 < d2:", d1 < d2)
a < b: True
a == c: True
b > c: True
d1 < d2: True
タイムゾーン付きdatetime
とタイムゾーンなしdatetime
は直接比較できません。
その場合はどちらかに統一してください。
日付だけを比較する(dateに変換)
同じ日かどうか、または日付の前後だけを見たい場合はdatetime
から.date()
で日付を取り出して比べるのが簡単です。
import datetime
start = datetime.datetime(2025, 5, 1, 23, 30)
end = datetime.datetime(2025, 5, 2, 1, 15)
# 日付だけを取り出して比較
print("start.date() == end.date():", start.date() == end.date())
# 同じ日かどうかを関数にする
def is_same_day(x: datetime.datetime, y: datetime.datetime) -> bool:
return x.date() == y.date()
print("same day?", is_same_day(start, end))
start.date() == end.date(): False
same day?: False
日付の境界をまたぐ処理のバグは、時刻まで含めて比較してしまうと起きやすいです。
日付だけにしたいときは.date()
に揃えましょう。
日付と時刻を表示する(基本)
printとisoformatで表示
人にも機械にも読みやすいのはisoformat()
です。
print
はデフォルトで見やすい表現になりますが、標準化された形式が必要なときはisoformat()
を使います。
import datetime
dt = datetime.datetime(2025, 1, 2, 3, 4, 5, 678901)
print("print:", dt) # デフォルト表現
print("isoformat:", dt.isoformat()) # T区切りのISO 8601
print("date iso:", dt.date().isoformat()) # 日付だけのISO
print: 2025-01-02 03:04:05.678901
isoformat: 2025-01-02T03:04:05.678901
date iso: 2025-01-02
ログやファイル保存などの外部出力にはisoformat()
を優先すると、後からパースしやすくなります。
f文字列で年・月・日・時・分を取り出す
自由な表示形式を作るならf文字列で属性を直接埋め込むのが簡単です。
ゼロ埋めは:02d
などのフォーマット指定で行います。
import datetime
dt = datetime.datetime(2025, 7, 14, 8, 5)
# 和文として見やすい書式
msg = f"{dt.year}年{dt.month}月{dt.day}日 {dt.hour:02d}:{dt.minute:02d}"
print(msg)
# 英数字のみの書式
msg2 = f"{dt.year}/{dt.month:02d}/{dt.day:02d} {dt.hour:02d}:{dt.minute:02d}"
print(msg2)
2025年7月14日 08:05
2025/07/14 08:05
より柔軟な書式指定や文字列から日時への変換にはstrftime
とstrptime
を使いますが、これは別の記事で詳しく扱います。
まとめ
本記事では、datetimeの基本である「取得」「比較」「表示」に絞って解説しました。
まずはimport datetime
で始め、現在時刻はdatetime.datetime.now()
、今日の日付はdate.today()
で取得し、比較はふつうの比較演算子で行えます。
日付だけを比較したいときは.date()
で揃えるのが安全で、出力はisoformat()
やf文字列で見やすく整えられます。
次のステップとして、書式変換(strftime/strptime)
や日付計算(timedelta)
に進むと、日付時刻の扱いがさらに強力になります。