Python中生成Epoch的方法
在Python2中datetime對象沒有timestamp方法,不能很方便的生成epoch,現(xiàn)有方法沒有處理很容易導致錯誤。關(guān)于Epoch可以參見時區(qū)與Epoch
0 Python中生成Epoch
from datetime import datetime # python3 datetime.now().timestamp() # python2 import time time.mktime(datetime.now().timetuple()) # 為了兼容python2和3,該用法使用更廣泛
1 錯誤代碼
from datetime import datetime import pytz aware_date = datetime.utcnow().replace(tzinfo=pytz.utc) time.mktime(aware_date.timetuple()) # bug here
2 原因
Python中的datetime對象分為帶時區(qū)信息和不帶時區(qū)信息的兩種對象即naive和aware對象。在處理naive時,一切皆默認為系統(tǒng)時區(qū),沒有任何問題。
在Python3中執(zhí)行timestamp時對于naive對象,按照默認時區(qū)處理(調(diào)用time.mktime),而aware對象,則帶上時區(qū)計算與UTC基準時間的間隔秒數(shù)得到,也就是將時區(qū)信息考慮在內(nèi)。
而Python2和3中的timetuple方法,返回的結(jié)果沒有包含時區(qū)信息,也沒有進行時區(qū)轉(zhuǎn)換。即調(diào)用timetuple對于aware日期對象而言,時區(qū)信息被丟棄,因此再調(diào)用time.mktime將得到一個錯誤的結(jié)果
3 解決辦法
1、方法一:將其他時區(qū)的aware日期,轉(zhuǎn)換為當前系統(tǒng)默認的時區(qū)的aware對象, 由于與系統(tǒng)時區(qū)一致,因此該aware對象與無時區(qū)的naive對象執(zhí)行timetuple的效果一樣。
轉(zhuǎn)換時區(qū)參見timezone,即調(diào)用astimezone方法,參數(shù)為轉(zhuǎn)換后的時區(qū)(tzinfo實例)
由于Python2中缺失tzinfo(抽象基類)的各個時區(qū)實例,需要自己構(gòu)造時區(qū)對象。
時區(qū)實例可以參考官方文檔的實現(xiàn)datetime或使用推薦的第三方庫pytz
2、方法二:計算時間差
_EPOCH = datetime(1970, 1, 1, tzinfo=pytz.utc) # 第三方庫 pytz (aware_date - _EPOCH).total_seconds()
以上這篇Python中生成Epoch的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)獲取亂序列表排序后的新下標的示例
本文主要介紹了Python實現(xiàn)獲取亂序列表排序后的新下標的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04在Python的一段程序中如何使用多次事件循環(huán)詳解
循環(huán)是我們在日常開發(fā)中是必不可少會遇到的,下面這篇文章主要給大家介紹了關(guān)于在Python的一段程序中如何使用多次事件循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)
在我們對數(shù)據(jù)進行選擇之后,需要對特定的數(shù)據(jù)進行設(shè)置更改,設(shè)置,下面這篇文章主要給大家介紹了關(guān)于Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-01-01利用django-suit模板添加自定義的菜單、頁面及設(shè)置訪問權(quán)限
這篇文章主要給大家介紹了關(guān)于利用django-suit模板添加自定義的菜單、頁面及設(shè)置訪問權(quán)限的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧2018-07-07