0

日時をUTCのタイムスタンプに変換するのに問題があります。

TS_FMT = '%Y-%m-%d %H:%M:%S'
t = time.strptime('2012-11-20 00:00:00', TS_FMT)
dt = datetime.datetime(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min,
                       t.tm_sec, tzinfo=pytz.timezone('America/Los_Angeles'))

この時点で、dtは「正しい」状態にあります。

datetime.datetime(2012, 11, 20, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

しかし、これを行う:

>>> time.mktime(dt.timetuple())
1353369600.0

これは、11/19/12 @ 6:00:00 pm ESTです。これは、タイムスタンプがPSTではなくUTCタイムゾーンを想定して作成されたことを意味します。

日時のタイムゾーンを尊重するタイムスタンプを取得するには、ここで何をしますか?

4

2 に答える 2

2
from datetime import datetime
import pytz
import calendar 
calendar.timegm(pytz.timezone('America/Los_Angeles').localize(datetime.strptime('2012-11-20 00:00:00', '%Y-%m-%d %H:%M:%S')).utctimetuple())

戻り値

1353398400
于 2012-12-21T11:01:12.243 に答える
0

time.mktimeは、UTC ではなく、システムの現地時間に相対的です。2 つのタイムゾーン対応の datetime オブジェクト間の時間差としてエポックを計算することで、正しい値を取得できます。http://docs.python.org/2/library/datetime.htmlから:

日時オブジェクトには、「naive」と「aware」の 2 種類があります。

認識オブジェクトは、タイム ゾーンや夏時間情報など、適用可能なアルゴリズムおよび政治的な時間調整について十分な知識を持っており、他の認識オブジェクトとの相対的な位置を特定できます。認識オブジェクトは、解釈できない特定の瞬間を表すために使用されます [1]。

単純なオブジェクトには、他の日付/時刻オブジェクトとの相対位置を明確に特定するための十分な情報が含まれていません。単純なオブジェクトが協定世界時 (UTC)、現地時間、または他のタイムゾーンの時間を表すかどうかは、純粋にプログラム次第です。特定の数値がメートル、マイル、または質量を表すかどうかはプログラム次第です。単純なオブジェクトは、現実のいくつかの側面を無視するという犠牲を払って、理解しやすく、操作しやすいです。

これは、次のことを試みることによって例示されます

>>> dt
datetime.datetime(2012, 11, 20, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
>>> dt - datetime.datetime(1970, 1, 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't subtract offset-naive and offset-aware datetimes
>>> (dt - datetime.datetime(1970, 1, 1, tzinfo=pytz.timezone('America/Los_Angeles'))).total_seconds()
1353369600.0
>>> (dt - datetime.datetime(1970, 1, 1, tzinfo=pytz.timezone('UTC'))).total_seconds()
1353398400.0
于 2012-12-21T11:35:36.843 に答える