[英]Python datetime to epoch
t='20180515102500'
d=datetime.strptime(t, "%Y%m%d%H%M%S")
millis_since_epoch = int(time.mktime(d.timetuple())) * 1000
print(millis_since_epoch)
給我:15263 799 00000 在 repl.it(python 3.6.1)和我的本地:15263 979 00000(python 2.7.14)
為什么? 將日期時間對象轉換為紀元的推薦方法是什么?
您的問題是您使用的是幼稚的datetime
(和struct_tm
等)對象。 所以你要問“無論這台機器上的本地時區是什么”中的 15 May 2018 10:25:00 距離 Unix 時代有多遠。 如果在時區相隔 5 小時的兩台機器上運行它,您將得到相隔 5*3600*1000 毫秒的結果。
推薦的方法是:
d.timestamp() # returns difference from epoch as float seconds
… 或者:
d - datetime.fromtimestamp(0) # returns difference as timedelta
(很明顯,如何將其中任何一個轉換為浮點數,或者您需要的任何其他內容。)
但是這些都不會在這里產生任何區別,因為您仍在使用天真的日期時間對象。 (至少你沒有從time
模塊中混入其他類型並丟棄精度,但你沒有解決你的問題。)
您的問題的解決方案取決於您要嘗試做什么。 這些是 UTC 時間戳嗎? 它們是您知道帶外的某個已知時區的時間戳嗎?
如果一切都是 UTC,最好的辦法是顯式創建 UTC 對象,但最簡單的方法(特別是如果您需要在 2.7 中運行代碼時)是:
d - datetime.utcfromtimestamp(0)
這給你,因為時代代表0 UTC秒天真的日期時間,並從天真的日期時間,因為時代代表X UTC秒中減去,所以你得到一個timedelta
代表X秒(具體17666天,37500秒),不考慮系統使用的時區。
或者,對現有代碼的最小更改是使用utctimetuple
而不是timetuple
,它以更復雜的方式做同樣的事情。
在python 3.6中:
datetime.timestamp()
例如:
import datetime
timestamp = datetime.datetime.now().timestamp()
嘗試這個:
t='20180515102500'
d=datetime.datetime.strptime(t, "%Y%m%d%H%M%S")
print(d)
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000
unix_time_millis(d)
如果有幫助,請告訴我!
t = datetime.strptime(gr_dt_string, "%Y-%m-%dT%H:%M:%S")
if six.PY2:
gr_mili = int((t - datetime.fromtimestamp(0)).total_seconds()) * 1000
else:
gr_mili = int(t.timestamp() * 1000)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.