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
を設定すると予想していましたが、設定しません。
datetime.fromtimestamp(ts)
は、「エポックからの秒数」を現地時間を表す単純なdatetimeオブジェクトに変換します。この場合、tzinfo
は常にNone
です。
ローカルタイムゾーンには、過去に異なるUTCオフセットがあった可能性があります。履歴タイムゾーンデータベースへのアクセスを提供する一部のシステムでは、fromtimestamp()
が考慮に入れる場合があります。
fromtimestamp()
で使用されるUTCオフセットを取得するには:
utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)
Pythonでのコンピューターのutcオフセットの取得 も参照してください。
Pythonドキュメント から:
classmethod
datetime
_.fromtimestamp
_( _timestamp, tz=None
_)
time.time()
によって返されるような、POSIXタイムスタンプに対応するローカルの日付と時刻を返します。オプションの引数tzがNone
であるか指定されていない場合、タイムスタンプはプラットフォームのローカルの日付と時刻に変換され、返されるdatetime
オブジェクトはナイーブ。それ以外のtzはクラス
tzinfo
サブクラスのインスタンスでなければならず、タイムスタンプはtzに変換されますタイムゾーン。この場合、結果はtz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))
と同等です。
あなたの質問に関連するこの説明の重要な部分は、タイムゾーンを指定しない場合、ローカルタイムゾーンを使用するだけでなく、結果はnaive。あなたはそれをawareにしたいようです。
これはPythonによって行われた特定の区別であり、 datetime documentation の一番上で説明されています。
必要なものがローカルタイムゾーンのawareであるdatetime
である場合は、 tzlocal ライブラリを試してください。その特定の問題に焦点を当てています。 この質問 もご覧ください。
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
お役に立てれば
変換するタイムスタンプのタイムゾーンがわかっている場合は、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>)