time モジュールは、UNIXタイムスタンプや待機(スリープ)、時刻のフォーマット/パースなど 「時間」を扱うための基礎的な道具箱 です。
この記事では初心者向けに、よく使う関数をやさしく解説し、実践的なコード例を多数示します。
最後に学習確認用の演習問題とその解答例も付けています。
日付の高度な操作(タイムゾーンや日時の加減算の詳細)には datetime モジュールや外部ライブラリ(pytz / zoneinfo / dateutil)を併用するのが実務では推奨されますが、ここでは time モジュールの基本に集中します。
time モジュールの基本概念
Python標準ライブラリの一部であるtimeモジュールは、時間を扱う機能を提供します。
timeモジュールを使用するには、はじめに import で timeモジュール を読み込む必要があります。
import time
UNIXタイム(エポック時間)という、1970年1月1日00:00:00 UTC からの経過秒数を表す連続した数値(浮動小数点)をよく扱います。time.time() が返す値がこれです。
ローカル時刻とUTCで localtime() がローカル(システム設定)に合わせた構造体時刻を返し、gmtime() は協定世界時(UTC)の構造体時刻を返します。
文字列 ⇄ 構造体時刻 ⇄ タイムスタンプ の相互変換が主な使いどころです。
基本的によく使う関数と例
time.time() — 現在のタイムスタンプ(秒)
ts = time.time()
print("タイムスタンプ(秒):", ts) # 例: 1692000000.123456
用途として、ログやDBに保存する「瞬間」を表します。
経過時間の簡易測定にも使えますが、精度や単調性(時計が戻る可能性)に注意が必要です。
time.sleep(secs) — 指定秒だけ待つ(ブロッキング)
print("待機開始")
time.sleep(2.5) # 2.5秒間停止
print("待機終了")
用途として、APIのレート制御、簡易な遅延、UIデモなどです。
メインスレッドをブロックするので GUI や並列処理では注意が必要です。
time.ctime([secs]) — タイムスタンプを簡易な文字列に
print(time.ctime()) # 現在時刻の文字列
print(time.ctime(0)) # 'Thu Jan 1 09:00:00 1970'(タイムゾーンにより表示は変わる)
time.localtime([secs]) / time.gmtime([secs]) — 構造体時刻(struct_time)
t = time.localtime()
print(t) # struct_time(tm_year=..., tm_mon=..., ...)
print(t.tm_year, t.tm_mon) # 年・月にアクセス
time.strftime(format, struct_time) — struct_time → 文字列
now = time.localtime()
print(time.strftime('%Y-%m-%d %H:%M:%S', now)) # 例: 2025-08-15 14:30:00
time.strptime(string, format) — 文字列 → struct_time
s = "2025-08-15 14:30:00"
t = time.strptime(s, '%Y-%m-%d %H:%M:%S')
print(t) # struct_time に変換
time.mktime(struct_time) — struct_time → タイムスタンプ(ローカル時刻基準)
t = time.localtime()
timestamp = time.mktime(t)
精度・計測用の関数(重要)
time.time() は便利ですが、経過時間の高精度計測や単調増加が必要な場合、以下の関数を使います。
高分解能の壁時計。スリープや他プロセス時間を含む「経過時間」を高精度に測るのに最適。ベンチマークに推奨。
現在プロセスがCPUを使った時間のみを返す。I/O待ちやスリープは含まれない。CPU時間計測に便利。
単調増加(システム時計調整で戻らない)を保証するクロック。経過時間測定に安全。
例:処理時間を測る
start = time.perf_counter()
# --- 計測したい処理 ---
end = time.perf_counter()
print(f"処理にかかった時間: {end - start:.6f} 秒")
日時のフォーマットとパース(実用例)
- %Y 年(4桁)
- %m 月(02)
- %d 日
- %H 時(24h)
- %M 分
- %S 秒
- %z UTCオフセット(注意:time の struct_time は tz 情報を持たない場合がある)
例:ログに ISO 形式を使う
log_ts = time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime())
print(f"[{log_ts}] メッセージ")
注意:ローカルタイムとUTCの違いに気をつけ、明示的に UTC を使う場合は time.gmtime() を使い、Z を付けるなどで表記を明確にします。
実用的な応用例
簡易リトライで指数バックオフ(例)
import time
import random
def unreliable_action():
if random.random() < 0.8:
raise RuntimeError("失敗")
return "成功"
max_tries = 5
for i in range(1, max_tries+1):
try:
print("試行", i)
print(unreliable_action())
break
except RuntimeError as e:
wait = 2 ** (i-1) # 1,2,4,8,...
print(f"失敗: {e}, {wait}s 待って再試行します")
time.sleep(wait)
else:
print("すべての試行に失敗しました")
処理のタイムアウト(簡易版)
threading や signal を使う方が堅牢ですが、簡易的に time でループ制御する例です。
import time
timeout_seconds = 10
start = time.time()
while True:
# 何らかのポーリング処理
if time.time() - start > timeout_seconds:
raise TimeoutError("タイムアウト")
time.sleep(0.5)
ベストプラクティスと注意点
- 日付処理の棲み分け
time はタイムスタンプや軽量なフォーマット/パースに適する。カレンダー操作やタイムゾーン対応、日付の加減算には datetime を使う。 - 単調時計を使う
経過時間(タイマー/ベンチ)には time.perf_counter() または time.monotonic() を使う。time.time() はNTPやシステム時刻変更に影響される。 - スリープはブロッキング
time.sleep() は呼び出しスレッドを停止する。非同期コードでは asyncio.sleep() を使う。 - ローカル時刻の扱い
ログや外部APIに時刻を渡すときは、タイムゾーンを明示(UTCで統一する等)するのが安全。 - 浮動小数点の精度
UNIXタイムは浮動小数点で表現されるため、超長期間の精度やナノ秒単位の精密な比較などには注意。
演習問題
問題1(基礎)
現在時刻の UNIX タイムスタンプを取得し、小数点以下を切り捨てて整数として表示するコードを書け。
問題2(基礎)
time.sleep を使って、1秒ごとに「カウントダウン」を3秒分(3,2,1)表示するプログラムを書け。
問題3(中級)
処理の実行時間を time.perf_counter() を使って計測し、処理にかかった秒数を小数点以下6桁で表示する関数 measure(func, *args, **kwargs) を作れ。関数は func の結果をそのまま返し、同時に経過時間を標準出力に出すこと。
問題4(中級)
文字列 “2025/08/15 14:30:00” を time.strptime で構造体時刻に変換し、UNIXタイムスタンプ(秒)に変換して表示するコードを書け。
問題5(応用)
失敗率 70% の関数 unstable() がある。最大3回までリトライし、リトライ間隔は 0.5 秒 → 1 秒 → 2 秒 と倍増する(指数バックオフ)実装を time.sleep() を使って作れ。成功したら結果を表示、3回失敗したら RuntimeError を投げること。
問題6(応用)
time.localtime() で得た被演算結果から、YYYY-MM-DD 形式の文字列を返す関数 date_string() を作れ(引数は省略可で、省略時は現在日付を返す)。
演習:解答例(参考実装)
解答1
import time
ts = int(time.time()) # 小数点以下切り捨て
print(ts)
解答2
import time
for i in range(3, 0, -1):
print(i)
time.sleep(1)
print("開始!")
解答3
import time
def measure(func, *args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
end = time.perf_counter()
elapsed = end - start
print(f"経過時間: {elapsed:.6f} 秒")
return result
# 使い方例
def heavy_task(n):
s = 0
for i in range(n):
s += i*i
return s
res = measure(heavy_task, 1000000)
解答4
import time
s = "2025/08/15 14:30:00"
t = time.strptime(s, "%Y/%m/%d %H:%M:%S")
timestamp = time.mktime(t) # ローカルタイム基準のUNIXタイム
print(int(timestamp))
解答5
import time
import random
def unstable():
# 70% で失敗をシミュレート
if random.random() < 0.7:
raise RuntimeError("失敗")
return "成功"
def retry_unstable(max_tries=3):
wait = 0.5
for i in range(1, max_tries+1):
try:
return unstable()
except RuntimeError as e:
if i == max_tries:
raise
print(f"試行{i}失敗: {e}. {wait}秒後に再試行します")
time.sleep(wait)
wait *= 2
# 実行例
try:
print(retry_unstable())
except RuntimeError:
print("すべての試行に失敗しました")
解答6
import time
def date_string(t=None):
if t is None:
t = time.localtime()
return time.strftime("%Y-%m-%d", t)
print(date_string()) # 例: "2025-08-15"
# 任意のstruct_timeを渡すことも可能:
# print(date_string(time.localtime(0)))
まとめと次のステップ
time モジュールは「時間」を扱うための基礎的かつ軽量なツール群を提供します。
ログのタイムスタンプ、簡易な待機、処理時間の測定、文字列と時刻の相互変換など日常的に役立ちます。
より高度な日時操作(タイムゾーン対応、日時の加減算、カレンダー演算)を行う場合は datetime モジュールや zoneinfo / pytz、dateutil と組み合わせることをおすすめします。