3

DB からの辞書があり、create_dt と install_ts が一致することがわかっています。

untimed = {'install_id': 399142,  'create_dt': datetime.datetime(2013, 7, 7, 0, 33, 2), 'install_ts': 1373157182}

そして、次のコードを実行するとQAですべてが正しい

>>(mktime(untimed['create_dt'].timetuple()) - untimed['install_ts']) / 3600
0.0

しかし、ラップトップでローカルに実行すると、(ローカルで私は PST にいます)

>>(mktime(untimed['create_dt'].timetuple()) - untimed['install_ts']) / 3600
7.0

同じタイムスタンプを取得できないのはなぜですか? create_dt が UTC であることはわかっていますが、ローカルでは強制的に PST (-700) になっています。

注:問題をこれに絞り込みましたが、完全な問題は、試したときに間違ったタイムスタンプを取得していることです

mktime(datetime.strptime(install['click_date'],'%Y-%m-%d %H:%M:%S').timetuple())

より具体的には、strftime を使用して python datetime をエポックに変換する理由

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')  # This is equivalent to my issues above
'1333234800'
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

異なる値を与える?

4

1 に答える 1

3

UNIXタイムスタンプは、ある時点とエポックの間のオフセット値であり、タイムゾーンとは関係ありません。タイムゾーン情報を含まない '%Y-%m-%d %H:%M:%S' のような人間が読める文字列に変換すると、Python はローカル タイムゾーン設定を使用することを想定します。

これを実行すると

datetime.strptime(install['click_date'],'%Y-%m-%d %H:%M:%S')

タイムゾーン情報を含まず、現地時間としてのみ説明できるdatetimeオブジェクトを取得します。UTC サーバーで実行すると、オブジェクトは「2013-07-07 00:33:02 UTC」と説明され、PST サーバーで「2013-07-07 00:33:02 PST」と表示されます。タイム ラインのポイントが異なるため、UNIX タイムスタンプ値も異なります。install['click_date'] を UTC 時間として扱うようにするには、タイムゾーン オフセットを追加する必要があります。

time.mktime(datetime.datetime.strptime(install['click_date'], '%Y-%m-%d %H:%M:%S %Z').timetuple()) + time.timezone

私のCSTサーバー(タイムゾーン0800)で、

>>> time.mktime(datetime.datetime.strptime('2013-07-07 00:33:02', '%Y-%m-%d %H:%M:%S').timetuple()) 

1373128382.0

>>> time.mktime(datetime.datetime.strptime('2013-07-07 00:33:02', '%Y-%m-%d %H:%M:%S').timetuple()) + time.timezone

1373099582.0

最初の呼び出しは「2013-07-07 00:33:02」を現地時間として取り、2 回目の呼び出しは UTC 時間として取ります。

于 2013-07-19T04:48:16.463 に答える