Python
 Computer >> コンピューター >  >> プログラミング >> Python

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オブジェクトに明示的にタイムゾーン情報を持たせることをおすすめします。

  1. Pythonで時系列データをプロットする方法をわかりやすく解説

    Pythonのmatplotlibを使えば、時系列データ(日時を軸にしたデータ)を簡単にグラフ化できます。ここでは、datetimeオブジェクトを含むデータを折れ線グラフとして描画する基本的な手順を紹介します。 時系列プロットの基本手順 numpyを使用して、x軸(日時データ)とy軸(数値データ)を作成します。 plot()メソッドを使って、作成したx・yのデータをプロットします。 show()メソッドを実行して、図を画面に表示します。 コード例 以下のサンプルコードでは、2021年1月1日の0時から23時までの24個の日時データを生成し、それに対応するランダムな数値をy軸としてプロットし

  2. Pythonで日付を比較する方法をわかりやすく解説

    Pythonの日付型は、すべての比較演算子に対応しています。そのため、datetimeモジュールで日付オブジェクトを作成・操作している場合は、「<」「>」「<=」「>=」「==」といった演算子を、数値と同じ感覚で日付同士にそのまま適用できます。これにより、入力値の検証(バリデーション)や期間チェックなど、日付を比較する処理を非常にシンプルに実装できます。 コード例 from datetime import datetime from datetime import timedelta today = datetime.today() yesterday = today