今日、私と何人かの同僚は、日時を非ローカル タイムゾーンのタイムスタンプに正しく変換しようとしていました。多くの議論の後、一般的な意味で、日時をタイムスタンプに正しく変換する方法についてはまだ確信が持てず、ユースケースでそれを行う方法について部分的にしか確信が持てませんでした: America/New_York の日時インスタンスpytz のタイムゾーン。
それで、ドキュメントを読んで論理的に推論しようとしてもどこにも行かなかったので、いくつかの順列を実行して経験的に理解しようと考えました。
入力データは次のとおりです。
pst = pytz.timezone('America/Los_Angeles')
est = pytz.timezone('America/New_York')
utc = pytz.timezone('UTC')
epoch = int(time.time())
# local time for me is Pacific
local_naive = datetime.datetime.fromtimestamp(epoch)
local_aware = datetime.datetime.fromtimestamp(epoch, pst)
est_aware = datetime.datetime.fromtimestamp(epoch, est)
utc_naive = datetime.datetime.utcfromtimestamp(epoch)
utc_aware = datetime.datetime.fromtimestamp(epoch, utc)
結果は次の 4 つの方法で計算されます。
- time.mktime(dt.timetuple())
- time.mktime(dt.utctimetuple())
- calendar.timegm(dt.timetuple())
- calendar.timegm(dt.utctimetuple())
それらのいくつかは本質的に無意味であることを認識していますが、私は完全にしようとしていました:)。
そして、これが出力です。そのdiff=
部分は、正しくない変換を表示するのに役立ちます。
now epoch : 1342671099
est aware mktime(timetuple) : 1342681899 diff=-10800
local aware mktime(timetuple) : 1342671099 diff=0
local naive mktime(timetuple) : 1342671099 diff=0
utc aware mktime(timetuple) : 1342699899 diff=-28800
utc naive mktime(timetuple) : 1342696299 diff=-25200
est aware mktime(utctimetuple): 1342699899 diff=-28800
local aware mktime(utctimetuple): 1342699899 diff=-28800
local naive mktime(utctimetuple): 1342674699 diff=-3600
utc aware mktime(utctimetuple): 1342699899 diff=-28800
utc naive mktime(utctimetuple): 1342699899 diff=-28800
est aware timegm(timetuple) : 1342656699 diff=14400
local aware timegm(timetuple) : 1342645899 diff=25200
local naive timegm(timetuple) : 1342645899 diff=25200
utc aware timegm(timetuple) : 1342671099 diff=0
utc naive timegm(timetuple) : 1342671099 diff=0
est aware timegm(utctimetuple): 1342671099 diff=0
local aware timegm(utctimetuple): 1342671099 diff=0
local naive timegm(utctimetuple): 1342645899 diff=25200
utc aware timegm(utctimetuple): 1342671099 diff=0
utc naive timegm(utctimetuple): 1342671099 diff=0
この出力からわかることから、一般的に、calendar.timegm(dt.utctimetuple()) を呼び出すことは通常正しい方法です。単純な現地時間でない限りです。わかりました、私はそれを処理できます...ただし、ローカルの単純な時間を他の単純な時間から明確にする方法がわかりません。これにより、任意の日時オブジェクトをタイムスタンプに正しく変換できなくなりますか? それは本当にそうですか、それとも何か不足していますか?