簡體   English   中英

Python日期時間到紀元

[英]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.

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