web-dev-qa-db-ja.com

datetime.datetime.fromtimestamp()によって使用されるタイムゾーンを取得します

POSIXを変換するためにdatetime.datetime.fromtimestamp()によって使用されるタイムゾーン(UTCオフセットまたはそのオフセットを持つdatetime.timezoneインスタンス)を取得することは可能ですか? timestamp(エポックからの秒数)からdatetimeオブジェクトへ?

datetime.datetime.fromtimestamp()はPOSIXタイムスタンプを単純なdatetimeオブジェクト(つまりtzinfoなし)に変換しますが、システムのロケールを使用してローカルタイムゾーンとUTCオフセットに調整します。その時に有効でした。

たとえば、UTC 2008-12-27真夜中UTC(エポックから40 * 356 * 86400秒)の日付を使用します。

>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)

そのタイムスタンプは、午前1時にdatetimeオブジェクトに変換されます(この時点ではCET/CESTタイムゾーンでした)。 100日後、これが結果です。

>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)

午前2時です。これは、それまでにDSTがアクティブだったためです。

datetime.datetime.fromtimestamp()が、返されるtzinfoインスタンスで使用するdatetimeを設定すると予想していましたが、設定しません。

26
Feuermurmel

datetime.fromtimestamp(ts)は、「エポックからの秒数」を現地時間を表す単純なdatetimeオブジェクトに変換します。この場合、tzinfoは常にNoneです。

ローカルタイムゾーンには、過去に異なるUTCオフセットがあった可能性があります。履歴タイムゾーンデータベースへのアクセスを提供する一部のシステムでは、fromtimestamp()が考慮に入れる場合があります。

fromtimestamp()で使用されるUTCオフセットを取得するには:

utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

Pythonでのコンピューターのutcオフセットの取得 も参照してください。

20
jfs

Pythonドキュメント から:

classmethoddatetime_.fromtimestamp_ _timestamp, tz=None_

time.time()によって返されるような、POSIXタイムスタンプに対応するローカルの日付と時刻を返します。オプションの引数tzNoneであるか指定されていない場合、タイムスタンプはプラットフォームのローカルの日付と時刻に変換され、返されるdatetimeオブジェクトはナイーブ。

それ以外のtzはクラスtzinfoサブクラスのインスタンスでなければならず、タイムスタンプはtzに変換されますタイムゾーン。この場合、結果はtz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))と同等です。

あなたの質問に関連するこの説明の重要な部分は、タイムゾーンを指定しない場合、ローカルタイムゾーンを使用するだけでなく、結果はnaive。あなたはそれをawareにしたいようです。

これはPythonによって行われた特定の区別であり、 datetime documentation の一番上で説明されています。

必要なものがローカルタイムゾーンのawareであるdatetimeである場合は、 tzlocal ライブラリを試してください。その特定の問題に焦点を当てています。 この質問 もご覧ください。

17

time.gmtimeを使用すると、この前の回答で説明したようにタイムゾーンを抽出できます: PythonでシステムのTZ情報を取得しますか?

>>> from __future__ import print_function
>>> from time import gmtime, strftime
>>> print(strftime("%z", gmtime()))
-0600

Python-2.7とpython-3.3の両方でCSTラップトップの-06:00を出力します。localtime()を使用してローカル時間構造体を取得することもできます。

>>> from __future__ import print_function
>>> from time import localtime
>>> lt = localtime()
>>> print(lt.tm_zone)
"CDT"
>>> print(lt.tm_gmtoff/(60*60))
-5.0
>>> print(lt.tm_gmtoff/(60*60) - (1 if lt.tm_isdst == 1 else 0)) # Adjusted for DST
-6.0

お役に立てれば

2
AChampion

変換するタイムスタンプのタイムゾーンがわかっている場合は、fromtimestampを呼び出している間にタイムゾーンを送信できます。

>>> from datetime import datetime
>>> import pytz
>>>
>>> datetime.fromtimestamp(1562684265, pytz.timezone("Europe/Stockholm"))
datetime.datetime(2019, 7, 9, 16, 57, 45, tzinfo=<DstTzInfo 'Europe/Stockholm' CEST+2:00:00 DST>)
>>>
>>> datetime.fromtimestamp(1562684265, pytz.timezone("UTC"))
datetime.datetime(2019, 7, 9, 14, 57, 45, tzinfo=<UTC>)
1
Emil Stenström