🐍Pythonのdatetimeを完全理解!日付・時間・タイムゾーン・祝日判定までやさしく解説+学習書5選

IT・テクノロジー
目次
  1. 🐍 日付と時間の操作は「アプリ作りの必修科目」
  2. 📘 datetimeモジュールの全体像
  3. 📆 dateオブジェクト:日付だけを扱う
  4. ⏰ timeオブジェクト:時間だけを扱う
  5. 🕒 datetimeオブジェクト:日付+時間をまとめて扱う
  6. ➕ timedelta:日付・時間の足し算引き算
  7. 🌍 タイムゾーンを正しく扱う
  8. 🎌 jpholidayで日本の祝日を判定する
  9. 📚 Python日付処理を加速する厳選書籍&ツール
  10. ❓ よくある質問(FAQ)
  11. 🎯 まとめ:「時間を制する者がアプリを制す」

🐍 日付と時間の操作は「アプリ作りの必修科目」

予約システム、ログ集計、リマインダー、ポイント有効期限、定期実行スクリプト——アプリを作ろうとすると、必ずと言っていいほど「日付と時間」を扱う場面に出会います。📅

Pythonには標準ライブラリとして datetime モジュールが用意されており、これを使いこなせるだけで、日々のコーディングの幅がぐっと広がります。今日からあなたのコードに「時間を操る力」を加えていきましょう。⏰

📘 datetimeモジュールの全体像

Pythonの datetime モジュールには大きく3つのオブジェクトがあります。役割を整理しておくと、後の理解がスムーズです。

  • 📌 date:日付(年・月・日)だけを扱うオブジェクト
  • 📌 time:時間(時・分・秒・マイクロ秒)だけを扱うオブジェクト
  • 📌 datetime:日付と時間の両方を持つオブジェクト
ややこしいのですが、モジュール名も datetime、その中のクラス名も datetime です。import文を書くときは混乱しないように気をつけましょう。✍️

📆 dateオブジェクト:日付だけを扱う

今日の日付を取得する

from datetime import date

t = date.today()
print(t)   # 例: 2025-06-13

date.today() で今日の日付の dateオブジェクト が返ってきます。文字列ではなくオブジェクトなので、後で計算や属性アクセスができます。👍

年・月・日・曜日を取り出す

dateオブジェクトは yearmonthday プロパティで各要素にアクセスできます。曜日を知りたいときは weekday() メソッドが便利。0が月曜、1が火曜……6が日曜に対応します。

from datetime import date

d = date(2020, 12, 24)
print(d.year, d.month, d.day)   # 2020 12 24
print(d.weekday())              # 3 → 木曜日

⏰ timeオブジェクト:時間だけを扱う

時刻だけが必要なときは time オブジェクトを使います。引数は順番に「時・分・秒・マイクロ秒」。指定しなかった部分は自動的に0が入ります。

from datetime import time

t = time(14, 30)
print(t.hour, t.minute, t.second, t.microsecond)
# 14 30 0 0

🕒 datetimeオブジェクト:日付+時間をまとめて扱う

現在の日時を取得する

from datetime import datetime

now = datetime.now()
print(now)   # 例: 2025-06-13 14:23:05.123456

datetime.now() はマイクロ秒まで含めた現在時刻を返します。プロパティで yearmonthdayhourminutesecondmicrosecond にそれぞれアクセスできます。

日時を指定してdatetimeを作る

引数は「年・月・日・時・分・秒・マイクロ秒」の順。日付の部分(年月日)は省略できませんが、時間以降は省略可能で、省略した部分は0になります。

from datetime import datetime

d = datetime(2020, 12, 25, 14, 11)
print(d)   # 2020-12-25 14:11:00

➕ timedelta:日付・時間の足し算引き算

2つの日時の差を求める

datetimeオブジェクト同士を引き算すると、差分を表す timedelta オブジェクトが返ります。.days プロパティで日数差が取れます。

from datetime import datetime

d1 = datetime(2020, 12, 25)
d2 = datetime(2020, 11, 25)
diff = d1 - d2

print(diff.days)   # 30

「○日後」「○時間後」を計算する

逆に、timedelta を datetime に足せば、指定した日数・時間後の日時が得られます。

from datetime import datetime, timedelta

d = datetime(2020, 12, 25, 3, 0)
future = d + timedelta(days=10)
print(future)   # 2021-01-04 03:00:00

引数は dayshoursminutessecondsmicrosecondsweeks など。秒単位の差分を取って時間に変換するときは diff.seconds を使います。⚡

🌍 タイムゾーンを正しく扱う

なぜタイムゾーンが必要?

イギリスの朝8時と日本の朝8時は同じ瞬間ではありません。海外ユーザーがいるアプリを作るとき、「現地時間の朝8時に通知を出したい」といった処理にはタイムゾーン管理が欠かせません。🌐

世界の時間の基準となるのがUTC(協定世界時)。日本標準時(JST)はUTCより9時間進んでいます(UTC+9)。Pythonでタイムゾーンを設定するには timezone オブジェクトを使います。

