Menu
日本語

Python datetimeの使い方|日付・時刻・タイムゾーン完全ガイド

Pythonのdatetimeモジュールを実践的に解説。日付のパース・フォーマット、日付計算、そしてタイムゾーン処理まで迷わず扱えるようになります。

中心となる2つの型:date と datetime

Pythonの datetime モジュールで押さえておきたいのは4つ。datetimedatetime、そして timedelta です。最初の3つは名前のとおりで、最後の timedelta は「期間(時間の長さ)」を表します。

main.py
Output
Click Run to see the output here.

date は「年・月・日」だけを表すオブジェクトで、時刻は含みません。一方 datetime は日付に時刻が加わったものです。時刻まで扱う必要がなければ、date を使ったほうがすっきり書けます。

特定の日付を作る

コンストラクタで直接生成できます。

main.py
Output
Click Run to see the output here.

date の引数は year, month, daydatetime の場合は year, month, day, hour, minute, second, microsecond まで指定できます。

フィールドの取り出し

datedatetime オブジェクトには、次の属性が用意されています。

main.py
Output
Click Run to see the output here.

isoformat() は機械向けの出力にうってつけです。"2026-04-20T09:30:15" のような形で、他のシステムでも曖昧さなくパースできる文字列を返してくれます。

strftime で日付をフォーマットする

人間が読みやすい形にしたいときは、.strftime(fmt) を使えば datedatetime を好きな書式の文字列に変換できます。

main.py
Output
Click Run to see the output here.

覚えておくと便利なフォーマットコードをまとめておきます。

  • %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 オブジェクトに変換するやり方です。

main.py
Output
Click Run to see the output here.

フォーマット文字列は入力と完全に一致している必要があります。ずれていると strptimeValueError を投げます。

ISO-8601 形式の文字列(機械可読な標準フォーマット)であれば、モダンな Python ではもっと手軽なショートカットが用意されています。

main.py
Output
Click Run to see the output here.

バラバラなフォーマットを扱うなら、外部パッケージの dateutil(pip install python-dateutil) が便利です。parser.parse() は多少雑な書式でもいい感じに解釈してくれます。

timedelta で日付計算をする

日付の差分や加算・減算には timedelta を使います。

main.py
Output
Click Run to see the output here.

timedelta に渡せる引数は dayssecondsmicrosecondsmillisecondsminuteshoursweeks です。monthsyears は用意されていません。月ごとに日数が違うからですね。月単位・年単位の計算をしたいときは、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 の違い

タイムゾーン情報を持たない datetimenaive(ナイーブ) と呼ばれます。つまり、その日時がどのタイムゾーンを表しているのかを Python 自身は把握していない状態です。同じタイムゾーンの中だけで完結するなら、naive な日時同士の計算でも特に問題はありません。やっかいなのは、異なるタイムゾーンのデータが混ざってきた瞬間です。

一方、aware(アウェア)datetime はタイムゾーン情報を一緒に持ち歩きます。タイムゾーンは次のように明示的に付与します。

main.py
Output
Click Run to see the output here.

Python 3.9から、OS搭載のIANAデータベースを活用したタイムゾーン対応モジュール zoneinfo が標準ライブラリに加わりました。

main.py
Output
Click Run to see the output here.

.astimezone() を使ってタイムゾーン間で変換します:

main.py
Output
Click Run to see the output here.

覚えておいて損はないルールを一つ。datetime は UTC で保存し、表示するときにだけローカルのタイムゾーンに変換する。これを習慣づけるだけで、タイムゾーン関連のバグはほとんど防げます。

タイムスタンプ

Unix タイムスタンプとは、1970-01-01 UTC からの経過秒数のこと。Python なら相互変換も簡単です。

main.py
Output
Click Run to see the output here.

タイムスタンプは比較やソート、他システムとの連携で役立ちます。ユーザーに見せる形で出力したいときは、いったん datetime に戻してから整形しましょう。

処理時間を計測する

ざっくり所要時間を測りたいだけなら、datetime 同士を引き算するのが手軽です。

main.py
Output
Click Run to see the output here.

本格的にパフォーマンスを測りたいときは time.perf_counter() を使いましょう。サブマイクロ秒の精度があり、システム時計の変更にも影響されません。「この API 呼び出し、どのくらいかかった?」くらいのざっくりした計測なら datetime.now() で十分です。

よく使うパターン集

main.py
Output
Click Run to see the output here.

ここまでのまとめ

  • 実務の9割は datedatetimetimedelta で事足ります。
  • 機械が読む用途なら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 を使いましょう。

Coddyでコードを学ぼう

始める