Pythonでcalendar.timegm()とtime.mktime()の違いを比較する方法
Pythonの日付・時刻関連の関数やモジュールは、特に明示されていない限り、すべてローカルタイムゾーン(現地時間)を前提として動作します。
この前提が、time.mktime()とcalendar.timegm()の挙動の違いを生み出しています。両者の違いは以下の通りです。
- time.mktime(): 引数に渡された時刻タプルをローカルタイムとして解釈します。
- calendar.timegm(): 引数に渡された時刻タプルをGMT/UTC(協定世界時)として解釈します。
同じタプルでも、タイムゾーンの解釈が異なるため、それぞれ別の時刻を表すことになります。そして、エポック(1970年1月1日0時0分0秒UTC)からの経過秒数はUTC基準で計算されるため、両関数は異なる値を返します。
返り値の差からタイムゾーンオフセットがわかる
2つの関数が返す値の差は、お使いの環境のローカルタイムゾーンのUTCからのオフセット(時差)と一致します。これを利用すれば、実行環境のタイムゾーン設定を確認することもできます。
サンプルコード
import calendar import time from datetime import datetime dt = datetime(2017, 12, 31) print(time.mktime(dt.timetuple())) print(calendar.timegm(dt.timetuple()))
実行結果
上記のコードを実行すると、次のような出力が得られます。
1514658600.0 1514678400
この例では、2つの値の差は19,800秒(5時間30分)です。これは、実行環境のタイムゾーンがUTC+5:30(インド標準時など)であることを示しています。つまり、datetime(2017, 12, 31)という同じ日時でも、ローカルタイムとして扱うか、UTCとして扱うかによって、エポックからの秒数が異なるというわけです。
使い分けのポイント
- ユーザーの現地時間を基準にUNIXタイムスタンプへ変換したい場合は
time.mktime() - タイムゾーンに依存せず、UTCとして一貫して処理したい場合は
calendar.timegm()
サーバー間やシステム間で日時データをやり取りする際は、タイムゾーンの解釈ミスによるバグを防ぐため、UTCベースのcalendar.timegm()を使うか、datetimeオブジェクトに明示的にタイムゾーン情報を持たせることをおすすめします。
-
Pythonで時系列データをプロットする方法をわかりやすく解説
Pythonのmatplotlibを使えば、時系列データ(日時を軸にしたデータ)を簡単にグラフ化できます。ここでは、datetimeオブジェクトを含むデータを折れ線グラフとして描画する基本的な手順を紹介します。 時系列プロットの基本手順 numpyを使用して、x軸(日時データ)とy軸(数値データ)を作成します。 plot()メソッドを使って、作成したx・yのデータをプロットします。 show()メソッドを実行して、図を画面に表示します。 コード例 以下のサンプルコードでは、2021年1月1日の0時から23時までの24個の日時データを生成し、それに対応するランダムな数値をy軸としてプロットし
-
Pythonで日付を比較する方法をわかりやすく解説
Pythonの日付型は、すべての比較演算子に対応しています。そのため、datetimeモジュールで日付オブジェクトを作成・操作している場合は、「<」「>」「<=」「>=」「==」といった演算子を、数値と同じ感覚で日付同士にそのまま適用できます。これにより、入力値の検証(バリデーション)や期間チェックなど、日付を比較する処理を非常にシンプルに実装できます。 コード例 from datetime import datetime from datetime import timedelta today = datetime.today() yesterday = today