在日常工作中基本每天都會與時間類型打交道,比如資料庫每條數據的創建時間,更新的時候需要寫入的更新時間,那麼問題來了,如下:
它是要 UTC Time(世界統一時間)還是要本地時間?
日期的格式要怎麼格式化?
我如果得到的是一個時間戳,我該怎麼轉成目標時間?
我如果想把資料庫的時間轉成時間戳我該怎麼處理?
等等等等

上面說的這些,不複雜,但是你不能不知道,如果連這類的基礎在用到的時候都需要去檢索,那麼就不用談效率了。
下面,咱們通過幾個實例,一起來看一下使用 datetime 這個庫做日期和時間的管理和轉換。
實例 1:獲取當前時間
import time
from datetime import datetime
now = datetime.now()
print(f'當前時間: {now}')
print(f'當前時間拆分: {now.year, now.month, now.day}')
strf_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
print(f'格式化當前時間: {strf_now}')
strf_now_1 = datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S')
print(f'格式化當前時間-1: {strf_now_1}')
<OUTPUT>
當前時間: datetime.datetime(2020, 12, 13, 16, 5, 57, 448449)
當前時間拆分: (2020, 12, 13)
格式化當前時間: '2020-12-13 16:05:57.448602'
格式化當前時間-1: '2020-12-13 16:05:57'
對上述代碼進行解釋:
now 中的 datetime.now() 用來獲取當前的時間,返回的數據為 datetime 類型;.year .mongo .day 分別用來獲取年、月、日;
strf_now 中 strftime 用來格式化 datetime 類型的數據;格式化之後,返回的是 str 類型的數據;
strf_now_1 中演示了使用 strftime 格式化的另一種方法,返回的結果和數據類型與 strf_now 一樣,這裡用偽代碼寫一下上面說的兩種方法
{datetime 類型對象}.strftime( {格式符組} )
datetime.strftime( {datetime 類型對象}, {格式符組} )
strftime 的格式符已經在文末整理好了,可以保存下來,用到的時候方便查閱。
實例 2:獲取當前的UTC時間
from datetime import timedelta
utc_now = datetime.utcnow()
print(f'UTC 當前時間: {utc_now}')
utc2local = utc_now + timedelta(hours=8)
print(f'當地當前時間: {utc2local}')
<OUTPUT>
UTC 當前時間: datetime.datetime(2021, 9, 8, 12, 13, 31, 472850)
當地當前時間: datetime.datetime(2021, 9, 8, 20, 13, 31, 472850)
對上述代碼進行解釋:
datetime.utcnow() 用來獲取 UTC (全球統一)時間,返回的數據類型為 datetime 類型;
utc2local 完成的是 UTC 時間轉當前時間的過程(科普:UTC 時間轉當前實際上做的只是在原有時間基礎上加 8 小時);
其中的 timedelta 會在「實例 3」中講解,它的作用是可以在當前時間的基礎上增加或者減少一定的時間。

實例 3:獲取一個時間之前或者之後一段時間後的時間,使用timedelta可以很方便地實現
from datetime import timedelta
delta_now = datetime.now() + timedelta(days=1)
print(f'delta_now: {delta_now}')
<OUTPUT>
delta_now: datetime.datetime(2021, 9, 8, 20, 54, 45, 479097)
對上述代碼進行解釋:
首先需要注意,與 timedelta 相加的,須為 datetime 類型;
timedelta(days=1) 返回 datetime 類型,相加後,也返回 datetime 類型;
delta_now 表示在現在的基礎上,加上一天返回;
timedelta 還支持很多參數,如下,如果多個傳入,請注意順序datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
timedelta 的值支持負數,例如 days=-1,表示減掉一天。

實例 4:字元串時間轉時間戳
import time
def time2stamp(t):
time_array = time.strptime(t, '%Y-%m-%d %H:%M:%S')
print(type(time_array), '->', time_array)
timestamp = time.mktime(time_array)
return timestamp
if __name__ == '__main__':
print('->', time2stamp('2020-12-10 23:34:30'))
<OUTPUT>
<class 'time.struct_time'> -> time.struct_time(tm_year=2020, tm_mon=12, tm_mday=10, tm_hour=23, tm_min=34, tm_sec=30, tm_wday=3, tm_yday=345, tm_isdst=-1)
-> 1607614470.0
對上述代碼進行解釋:
time.strptime() 函數根據指定的格式把一個時間字元串解析為時間元組,供後續使用;
time.mktime() 接收結構化之後的時間對象作為參數(上面的 time.strptime() 的返回值),返回用秒數來表示時間的浮點數;
實例 5:當前時間轉時間戳
import time
form datetime import datetime
def get_now_stamp():
now_time = datetime.now()
return time.mktime(now_time.timetuple())
if __name__ == '__main__':
print('->', get_now_stamp())
<OUTPUT>
-> 1607848078.0
實例 5 不多說,實例 4 搞明白了,理解實例 5 自然不成問題。
實例 6:時間戳轉時間
from datetime import datetime
def stamp2time(timestamp):
return datetime.fromtimestamp(timestamp)
if __name__ == '__main__':
print('->', stamp2time(1607614470))
<OUTPUT>
-> datetime.datetime(2020, 12, 10, 23, 34, 30)
對上述代碼解釋:
datetime.fromtimestamp() 時間戳(int 型)轉換為 datetime 類型時間;
以上的方法,建議大家根據自己的需要,封裝成工具類,其中實例 4、5、6 是封裝好的現成的方法,可以直接使用;這樣在使用的時候可以很方便的調用;
當然工具類可以往裡面補充很多常用函數,有了這個利器,你開發的效率也會逐漸地快起來。
下面是 strftime 格式符,請笑納。

**文末福利——推薦一個《Python自動化測試學習交流群》給大家:
請關注+私信回復:"頭條" 就可以免費拿到軟體測試學習資料,同時進入群學習交流~~
