pytz:タイムゾーン間で変換するときにノーマライズが必要なのはなぜですか?
質問
あまり完全ではない pytzのドキュメントを読んでいますが、その一部を理解するのにこだわっています。
タイムゾーン間の変換も特別な注意が必要です。また、変換が正しいことを確認するためにnormalizeメソッドを使用する必要があります。
>>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899))
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 EST+1100'
>>> utc_dt2 = utc.normalize(au_dt.astimezone(utc))
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
normalize
を使用して、なしでこの例を試しましたが、まったく同じことがわかりました。私の意見では、この例では、異なるタイムゾーンの datetime
オブジェクト間で変換するときに normalize
を使用する必要があるなぜを説明していません。
normalize
を使用しない場合に結果が異なる例(上記のものなど)を教えてください。
ありがとう
解決
pytzドキュメントから:
さらに、DSTの境界を越える現地時間で日付計算を実行すると、結果が誤ったタイムゾーンになる可能性があります(つまり、2002-10-27 1:00 ESTから1分を差し引くと2002-10-正しい2002-10-27 1:59 EDTではなく27 0:59 EST)。これを修正するためにnormalize()メソッドが提供されています。残念ながら、これらの問題はPython datetime実装を変更しないと解決できません。
他のヒント
ドキュメントでは、DSTの問題の回避策としてノーマライズが使用されていると述べています。
さらに、DSTの境界を越える現地時間で日付計算を実行すると、結果が誤ったタイムゾーンになる可能性があります(つまり、2002-10-27 1:00 ESTから1分を差し引くと2002-10-正しい2002-10-27 1:59 EDTではなく27 0:59 EST)。これを修正するためにnormalize()メソッドが提供されています。
したがって、DSTに関連するいくつかのエッジケースを修正するために使用されます。 DSTタイムゾーン(UTCなど)を使用していない場合、ノーマライズを使用する必要はありません。
使用しない場合、特定の状況下でコンバージョンが1時間オフになる可能性があります。