概要(datetime は「日付と時刻」を安全・正確に扱うための標準ツール)
datetime は、今日の日時取得、足し算引き算、表示形式への変換、文字列からのパース、タイムゾーン対応までを一通りこなせる標準ライブラリです。文字列や手書き計算に頼ると誤差やバグが生まれますが、datetime を使えば「型」で守られた正確な処理ができます。初心者は date(純粋な日付)、time(純粋な時刻)、datetime(日時)、timedelta(時間差)の4要素をまず押さえましょう。
from datetime import date, time, datetime, timedelta
today = date.today()
now = datetime.now()
in_3_days = today + timedelta(days=3)
print(today, now, in_3_days)
Python基本のオブジェクト(date・time・datetime・timedelta)
date(年・月・日だけを扱う)
date は「カレンダーの日付」だけを持つ型です。曜日、年・月・日、ISO形式などが簡単に取り出せます。時間帯の概念はありません。
from datetime import date
d = date(2025, 12, 14)
print(d.year, d.month, d.day) # 2025 12 14
print(d.isoformat()) # '2025-12-14'
print(d.weekday()) # 0=月曜 … 6=日曜
print(date.today()) # 今日の日付
Pythontime(時・分・秒だけを扱う)
time は「時計の時刻」だけを持つ型です。単体では日付もタイムゾーンもありません。ログのフォーマットや表示に向きます。
from datetime import time
t = time(9, 30, 0) # 09:30:00
print(t.hour, t.minute, t.second) # 9 30 0
Pythondatetime(“日時”をひとまとめに扱う)
datetime は「日付+時刻」をまとめた型で、最もよく使います。現在日時の取得、比較、計算、文字列化など、実務の中心です。
from datetime import datetime
dt = datetime(2025, 12, 14, 9, 57, 0)
print(dt) # 2025-12-14 09:57:00
print(datetime.now()) # 現在日時(ローカル)
print(datetime.utcnow()) # 世界協定時刻(UTC)
Pythontimedelta(時間差・期間を表す)
timedelta は「差分」を表す型で、加減算に使います。日付の足し算、締め切り計算、期間の比較などに必須です。
from datetime import datetime, timedelta
deadline = datetime.now() + timedelta(days=7)
one_hour_ago = datetime.now() - timedelta(hours=1)
print(deadline, one_hour_ago)
Python文字列との相互変換(strftime・strptime・ISO)
表示形式へ変換(strftime)
strftime は「人が読みやすい文字列」へ変換します。%Y(年)、%m(月)、%d(日)、%H(時)、%M(分)、%S(秒)が基本です。
from datetime import datetime
now = datetime.now()
print(now.strftime("%Y/%m/%d %H:%M:%S")) # 2025/12/14 09:57:00 など
print(now.strftime("第%W週(%A)")) # 週番号や曜日も可能
Python文字列から日時へ変換(strptime)
strptime は「文字列→datetime」の変換です。入力フォーマットを正しく指定すると頑健にパースできます。
from datetime import datetime
s = "2025-12-14 09:57"
dt = datetime.strptime(s, "%Y-%m-%d %H:%M")
print(dt) # datetime(2025, 12, 14, 9, 57)
PythonISO 形式の活用(機械にも人にも優しい)
isoformat()/fromisoformat() は扱いやすく、APIや設定ファイルで定番です。タイムゾーン付きの ISO もサポートされます。
from datetime import datetime
now = datetime.now()
text = now.isoformat() # '2025-12-14T09:57:00.123456'
back = datetime.fromisoformat(text)
print(text, back)
Pythonタイムゾーンの基本(zoneinfo・Naive/Aware)
Naive と Aware(タイムゾーンを持つかどうか)
datetime は「タイムゾーンのない Naive」と「タイムゾーン付き Aware」があります。世界やサーバと連携するなら Aware を使うのが安全です。日付だけの比較やローカル専用の簡易処理なら Naive でも足ります。
from datetime import datetime, timezone
naive = datetime.now() # タイムゾーンなし(Naive)
aware = datetime.now(timezone.utc) # UTC 付き(Aware)
print(naive.tzinfo, aware.tzinfo) # None, UTC
Pythonローカルタイムゾーンを明示(zoneinfo)
標準の zoneinfo で IANA タイムゾーンを扱えます。日本なら “Asia/Tokyo”。これで「どの地域の時刻か」を明確化できます。
from datetime import datetime
from zoneinfo import ZoneInfo
jst_now = datetime.now(ZoneInfo("Asia/Tokyo"))
utc_now = datetime.now(ZoneInfo("UTC"))
print(jst_now.isoformat(), utc_now.isoformat())
Pythonタイムゾーン変換(astimezone)
UTCで保存して、表示はローカルへ変換——実務の定番パターンです。
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc_dt = datetime(2025, 12, 14, 0, 57, tzinfo=timezone.utc)
jst_dt = utc_dt.astimezone(ZoneInfo("Asia/Tokyo"))
print(utc_dt, "→", jst_dt) # 09時間進む
Python日時計算・比較・丸めの勘所(重要ポイントを深掘り)
加減算と比較(timedelta で安全に)
秒・分・時・日などの計算は必ず timedelta を使います。整数の手計算はバグの元です。datetime は大小比較が可能で、期限チェックも簡単です。
from datetime import datetime, timedelta
start = datetime.now()
end = start + timedelta(days=3, hours=2)
print(end > start) # True(期限が先)
Python差の取得(終了時刻−開始時刻)
差分は timedelta で得られ、秒などに変換できます。計測やレポートに便利です。
from datetime import datetime, timedelta
import time
t0 = datetime.now()
time.sleep(0.3)
t1 = datetime.now()
delta = t1 - t0
print(delta.total_seconds()) # 約0.3
Python日の始まり・終わりを作る(丸め)
日次集計では「0時」「23:59:59」を作ることが多いです。dt.date() と組み合わせて厳密に範囲を定義しましょう。
from datetime import datetime, time
dt = datetime.now()
start_of_day = datetime.combine(dt.date(), time(0, 0, 0))
end_of_day = datetime.combine(dt.date(), time(23, 59, 59))
print(start_of_day, end_of_day)
Python例題で身につける(定番から一歩先まで)
例題1:人間向けログ時刻(日本語表記)
from datetime import datetime
from zoneinfo import ZoneInfo
def human_log() -> str:
dt = datetime.now(ZoneInfo("Asia/Tokyo"))
return dt.strftime("%Y年%m月%d日(%a) %H:%M:%S")
print(human_log())
Python例題2:n日後の期限を文字列で保存(ISO で頑丈)
from datetime import datetime, timedelta
def deadline_iso(days: int = 3) -> str:
return (datetime.now() + timedelta(days=days)).isoformat()
print(deadline_iso(10))
Python例題3:文字列の日時を厳密にパースして検証
from datetime import datetime
def parse_ts(s: str) -> datetime:
return datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
dt = parse_ts("2025-12-14 09:57:00")
print(dt)
Python例題4:UTCで保存して、JSTで表示(実務定番)
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
def store_utc() -> datetime:
return datetime.now(timezone.utc)
def show_jst(dt_utc: datetime) -> str:
return dt_utc.astimezone(ZoneInfo("Asia/Tokyo")).strftime("%Y/%m/%d %H:%M")
utc_saved = store_utc()
print(show_jst(utc_saved))
Pythonまとめ
datetime は「型で時間を守る」ための標準手段です。date/time/datetime/timedelta の役割を分け、strftime/strptime で文字列と安全に往復し、isoformat/fromisoformat を実務の基本線に。タイムゾーンは Naive/Aware を意識し、ZoneInfo で地域を明示、UTC保存→ローカル表示が堅牢。計算は必ず timedelta、比較と範囲定義で期限・集計を正確に。ここまで押さえれば、初心者でも時間を扱うコードが短く、読みやすく、実務品質に仕上がります。
