web-dev-qa-db-ja.com

python datetimeをタイムスタンプに変換し、UTCに戻すには、依然としてローカルタイムゾーンが使用されます

私はUTCタイムスタンプを提供するコードで作業しており、適切な日時に変換したいです。残念ながら、pytzで単純なケースをテストすると、datetimeに6時間が追加されます(UTCに対するCSTオフセット)。他のタイムゾーンの差も計算しているため、タイムゾーンデータを正確に保つ必要があります。 UTCタイムスタンプをUTC日時に変換する理由と方法はありますか?

In [1]: import pytz

In [2]: from datetime import datetime

In [3]: import time

In [4]: datetime.fromtimestamp(time.mktime(datetime(7,1,1, tzinfo=pytz.UTC).timetuple()), tz=pytz.UTC)
Out[4]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)

In [5]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()), tz=pytz.UTC)
Out[5]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)

In [6]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()))
Out[6]: datetime.datetime(2007, 1, 1, 0, 0)
30
aterrel

うーん、私はここで答えを見つけました: nix時間に変換するときにタイムゾーン(UTC)を指定する方法?(Python)

In [101]: ts = calendar.timegm(datetime(2010, 7, 1, tzinfo=pytz.utc).timetuple())

In [102]: datetime.fromtimestamp(ts, tz=pytz.utc)
Out[102]: datetime.datetime(2010, 7, 1, 0, 0, tzinfo=<UTC>)
19
aterrel

UTCで「エポックからの秒数」のタイムスタンプから時刻を表す単純なdatetimeオブジェクトを取得するには:

from datetime import datetime

utc_dt = datetime.utcfromtimestamp(ts)

UTCタイムゾーンの認識されたdatetimeオブジェクトを取得する場合:

import pytz

aware_utc_dt = utc_dt.replace(tzinfo=pytz.utc)

他のタイムゾーンに変換するには:

tz = pytz.timezone('America/Montreal')
dt = aware_utc_dt.astimezone(tz)

タイムスタンプを指定されたタイムゾーンの認識された日時オブジェクトに直接変換するには:

dt = datetime.fromtimestamp(ts, tz)
81
jfs

米国のCSTタイムゾーンまたはそれに相当する場所にいるのでしょうか?

ローカル時刻が2007年1月1日の午前0時のUTCの時刻を示しているように見えます。

1
Olaf