25

まず、私のタイムゾーンは CET/CEST です。CEST から CET (GMT+2 の DST から通常の GMT+1 に戻る) に変わる正確な瞬間は、常に 10 月の最後の日曜日の午前 3 時です。2010 年は 10 月 31 日午前 3 時でした。

ここで、次のことに注意してください。

>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)

上で説明したように、これは間違っています。

>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)

今、それは突然正しいです:/

これについてはすでにいくつかの質問があることは知っていますが、与えられた解決策は常に「ローカライズを使用する」ことですが、ここでの問題は、LocalTimezone がその方法を提供していないことです。

実際、ミリ秒単位のタイムスタンプがいくつかありますが、ローカル タイムゾーンの utcoffset が必要です (私だけでなく、プログラムを使用しているすべての人の)。これらの 1 つは 1288483950000 または Sun Oct 31 2010 02:12:30 GMT+0200 (CEST) のタイムゾーンです。

現在、日時オブジェクトを取得するために次のことを行っています。

datetime.datetime.fromtimestamp(int(int(millis)/1E3)) 

これにより、utcoffset を数分で取得できます。

-int(local_tnz.utcoffset(date).total_seconds()/60)

残念ながら、これは多くの場合間違っています:(。

何か案は?

注: 私は python3.2.4 を使用していますが、この場合は問題になるわけではありません。

編集:

@JamesHolderness のおかげで解決策が見つかりました。

def datetimeFromMillis(millis):
    return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))

def getTimezoneOffset(date):
    return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)

local_tz は tzlocal モジュールの tzlocal.get_localzone() と同じです。

4

3 に答える 3