予約システム、ログ集計、リマインダー、ポイント有効期限、定期実行スクリプト——アプリを作ろうとすると、必ずと言っていいほど「日付と時間」を扱う場面に出会います。📅
Pythonには標準ライブラリとして datetime モジュールが用意されており、これを使いこなせるだけで、日々のコーディングの幅がぐっと広がります。今日からあなたのコードに「時間を操る力」を加えていきましょう。⏰
Pythonの datetime モジュールには大きく3つのオブジェクトがあります。役割を整理しておくと、後の理解がスムーズです。
ややこしいのですが、モジュール名もdatetime、その中のクラス名もdatetimeです。import文を書くときは混乱しないように気をつけましょう。✍️
from datetime import date
t = date.today()
print(t) # 例: 2025-06-13
date.today() で今日の日付の dateオブジェクト が返ってきます。文字列ではなくオブジェクトなので、後で計算や属性アクセスができます。👍
dateオブジェクトは year・month・day プロパティで各要素にアクセスできます。曜日を知りたいときは 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 オブジェクトを使います。引数は順番に「時・分・秒・マイクロ秒」。指定しなかった部分は自動的に0が入ります。
from datetime import time
t = time(14, 30)
print(t.hour, t.minute, t.second, t.microsecond)
# 14 30 0 0
from datetime import datetime
now = datetime.now()
print(now) # 例: 2025-06-13 14:23:05.123456
datetime.now() はマイクロ秒まで含めた現在時刻を返します。プロパティで year・month・day・hour・minute・second・microsecond にそれぞれアクセスできます。
引数は「年・月・日・時・分・秒・マイクロ秒」の順。日付の部分(年月日)は省略できませんが、時間以降は省略可能で、省略した部分は0になります。
from datetime import datetime
d = datetime(2020, 12, 25, 14, 11)
print(d) # 2020-12-25 14:11:00
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
引数は days・hours・minutes・seconds・microseconds・weeks など。秒単位の差分を取って時間に変換するときは 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時間進んでいる」というタイムゾーン情報。これがあるかないかで、同じ表示でも内部的な扱いがまったく違います。🛡️
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 で最新化できます。⚠️ 日付・時間の操作は実務で出番が多く、引き出しを増やすほど開発効率が上がります。手元に良書を置いておくと、つまずいたときの安心感が違います。
文法から標準ライブラリの使い方まで体系的に学べる定番書。datetimeを含めた基本機能の全体像が掴めます。
標準ライブラリの活用法を深く学べる1冊。datetimeの周辺ライブラリやインポート時の落とし穴まで自然に身につきます。
pandasの時系列処理は日付操作の応用編。日付処理に慣れたら、ぜひデータ分析の世界へ。
日付処理は自動化スクリプトでも頻出。ファイル名への日付付与、定期処理、レポート生成など実用例の宝庫です。
日付処理の試行錯誤は意外とタイピングが多い作業。打鍵感が良く複数デバイス切替対応の一台があると、学習も実装も気持ちよく進みます。
モジュール名とクラス名が同じため起きる混乱です。from datetime import datetime, date, time, timedelta, timezone のようにまとめてインポートしておくと、コードがスッキリします。慣れるまでは慎重に。📝
weekday() は月曜=0〜日曜=6、isoweekday() は月曜=1〜日曜=7です。ISO8601規格に従いたい場合は isoweekday() を使うと自然です。
標準の timedelta は日・時・分・秒までしか扱えません。「3か月後」「1年前」のような月・年単位の計算には、外部ライブラリ dateutil の relativedelta を使うのが定番です。✨
「naive(タイムゾーン情報なし)」なdatetimeになります。同じシステム内なら問題なく動きますが、海外ユーザー対応やDB保存などでは必ずタイムゾーン付き(aware)で扱うのが安全です。🛡️
あります。workalendar や holidays といったライブラリは、日本だけでなく世界各国の祝日に対応しています。グローバル対応するなら検討の価値ありです。🌍
Pythonの datetime モジュールは、最初こそインポートがややこしく感じますが、date・time・datetime・timedelta・timezone の役割を整理すれば、見える景色がガラッと変わります。さらに jpholiday のような外部ライブラリを組み合わせれば、土日も祝日も含めた「実用的な休日判定」が一行で書けるようになります。🚀
大切なのは、丸暗記ではなく「やりたいことを言葉にしてから、対応する関数を探す」習慣を持つこと。「今日から3か月後」「日本時間で朝8時」「祝日かどうか」——あなたの頭の中の自然な問いに、Pythonは必ず答えてくれます。次のアプリ開発で、ぜひ今日学んだ引き出しを開いてみてください。💪