1

今日、私と何人かの同僚は、日時を非ローカル タイムゾーンのタイムスタンプに正しく変換しようとしていました。多くの議論の後、一般的な意味で、日時をタイムスタンプに正しく変換する方法についてはまだ確信が持てず、ユースケースでそれを行う方法について部分的にしか確信が持てませんでした: 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 つの方法で計算されます。

  1. time.mktime(dt.timetuple())
  2. time.mktime(dt.utctimetuple())
  3. calendar.timegm(dt.timetuple())
  4. 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()) を呼び出すことは通常正しい方法です。単純な現地時間でない限りです。わかりました、私はそれを処理できます...ただし、ローカルの単純な時間を他の単純な時間から明確にする方法がわかりません。これにより、任意の日時オブジェクトをタイムスタンプに正しく変換できなくなりますか? それは本当にそうですか、それとも何か不足していますか?

4

1 に答える 1

0

ローカルのナイーブ時間を他のナイーブ時間から明確にする方法がわかりません

丁度。ご存知のように、naive は「タイム ゾーン情報が添付されていない」ことを意味timegmするため、欠落している情報を推測する必要があり、結果は、naive の日時が UTC であると推測することを示しています。

コメントで述べたように、TZ が添付された時間はホットポテトのように扱う必要があります。入力を取得したらすぐに UTC に変換し、ユーザーに出力する直前にローカルに変換する必要があります。これにより、長期的には心痛を大幅に軽減できます。

于 2013-02-16T05:13:21.640 に答える