Python の標準ライブラリには、日時操作を支援する time および datetime モジュールが含まれています。これらは異なる抽象レベルで時間情報を扱い、用途に応じて使い分ける必要があります。
time モジュール:低レイヤーな時間表現
time モジュールは、システムレベルの時間操作に焦点を当てており、主に以下の三種類の形式で時間を表現します:
- Unix タイムスタンプ:1970年1月1日 00:00:00 UTC からの経過秒数(浮動小数点数)
- 構造化時間オブジェクト:
time.struct_time型のタプル風インスタンス(例:tm_year,tm_mon,tm_wdayなど) - フォーマット済み文字列:人間が読みやすい任意の文字列形式(例:
"2024-06-15 14:30:45")
これらの形式は相互に変換可能であり、構造化時間オブジェクトが中継ノードとして機能します。
タイムスタンプの取得と活用
import time
# 現在のUTC基準タイムスタンプ(秒単位+マイクロ秒)
current_epoch = time.time()
print(f"現在のタイムスタンプ: {current_epoch:.6f}") # 例: 1718452238.123456
構造化時間オブジェクトの生成と操作
# ローカルタイムゾーンでの現在時刻
local_struct = time.localtime()
print(f"ローカル時間: {local_struct.tm_year}年{local_struct.tm_mon}月{local_struct.tm_mday}日")
# UTC 時間(GMT と同一)
utc_struct = time.gmtime()
print(f"UTC時間: {utc_struct.tm_hour}時(ローカル比約8時間遅れ)")
# タイムスタンプから構造化オブジェクトへ変換
custom_struct = time.localtime(1718452238)
フォーマット変換の実装
構造化時間オブジェクトを任意の文字列形式に変換するには strftime() を使用します:
formatted = time.strftime("%Y/%m/%d %a %H:%M:%S", local_struct)
# 出力例: "2024/06/15 Sat 14:30:45"
# 特定の書式指定子の意味:
# %Y → 4桁西暦、%m → 月(01〜12)、%d → 日(01〜31)
# %a → 曜日の省略形(Sun)、%H → 24時間制時(00〜23)
# %M → 分(00〜59)、%S → 秒(00〜59)
文字列から構造化オブジェクトへの復元
raw_string = "2024/06/15 14:30:45"
parsed = time.strptime(raw_string, "%Y/%m/%d %H:%M:%S")
print(parsed.tm_wday) # 5 → 土曜日(0=月〜6=日)
時間差の計算
start = time.time()
# 何かの処理(例:time.sleep(2.5))
end = time.time()
elapsed_seconds = end - start
print(f"処理時間: {elapsed_seconds:.3f}秒")
datetime モジュール:高レベルな日時操作
datetime は、より直感的で柔軟なクラス設計を提供し、主に以下の4つの主要クラスで構成されます:
date:年・月・日のみを保持time:時・分・秒・マイクロ秒のみを保持(タイムゾーン対応可)datetime:dateとtimeを統合した完全な日時情報timedelta:時間の差分(加減算に使用)
date クラスの活用
from datetime import date
# 今日の日付
today = date.today()
print(f"本日: {today.isoformat()}") # 例: "2024-06-15"
# 特定日付の生成
birth = date(1992, 8, 24)
print(f"誕生日: {birth}")
# タイムスタンプから日付生成
from_timestamp = date.fromtimestamp(1718452238)
# 属性アクセス
print(f"年={birth.year}, 月={birth.month}, 日={birth.day}")
# 日付の更新(不変オブジェクトのため新規インスタンス生成)
next_year = birth.replace(year=birth.year + 1)
time クラスの活用
from datetime import time
# 時刻の生成(マイクロ秒も指定可能)
meeting = time(15, 45, 30, 123456)
print(f"会議開始: {meeting}")
# 時刻属性の抽出
print(f"時={meeting.hour}, 分={meeting.minute}, 秒={meeting.second}")
# 時刻の置換
rescheduled = meeting.replace(hour=16, minute=0)
datetime クラスの統合的操作
from datetime import datetime
# 現在時刻(ローカル)
now_local = datetime.now()
print(f"現地時間: {now_local}")
# UTC 時刻
now_utc = datetime.utcnow()
print(f"UTC時間: {now_utc}")
# 文字列から解析
parsed_dt = datetime.strptime("2024-06-15T15:45:30", "%Y-%m-%dT%H:%M:%S")
# タイムスタンプ変換
ts = now_local.timestamp() # float(秒単位)
# 文字列フォーマット
formatted_dt = now_local.strftime("%B %d, %Y at %I:%M %p")
# 出力例: "June 15, 2024 at 03:45 PM"
timedelta を用いた期間演算
from datetime import datetime, timedelta
# 5日後、3時間前などの差分定義
future = datetime.now() + timedelta(days=5, hours=3)
past = datetime.now() - timedelta(weeks=2, minutes=15)
# 二つの日時の差を取得
start = datetime(2024, 6, 1, 9, 0)
end = datetime(2024, 6, 15, 17, 30)
duration = end - start
print(f"期間: {duration.days}日 {duration.seconds // 3600}時間")