date轉時間戳_Python 時間專題
技術標籤:date轉時間戳golang時間戳轉日期java 轉化為utc的時間oracle 時間戳轉日期python 字串轉日期python中timestamp轉datetime
總第272篇原創
1 兩個時間模組
python與時間相關的內建模組有: time 和 datetime. 其中,time模組提供各種操作時間的函式,datetime模組定義瞭如下幾個型別:
datetime.date:日期類,常用的屬性有 year, month, day;
datetime.time:時間類,常用的屬性有 hour, minute, second, microsecond;
datetime.datetime:日期時間;
datetime.timedelta:時間間隔,即兩個時間點相差長度;
datetime.tzinfo:與時區有關的抽象基類
2 時間表達方式
常用的有以下三種,總結如下。
時間戳
第一,時間戳的方式. 相對於1970.1.1 00:00:00, 以秒計算的偏移量, 時間戳是惟一的,如:138267830.87.我看這是網上或大部分部落格對時間戳的定義,不過這是不夠嚴謹的,需要考慮所處的時區,此處衡量的時區為UTC(世界標準時間)
為了驗證以上邏輯,我們寫一個例子:
dtime3 = datetime.datetime(1970,1,1)
dtime3.timestamp()
預期輸出為 0, 因為是相對於1970.1.1 00:00:00的偏移嗎,所以預期為0. 可是在本地(中國)輸出的時間戳是:-28800.0秒,也就是-8小時,也就是比預期的晚了8個小時。
問題就是處在沒有考慮時區上。原定義是相對於UTC時區的,但是我們的datetime.datetime(1970,1,1) 因為沒有顯示的設定時區,程式會預設按照本地時區計算。
進一步修正:
dtime2 = datetime.datetime(1970,1,1,tzinfo=timezone.utc)
dtime2.timestamp()
輸出為 0.0
在此,我們為tzinfo設定時區為UTC,得到了最嚴格的時間戳的標準值定義。tzinfo 是datetime模組的抽象基類,上面提到過。
class tzinfo(builtins.object)
| Abstract base class for time zone info objects.
python內建模組timezone是對tzinfo的一個標準實現類,如cpython中的原始碼(參考檔案:cpython/Lib/datetime.py)
class timezone(tzinfo):
__slots__ = '_offset', '_name'
時間陣列
第二,以陣列的形式表示即(structtime). 共有九個元素分別表示。同樣,同一個時間戳的structtime會因為時區不同,而不同。
如:time.structtime(tmyear=2013, tmmon=10, tmmday=25, tmhour=13, tmmin=21, tmsec=33, tmwday=4, tmyday=298, tmisdst=0)
前面幾個字面意思很清晰,後面四個:
tm_wday:(0-6, Monday is 0)
tm_yday:(day in the year, 1-366)
tm_isdst:(-1, 0 or 1) 0:普通 1:DST夏令時比正常的早一個小時 -1:根據當前時區
可讀性最強
最後一種是一種顯示型式,也是我們最直觀的顯示方式,平時使用較多的日期和時間的表達方式。字串,如:2013-10-25 13:29:39.543000
3 aware 和 naive 時間
這些在第2章節,其實我們已經有所涉及,簡單來說aware日期時間會考慮時區等的因素,比如tzinfo設定為UTC後,時間戳就會相對於UTC求一個偏移。而,naive時間日期無法使用者設定時區,選用哪個時區完全靠執行程式碼的系統決定,官方解釋:
Whether a naive object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program
4 常用API
理解了上面說的這些日期和時間的基本概念後,再用起來就不會掉坑了,下面總結一些常用的吧,網上這方面的一搜一大把,我儘量整理一個標準版本吧。
整理思路就是按照三種時間日期的表達格式,再有三種表達的相互轉換。
4.1 time 模組
import time
time.time()#獲得自己所在時區的當前時間的時間戳
1382679270.196
time.clock()#3.8要廢棄了
改為使用 time.process_time() 計算cpu的執行時間
time.mktime((2019,5,14, 0,0,0, 0,0,0))#利用mktime函式建立一個時間戳
1557763200.0, 注意必須是9元組
4.1.1封裝格式函式
提煉使用較多的函式,將任意格式的時間日期字串,轉化為我們熟悉的時間日期格式
def toMyFormat(inputstr, inputfmt = "%a %b %d %H:%M:%S %Y"):
tstruct = time.strptime(inputstr ,inputfmt) #轉化為struct_time
return time.strftime("%Y-%m-%d %H:%M:%S", tstruct) #轉化為定製的格式
4.1.2時間戳轉struct_time
In [91]: a = time.time() #時間戳
Out[92]: 1557819720.375314
In [94]: time.gmtime(a) # 用UTC表達的struct_time
Out[94]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=7, tm_min=42, tm_sec=0, tm_wday=1, tm_yday=134, tm_isdst=0)
In [96]: time.localtime() # 用localtime表達的struct_time
Out[96]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=15, tm_min=43, tm_sec=27, tm_wday=1, tm_yday=134, tm_isdst=0)
4.1.3時間戳轉字串
In [100]: time.ctime(a) # 時間戳轉字串格式(本地時區表達)
Out[100]: 'Tue May 14 15:42:00 2019'
這個時間格式不是我們想要的,直接使用上面提到的封裝後的日期轉化函式toMyFormat 即可。
4.1.4struct_time轉字串
In [122]: import time
In [123]: a = time.localtime()
In [124]: a
Out[124]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=16, tm_min=36, tm_sec=30, tm_wday=1, tm_yday=134, tm_isdst=0)
In [125]: b = time.asctime(a) # struct_time轉時間戳
In [126]: b
Out[126]: 'Tue May 14 16:36:30 2019'
In [127]: toMyFormat(b)
Out[127]: '2019-05-14 16:36:30'
4.1.5struct_time轉時間戳
In [132]: a = time.gmtime()
In [133]: a
Out[133]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=8, tm_min=38, tm_sec=55, tm_wday=1, tm_yday=134, tm_isdst=0)
In [136]: time.mktime(a) #stuct_time轉為時間戳
Out[136]: 1557794335.0
4.1.6字串轉struct_time
In [146]: b
Out[146]: 'Tue May 14 16:44:16 2019'
In [147]: time.strptime(b,'%a %b %d %H:%M:%S %Y') #str格式轉struct_time
Out[147]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=16, tm_min=44, tm_sec=16, tm_wday=1, tm_yday=134, tm_isdst=-1)
4.1.7字串轉時間戳
字串轉為strct_time,然後使用time.mktime(a)轉化為時間戳。
4.2datetime模組
datetime模組包括datetime類,date類,time類,timedelta類,tzinfo類。
4.2.1datetime
from datetime import *
date.today()*獲取今天的日期:datetime.date(2019, 5, 14)
datetime.today()#獲取今天的日期和時間:datetime.datetime(2019, 5, 14, 12, 36, 33, 382046)
dtime = datetime.now()# 獲取當前的日期和時間,類似於 today()
datetime.datetime(2019, 5, 14, 12, 36, 33, 322000) # 構造出一個datetime例項
dtime.date()
Out[154]: datetime.date(2019, 5, 14) # date類
dtime.time()
Out[155]: datetime.time(16, 49, 57, 399473) #注意此time類不是time模組
In [157]: dtime.day
Out[157]: 14
In [158]: dtime.month
Out[158]: 5
4.2.2date
一個date物件表示年月日的組合,使用的日曆為Gregorian。上面常用到的屬性:
In [199]: a
Out[199]: datetime.datetime(2019, 5, 14, 17, 1, 35, 804091)
In [200]: ad = a.date
In [202]: ad = a.date()
In [203]: ad
Out[203]: datetime.date(2019, 5, 14)
In [204]: ad.timetuple() # 轉為time模組中的struct_time類
Out[204]: time.struct_time(tm_year=2019, tm_mon=5, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=134, tm_isdst=-1)
In [205]: ad.weekday() #返回周幾,Monday為0,Sunday為6
Out[205]: 1
In [206]: ad.isoweekday() #返回周幾,Monday為1,Sunday為7
Out[206]: 2
In [218]: ad
Out[218]: datetime.date(2019, 5, 14)
In [219]: ad.ctime() # 轉化為時間的字串
Out[219]: 'Tue May 14 00:00:00 2019'
In [220]: ad.strftime("%Y-%m-%d") #按照指定格式轉化
Out[220]: '2019-05-14'
In [222]: ad.strftime("%Y-%m-%d %H:%M:%S")
Out[222]: '2019-05-14 00:00:00'
4.2.3time
時間物件代表本地時間,不含年月日,可以由 tzinfo 調整。注意與time模組區分,此time為datetime模組下的類。
4.2.4timedelta
timedelta物件代表兩個日期或時間的間隔,是一個週期。
timedelta類的定義如下:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
timedelta類例項支援加減乘除等操作,如下:
In [189]: a = datetime.today()
In [190]: a
Out[190]: datetime.datetime(2019, 5, 14, 17, 1, 35, 804091)
In [191]: b = datetime(2019,5,15,18)
In [192]: b
Out[192]: datetime.datetime(2019, 5, 15, 18, 0)
In [193]: b - a
Out[193]: datetime.timedelta(days=1, seconds=3504, microseconds=195909)
以上就是python中關於時間處理的理論介紹,API使用較多的總結。你如發現了問題,請幫助我更正,謝謝。
本專題教程為公眾號: Python與演算法社群 出品,如需轉載,請註明出處 Python與演算法社群 公眾號。
Python與演算法社群
長按訂閱