Pythonでは、時間情報の取得・変換・演算を行うために、timeおよびdatetimeという2つの標準ライブラリが提供されています。両者は標準搭載であり、追加インストールは不要です。ただし、その設計思想と使用目的には明確な違いがあります。
timeモジュール:低レイヤーな時刻操作
timeはC言語で実装された軽量なモジュールで、主にシステム時刻の取得や高精度な計測に適しています。基本的な時間表現は3種類です:
- Unixタイムスタンプ(浮動小数点数):1970年1月1日00:00:00 UTCからの経過秒数
- struct_time(名前付きタプル):年・月・日・時・分・秒など9要素を持つ構造体
- フォーマット済み文字列(例:
"Mon Apr 1 14:22:05 2024")
以下は代表的な変換パターンです:
# タイムスタンプ → struct_time(ローカル時刻)
local_tuple = time.localtime(1712068925.123)
# struct_time → タイムスタンプ
ts = time.mktime(local_tuple)
# タイムスタンプ → フォーマット文字列
formatted = time.ctime(1712068925.123) # "Mon Apr 1 14:22:05 2024"
# struct_time → カスタムフォーマット文字列
custom = time.strftime("%Y/%m/%d %H:%M", local_tuple)
# 文字列 → struct_time
parsed = time.strptime("2023/12/25 09:30", "%Y/%m/%d %H:%M")
実行時間の計測など、パフォーマンスが重要な用途では、time.time()による差分計算が最も効率的です:
start = time.time()
# 処理ブロック
result = sum(range(10**6))
elapsed = time.time() - start
print(f"処理時間: {elapsed:.4f}秒")
datetimeモジュール:高レベルな日付・時刻操作
datetimeはtimeを基盤に構築された、オブジェクト指向の時間処理ライブラリです。主なクラスはdatetime、date、time、および期間を表すtimedeltaです。
基本的なインスタンス生成例:
from datetime import datetime, date, time, timedelta
# 現在の日時
now = datetime.now()
# 現在の日付のみ
today = date.today()
# 指定日時の作成
meeting = datetime(2024, 5, 15, 10, 30, 0)
# 日付と時刻の分離
only_date = meeting.date() # dateオブジェクト
only_time = meeting.time() # timeオブジェクト
文字列との相互変換にはstrftime/strptimeメソッドを使います:
# datetime → 文字列
iso_str = now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] # ミリ秒まで
# 文字列 → datetime
parsed_dt = datetime.strptime("2024-04-01T08:45:30", "%Y-%m-%dT%H:%M:%S")
# ISO形式の簡易変換(推奨)
iso_parsed = datetime.fromisoformat("2024-04-01T08:45:30.123")
日付演算にはtimedeltaが不可欠です:
# 3日後の日付
future = now + timedelta(days=3)
# 2時間15分前の時刻
past = now - timedelta(hours=2, minutes=15)
# 2つの日時の差(timedeltaオブジェクト)
diff = future - now # timedelta(days=3)
比較も直感的です:
if now > meeting:
print("会議はすでに終了しています")
elif now == meeting:
print("会議が始まりました")
選択の指針
- 計測・高速処理:
time.time()やtime.perf_counter()を使用。マイクロ秒精度が必要なベンチマークにも対応。 - 日付計算・人間向け表示:
datetimeが最適。月単位の加算、月末判定、タイムゾーン対応(zoneinfoと組み合わせ)など、業務ロジックに必要な機能が充実。 - タイムゾーン対応:Python 3.9以降では
zoneinfoモジュールとdatetimeを併用し、IANAタイムゾーンデータベースに基づく正確な変換が可能。
例えば、東京とロンドンの同時刻を扱う場合:
from zoneinfo import ZoneInfo
from datetime import datetime
tokyo = datetime.now(ZoneInfo("Asia/Tokyo"))
london = tokyo.astimezone(ZoneInfo("Europe/London"))
print(f"東京: {tokyo}, ロンドン: {london}")