Python | ファイル操作など:datetime 基本

Python
スポンサーリンク

概要(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())                   # 今日の日付
Python

time(時・分・秒だけを扱う)

time は「時計の時刻」だけを持つ型です。単体では日付もタイムゾーンもありません。ログのフォーマットや表示に向きます。

from datetime import time

t = time(9, 30, 0)                    # 09:30:00
print(t.hour, t.minute, t.second)     # 9 30 0
Python

datetime(“日時”をひとまとめに扱う)

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)
Python

timedelta(時間差・期間を表す)

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)
Python

ISO 形式の活用(機械にも人にも優しい)

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、比較と範囲定義で期限・集計を正確に。ここまで押さえれば、初心者でも時間を扱うコードが短く、読みやすく、実務品質に仕上がります。

タイトルとURLをコピーしました