中心となる2つの型:date と datetime
Pythonの datetime モジュールで押さえておきたいのは4つ。date、time、datetime、そして timedelta です。最初の3つは名前のとおりで、最後の timedelta は「期間(時間の長さ)」を表します。
date は「年・月・日」だけを表すオブジェクトで、時刻は含みません。一方 datetime は日付に時刻が加わったものです。時刻まで扱う必要がなければ、date を使ったほうがすっきり書けます。
特定の日付を作る
コンストラクタで直接生成できます。
date の引数は year, month, day、datetime の場合は year, month, day, hour, minute, second, microsecond まで指定できます。
フィールドの取り出し
date や datetime オブジェクトには、次の属性が用意されています。
isoformat() は機械向けの出力にうってつけです。"2026-04-20T09:30:15" のような形で、他のシステムでも曖昧さなくパースできる文字列を返してくれます。
strftime で日付をフォーマットする
人間が読みやすい形にしたいときは、.strftime(fmt) を使えば date や datetime を好きな書式の文字列に変換できます。
覚えておくと便利なフォーマットコードをまとめておきます。
%Y— 4桁の年(2026)%m— 月(ゼロ埋め2桁、04)%d— 日(ゼロ埋め2桁、20)%H/%I— 時(24時間表記 / 12時間表記)%M— 分%S— 秒%A/%a— 曜日名(フル / 省略形。Monday / Mon)%B/%b— 月名(フル / 省略形。April / Apr)%p— AM/PM
全部覚える必要はありません。リファレンスをブックマークしておいて、必要なときに調べれば十分です。
strptime で文字列を日付に変換する
今度は逆方向、つまり決まった形式の文字列を datetime オブジェクトに変換するやり方です。
フォーマット文字列は入力と完全に一致している必要があります。ずれていると strptime は ValueError を投げます。
ISO-8601 形式の文字列(機械可読な標準フォーマット)であれば、モダンな Python ではもっと手軽なショートカットが用意されています。
バラバラなフォーマットを扱うなら、外部パッケージの dateutil(pip install python-dateutil) が便利です。parser.parse() は多少雑な書式でもいい感じに解釈してくれます。
timedelta で日付計算をする
日付の差分や加算・減算には timedelta を使います。
timedelta に渡せる引数は days、seconds、microseconds、milliseconds、minutes、hours、weeks です。months や years は用意されていません。月ごとに日数が違うからですね。月単位・年単位の計算をしたいときは、dateutil.relativedelta を使いましょう:
from dateutil.relativedelta import relativedelta
from datetime import date
today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)
タイムゾーン:naive と aware の違い
タイムゾーン情報を持たない datetime は naive(ナイーブ) と呼ばれます。つまり、その日時がどのタイムゾーンを表しているのかを Python 自身は把握していない状態です。同じタイムゾーンの中だけで完結するなら、naive な日時同士の計算でも特に問題はありません。やっかいなのは、異なるタイムゾーンのデータが混ざってきた瞬間です。
一方、aware(アウェア) な datetime はタイムゾーン情報を一緒に持ち歩きます。タイムゾーンは次のように明示的に付与します。
Python 3.9から、OS搭載のIANAデータベースを活用したタイムゾーン対応モジュール zoneinfo が標準ライブラリに加わりました。
.astimezone() を使ってタイムゾーン間で変換します:
覚えておいて損はないルールを一つ。datetime は UTC で保存し、表示するときにだけローカルのタイムゾーンに変換する。これを習慣づけるだけで、タイムゾーン関連のバグはほとんど防げます。
タイムスタンプ
Unix タイムスタンプとは、1970-01-01 UTC からの経過秒数のこと。Python なら相互変換も簡単です。
タイムスタンプは比較やソート、他システムとの連携で役立ちます。ユーザーに見せる形で出力したいときは、いったん datetime に戻してから整形しましょう。
処理時間を計測する
ざっくり所要時間を測りたいだけなら、datetime 同士を引き算するのが手軽です。
本格的にパフォーマンスを測りたいときは time.perf_counter() を使いましょう。サブマイクロ秒の精度があり、システム時計の変更にも影響されません。「この API 呼び出し、どのくらいかかった?」くらいのざっくりした計測なら datetime.now() で十分です。
よく使うパターン集
ここまでのまとめ
- 実務の9割は
date・datetime・timedeltaで事足ります。 - 機械が読む用途ならISO-8601、人が読む用途なら
strftimeを使い分けましょう。 - データはUTCで保存し、表示するタイミングでローカルに変換するのが鉄則です。
- タイムゾーン名で扱いたいときは
zoneinfoの出番です。 - 月単位・年単位の計算には
dateutil.relativedeltaが便利です。
実務で役立つ道具をもう一つ。次は正規表現を見ていきます。
よくある質問
Pythonで現在の日時を取得するには?
ローカルの現在日時は datetime.now() で取得できます。UTCが欲しいときは datetime.utcnow() でも取れますが、これはnaiveなdatetimeを返すため、最近は datetime.now(timezone.utc) を使うのが主流です。日付だけでよければ date.today() が手軽です。
日付を文字列にフォーマットするには?
.strftime(format) を使います。年月日なら %Y-%m-%d のようにフォーマットコードを指定する形ですね。例えば datetime.now().strftime('%Y-%m-%d %H:%M') のように書けます。逆に文字列を日付に戻すときは同じフォーマットコードを datetime.strptime(text, format) に渡せばOKです。
Pythonで日付に日数を足すには?
timedelta を使います。from datetime import date, timedelta として date.today() + timedelta(days=7) のように書けば7日後が得られます。timedelta はdays、hours、minutes、seconds、weeksなどに対応していますが、月や年の加算はできません。月単位・年単位の計算をしたいときは外部ライブラリの dateutil.relativedelta を使いましょう。