初心者向け Python の time モジュール入門 — 時間の計測・フォーマット・演習付き

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() は便利ですが、経過時間の高精度計測単調増加が必要な場合、以下の関数を使います。

time.perf_counter()

高分解能の壁時計。スリープや他プロセス時間を含む「経過時間」を高精度に測るのに最適。ベンチマークに推奨。

time.process_time()

現在プロセスがCPUを使った時間のみを返す。I/O待ちやスリープは含まれない。CPU時間計測に便利。

time.monotonic()

単調増加(システム時計調整で戻らない)を保証するクロック。経過時間測定に安全。

例:処理時間を測る
start = time.perf_counter()
# --- 計測したい処理 ---
end = time.perf_counter()
print(f"処理にかかった時間: {end - start:.6f} 秒")

日時のフォーマットとパース(実用例)

strftime の代表的な書式
  • %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 と組み合わせることをおすすめします。