日本時間を設定する

from datetime import datetime, timezone, timedelta

JST = timezone(timedelta(hours=+9))

d = datetime(2025, 6, 13, 10, 0, tzinfo=JST)
print(d)   # 2025-06-13 10:00:00+09:00

出力の末尾に +09:00 が付いていることに注目してください。これが「UTCより9時間進んでいる」というタイムゾーン情報。これがあるかないかで、同じ表示でも内部的な扱いがまったく違います。🛡️

🎌 jpholidayで日本の祝日を判定する

weekdayだけでは「土日」しか分からない

weekday() で土日判定はできますが、ゴールデンウィークやお正月などの祝日まで含めた休日判定は標準ライブラリでは手に負えません。そこで活躍するのが外部ライブラリ jpholiday です。✨

pip install jpholiday

祝日かどうかを判定する

import jpholiday
from datetime import date

print(jpholiday.is_holiday(date(2021, 5, 3)))
# True

print(jpholiday.is_holiday_name(date(2021, 5, 3)))
# 憲法記念日

その年の祝日をすべて取得する

import jpholiday

holidays = jpholiday.year_holidays(2021)
for d, name in holidays:
    print(d, name)

戻り値は「date オブジェクトと祝日名のタプル」のリスト。「休日限定キャンペーン」「祝日カレンダー表示」などの実装が一気にラクになります。📊

日本の祝日は年によって増減・移動するため、jpholidayは最新版にアップデートしてから使うのが鉄則。pip install -U jpholiday で最新化できます。⚠️

📚 Python日付処理を加速する厳選書籍&ツール

日付・時間の操作は実務で出番が多く、引き出しを増やすほど開発効率が上がります。手元に良書を置いておくと、つまずいたときの安心感が違います。

🌱 まずは基礎を体系的に:『スッキリわかるPython入門』

文法から標準ライブラリの使い方まで体系的に学べる定番書。datetimeを含めた基本機能の全体像が掴めます。

📖 実務で使いこなす:『Python実践入門』

標準ライブラリの活用法を深く学べる1冊。datetimeの周辺ライブラリやインポート時の落とし穴まで自然に身につきます。

📊 データ分析で時系列を極める:『Pythonによるデータ分析入門』

pandasの時系列処理は日付操作の応用編。日付処理に慣れたら、ぜひデータ分析の世界へ。

🤖 学んだ知識を即実用へ:『退屈なことはPythonにやらせよう』

日付処理は自動化スクリプトでも頻出。ファイル名への日付付与、定期処理、レポート生成など実用例の宝庫です。

⌨️ 長時間コーディングを支える相棒キーボード

日付処理の試行錯誤は意外とタイピングが多い作業。打鍵感が良く複数デバイス切替対応の一台があると、学習も実装も気持ちよく進みます。

❓ よくある質問(FAQ)

🤔 Q1. 「from datetime import datetime」がややこしいんだけど…

モジュール名とクラス名が同じため起きる混乱です。from datetime import datetime, date, time, timedelta, timezone のようにまとめてインポートしておくと、コードがスッキリします。慣れるまでは慎重に。📝

🤔 Q2. weekday()とisoweekday()の違いは?

weekday() は月曜=0〜日曜=6、isoweekday() は月曜=1〜日曜=7です。ISO8601規格に従いたい場合は isoweekday() を使うと自然です。

🤔 Q3. timedeltaで「月」や「年」の計算はできないの?

標準の timedelta は日・時・分・秒までしか扱えません。「3か月後」「1年前」のような月・年単位の計算には、外部ライブラリ dateutilrelativedelta を使うのが定番です。✨

🤔 Q4. タイムゾーンを指定しないとどうなる?

「naive(タイムゾーン情報なし)」なdatetimeになります。同じシステム内なら問題なく動きますが、海外ユーザー対応やDB保存などでは必ずタイムゾーン付き(aware)で扱うのが安全です。🛡️

🤔 Q5. jpholiday以外に祝日を扱う方法はある?

あります。workalendarholidays といったライブラリは、日本だけでなく世界各国の祝日に対応しています。グローバル対応するなら検討の価値ありです。🌍

🎯 まとめ:「時間を制する者がアプリを制す」

Pythonの datetime モジュールは、最初こそインポートがややこしく感じますが、datetimedatetimetimedeltatimezone の役割を整理すれば、見える景色がガラッと変わります。さらに jpholiday のような外部ライブラリを組み合わせれば、土日も祝日も含めた「実用的な休日判定」が一行で書けるようになります。🚀

大切なのは、丸暗記ではなく「やりたいことを言葉にしてから、対応する関数を探す」習慣を持つこと。「今日から3か月後」「日本時間で朝8時」「祝日かどうか」——あなたの頭の中の自然な問いに、Pythonは必ず答えてくれます。次のアプリ開発で、ぜひ今日学んだ引き出しを開いてみてください。💪

コメント

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