
Time
datetime 時(shí)間魔法
用過(guò) python 中 datetime 模塊的話
都知道可以通過(guò) datetime.now() 或者 datetime.today() 獲取到當(dāng)前系統(tǒng)的年、月、日、時(shí)、分、秒
有沒(méi)有辦法,能在程序運(yùn)行的時(shí)候,獲取到系統(tǒng)當(dāng)天的任意時(shí)刻呢?也就是時(shí):分:秒
有兩種方案可以嘗試,需要預(yù)熱的知識(shí):
- datetime.datetime.now() or datetiime.datetime.today() -- 獲取系統(tǒng)當(dāng)前時(shí)間
- datetime.strftime() -- 轉(zhuǎn)化時(shí)間對(duì)象為指定格式的字符串
- datetime.strptime() -- 指定格式的字符串轉(zhuǎn)化時(shí)間對(duì)象
- datetime.timedelta() -- 通過(guò)增量,修改時(shí)間對(duì)象
一、字符串拼接法
兩行代碼實(shí)現(xiàn)
#!usr/bin/python3
# -*- utf-8 -*-
import datetime
today = datetime.datetime.now().strftime("%Y%m%d") # 20220518
dt_5_30 = datetime.datetime.strptime(today + ' 05:30', "%Y%m%d %H:%M") # 20220518 05:30
dt_23_30 = datetime.datetime.strptime(today + ' 23:30', "%Y%m%d %H:%M") # 20220518 08:30
一起來(lái)看看代碼的實(shí)現(xiàn)思路:
- 先通過(guò)
datetime.strftime()方法得到當(dāng)天的年、月、日的格式化字符串; - 然后通過(guò)
datetime.strptime()方法,當(dāng)天的年、月、日字符串,拼接上指定的時(shí)刻,如:“05:30”。
datetime 的 strptime方法,會(huì)將我們指定的時(shí)間,轉(zhuǎn)換為一個(gè)datetime對(duì)象
二、“時(shí)間滑塊法”
如果把時(shí)間想象成一個(gè)從左往右的慢慢滑動(dòng)的滑塊... ...
那么,我們就可以任意把時(shí)間 “撥動(dòng)” 到任意時(shí)刻了不是么?
我們需要借助 timedelta 的 “時(shí)間魔法”,把時(shí)間撥動(dòng)一下,得到我們想要的時(shí)間
#!usr/bin/python3
# -*- utf-8 -*-
from datetime import datetime, timedelta
def get_today_hour_minute(H, M, S=0):
""" 可以撥動(dòng)的 “時(shí)間滑塊” 函數(shù)
:param H: int hour 小時(shí)
:param M: int minute 小時(shí)
:param S: option int 秒數(shù)
:return: 返回當(dāng)天的任意時(shí)刻的 datetime 對(duì)象
"""
today = datetime.today() # datetime.now() 也可以,不過(guò)精度要求不高時(shí)可以用 today
zero_today = today - timedelta(hours=today.hour, minutes=today.minute, seconds=today.second, microseconds=today.microsecond)
set_today = zero_today + timedelta(hours=H, minutes=M, seconds=S)
return set_today
dt_5_30 = get_today_hour_minute(5, 30)
dt_23_30 = get_today_hour_minute(23, 30)
一起來(lái)看看代碼的實(shí)現(xiàn)思路,是怎么撥動(dòng)時(shí)間的呢?
- 通過(guò)
datetime.today()得到當(dāng)前的系統(tǒng)時(shí)間; - 借助
timedelta(表示時(shí)間的增量,用絕對(duì)值的思維),讓時(shí)間對(duì)象today,減去 “自己”已經(jīng) 走過(guò)的時(shí)間,使得today時(shí)間 “歸零” 得到zero_today【20220518000000】; - 讓后,再通過(guò)
timedelta,給清零的時(shí)間對(duì)象today一個(gè)新的增量,通過(guò)傳入的參數(shù)H、M、S。也就是,我們自己撥動(dòng)了表盤(pán)的時(shí)針、分針、秒針
在這里,我們也能操控時(shí)間了 XD
三、使用場(chǎng)景
用上面的任意一種方法
得到的用于界定時(shí)間范圍的datetime對(duì)象
就可以用于當(dāng)天時(shí)間數(shù)據(jù)的對(duì)比了
舉個(gè)小例子:
if datetime.datetime.now() < dt_5_30:
print("當(dāng)前時(shí)間小于 05:30")
elif (datetime.datetime.now() >= dt_5_30 and datetime.datetime.now() < dt_23_30):
print("當(dāng)前時(shí)間大于等于 05:30,小于 08:30")
你喜歡哪一種方案呢?