簡體   English   中英

Python時間戳+日期時間轉換

[英]Python Timestamp + Datetime Conversion

自從紀元值為1459952824358起,我就具有UNIX毫秒時間戳記的測試記錄

我正在使用fastavro庫編寫Python 2.x程序。 這需要1459952824358整數UNIX毫秒時間戳,並將其轉換為本地日期時間值2016-04-06T09:27:04.358000 當我嘗試將其轉換回整數UNIX毫秒時間戳值時,我的工作時間減少了一個小時。 我可以使用普通的Python日期時間在fastavro庫之外復制此轉換問題:

import datetime
import time

raw = 1459952824358

local_dt = datetime.datetime.fromtimestamp(raw / 1000.0)
local_dt.isoformat() # '2016-04-06T09:27:04.358000'

back = int((local_dt - datetime.datetime.fromtimestamp(0)).total_seconds() * 1.0e3)
back - raw # 3600000

我可以轉換為UTC日期時間並成功返回:

import datetime
import time

raw = 1459952824358

utc_dt = datetime.datetime.utcfromtimestamp(raw / 1000.0)
utc_dt.isoformat() # '2016-04-06T14:27:04.358000'

back = int((utc_dt - datetime.datetime.utcfromtimestamp(0)).total_seconds() * 1.0e3)
back - raw # 0

奇怪的是,我的系統設置為CST或UTC-6,但是Python產生的本地日期時間比UTC值低了五個小時,而不是六個小時。

雖然我的特定項目需要Python 2兼容性,但我嘗試使用Python 3 timestamp功能,該功能可以正確地返回原始時間戳值,而不會出現小時數漂移,但是即使我的系統即使本地日期時間也比UTC時間短5個小時。設置為CST或UTC-6。

import datetime
import time

raw = 1459952824358

local_dt = datetime.datetime.fromtimestamp(raw / 1000.0)
local_dt.isoformat() # '2016-04-06T09:27:04.358000'

back = int(local_dt.timestamp() * 1000)
back - raw # 0

我在同一台筆記本電腦上嘗試了Java 9中的相同示例,只是看它產生了什么:

import java.time.*

long raw = 1459952824358L;

Instant i = Instant.ofEpochMilli(raw)
ZonedDateTime zdtUtc = ZonedDateTime.ofInstant(i, ZoneOffset.UTC)
// UPDATE: This line was my original attempt. It was wrong because it uses the current daylight savings setting, not the one of the given date.
ZonedDateTime zdtLocal = zdtUtc.withZoneSameInstant(ZonedDateTime.now().getOffset())
// This next line will choose the current geography, but choose the daylight savings setting based on the date, which is what I expected.
ZonedDateTime zdtLocal = zdtUtc.withZoneSameInstant(ZoneId.systemDefault())

long deltaFromUtc = zdtUtc.toInstant().toEpochMilli() - raw
long deltaFromLocal = zdtLocal.toInstant().toEpochMilli() - raw

無論utc / local如何,它都會返回確切的原始時間戳值。

更新:基本上,Python 2.x在沒有額外庫的情況下無法將本地日期時間值正確轉換為UTC。 Python 3.x可以,而Python 2.x則具有額外的庫來執行此操作,但是開箱即用卻不能。

tl; dr :您的測量處於關閉狀態,而不是日期時間:您正在比較來自不同時區的兩次,因此結果應該是時區之間的差值。


所以這就是為什么最好在UTC中工作:

在Python 2.7中:

使用原始數據:

>>> print datetime.datetime.utcfromtimestamp(raw/1000.0)
... print datetime.datetime.fromtimestamp(raw/1000.0)
... 
2016-04-06 14:27:04.358000
2016-04-06 07:27:04.358000

7小時不同

使用夏令時以外的修改日期:

>>> print datetime.datetime.utcfromtimestamp(1456952824)
... print datetime.datetime.fromtimestamp(1456952824)
... 
2016-03-02 21:07:04
2016-03-02 13:07:04

8小時不同

發生這種情況是因為本地時間的raw0處於不同的時區(夏令時與標准時間):

>>> print datetime.datetime.utcfromtimestamp(raw/1000.0)
... print datetime.datetime.fromtimestamp(raw/1000.0)
... 
2016-04-06 14:27:04.358000
2016-04-06 07:27:04.358000

>>> print datetime.datetime.utcfromtimestamp(0)
... print datetime.datetime.fromtimestamp(0)
...
1970-01-01 00:00:00
1969-12-31 16:00:00

如果您堅持使用utc,就沒有問題。

但是即使我的系統設置為CST或UTC-6,本地日期時間仍然比UTC時間短5個小時。

因為在該raw日期,您的本地時間為CDT(-5):

user@TS-E31:~$ date --date @1459952824
Wed Apr  6 07:27:04 PDT 2016
user@TS-E31:~$ date --date @0
Wed Dec 31 16:00:00 PST 1969

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM