一篇文章總結(jié)一下Python庫(kù)中關(guān)于時(shí)間的常見(jiàn)操作
前言
本次來(lái)總結(jié)一下關(guān)于Python時(shí)間的相關(guān)操作,有一個(gè)有趣的問(wèn)題。
如果你的業(yè)務(wù)用不到時(shí)間相關(guān)的操作,你的業(yè)務(wù)基本上會(huì)一直用不到。
但是如果你的業(yè)務(wù)一旦用到了時(shí)間操作,你就會(huì)發(fā)現(xiàn),淦,到處都是時(shí)間操作。。。
所以思來(lái)想去,還是總結(jié)一下吧,本次會(huì)采用類(lèi)型注解方式。
time包
- import time
時(shí)間戳
從1970年1月1日00:00:00標(biāo)準(zhǔn)時(shí)區(qū)誕生到現(xiàn)在時(shí)間一共過(guò)了多少秒。
代碼
- timestamp = time.time() # type:float
- print(timestamp, type(timestamp))
執(zhí)行結(jié)果
睡眠
有時(shí)候可能我們可能需要模仿一些IO請(qǐng)求,假裝讓程序休眠一下,所以需要用到time的sleep函數(shù)。
代碼
- # 睡眠 1秒
- time.sleep(1)
本地時(shí)區(qū)
本地時(shí)區(qū)需要用到time的localtime方法。
代碼
- t = time.localtime() # type:time.struct_time
- print(t, type(t))
執(zhí)行結(jié)果

localtime還能接收一個(gè)時(shí)間戳參數(shù)。
代碼
- # 將時(shí)間戳轉(zhuǎn)換成 struct_time 對(duì)象
- t = time.localtime(1606395685.1878598) # type:time.struct_time
- print(t, type(t))
執(zhí)行結(jié)果

簡(jiǎn)單的時(shí)間格式
代碼
- t = time.ctime() # type:str
- print(t, type(t))
執(zhí)行結(jié)果

雖然這個(gè)能把時(shí)間展示出來(lái),但是這個(gè)格式實(shí)在是不是太好看。
同理,time.ctime()也是可以接收一個(gè)時(shí)間戳的。
代碼
- t = time.ctime(1606395685.1878598) # type:str
- print(t, type(t))
執(zhí)行結(jié)果

時(shí)間格式化
日期格式 -> 字符串(strftime)
代碼
- t = time.localtime() # type:time.struct_time
- t_str = time.strftime("%Y-%m-%d", t) # type:str
- print(t_str, type(t_str))
執(zhí)行結(jié)果
字符串日期 -> 日期(strptime)
代碼
- t_str = "2020-11-02"
- t_time = time.strptime(t_str, "%Y-%m-%d") # type:time.struct_time
- print(t_time, type(t_time))
執(zhí)行結(jié)果
格式化補(bǔ)充
主要有如下格式
具體詳見(jiàn):
https://www.runoob.com/python/python-date-time.html
datetime包
注:datetime和time是兩個(gè)不同的類(lèi)型,不能混用。
- from datetime import datetime
datetime.today()
代碼
- t = datetime.today() # type:datetime
- print(t, type(t))
- print(t.year) # 年份
- print(t.month) # 月份
執(zhí)行結(jié)果

datetime.now()
和datetime.today()基本一樣,返回的是本地時(shí)間。
代碼
- t = datetime.now() # type:datetime
- print(t,type(t))
執(zhí)行結(jié)果

datetime.utcnow()
utcnow返回的是標(biāo)準(zhǔn)(UTC)時(shí)間,上述倆返回的都是本地時(shí)間,我們是東八區(qū)!
代碼
- t = datetime.now()
- print("東八區(qū)時(shí)間:", t)
- t = datetime.utcnow() # type:datetime
- print("UTC時(shí)間:", t)
執(zhí)行結(jié)果

時(shí)間戳轉(zhuǎn)datetime
有時(shí)候,我們拿到的,就是時(shí)間戳,那就只能轉(zhuǎn)了。
代碼
- # 時(shí)間戳
- timestamp = time.time()
- print(f"timestamp:{timestamp},type:{type(timestamp)}")
- # 時(shí)間戳轉(zhuǎn)datetime
- t = datetime.fromtimestamp(timestamp)
- print(f"t:{t},type:{type(t)}")
執(zhí)行結(jié)果

datetime -> 字符串日期(strftime)
代碼
- from datetime import datetime
- t = datetime.now()
- str_datetime = t.strftime("%Y-%m-%d %H:%M:%S")
- print(f"字符串日期:{str_datetime},type:{type(str_datetime)}")
執(zhí)行結(jié)果
字符串日期 -> datetime(strptime)
代碼
- from datetime import datetime
- str_datetime = "2020-11-29 22:05:20"
- t = datetime.strptime(str_datetime, "%Y-%m-%d %H:%M:%S")
- print(f"t:{t},type:{type(t)}")
執(zhí)行結(jié)果

時(shí)間加減
這才是本次的重頭戲,好像只有datetime這個(gè)包,才有時(shí)間加減的。
時(shí)間加減的具體用途很多,必須多久過(guò)期什么的,多久之后提醒,都需要提前計(jì)算時(shí)間,還是很重要的。
代碼
- from datetime import datetime
- import datetime as idatetime
- t = datetime.now()
- print(f"當(dāng)前時(shí)間:{t}")
- three_day = t + idatetime.timedelta(days=3)
- print(f"三天后時(shí)間:{three_day}")
執(zhí)行結(jié)果

可以發(fā)現(xiàn),這個(gè)時(shí)間確實(shí)是+成功了。
但是自帶的時(shí)間加減,有個(gè)題,只能加天,不能加月,甚至年。
如果想要時(shí)間+月等,還要自己寫(xiě)邏輯。
datetime時(shí)間自由加減
有個(gè)包正好解決了這個(gè)問(wèn)題。
安裝
- pip install python-dateutil
代碼
- from datetime import datetime
- from dateutil.relativedelta import relativedelta
- t = datetime.now()
- print(f"當(dāng)前時(shí)間:{t}")
- three_time = t + relativedelta(months=3)
- print(f"三個(gè)月后時(shí)間:{three_time}")
- one_year = t+relativedelta(years=1)
- print(f"一年后時(shí)間:{one_year}")
- up_year = t+relativedelta(years=-1)
- print(f"去年這個(gè)時(shí)間:{up_year}")
執(zhí)行結(jié)果
用法很簡(jiǎn)單,如果想加月/年份,就寫(xiě)正數(shù),如果想減,就寫(xiě)負(fù)數(shù),這個(gè)方法基本上將python在操作時(shí)間上的缺點(diǎn)給彌補(bǔ)了。
總結(jié)
本篇主要講述的是關(guān)于Python時(shí)間的相關(guān)總結(jié),相對(duì)來(lái)說(shuō),更推薦使用datetime。
需要注意的是,time和datetime是倆類(lèi)型,是不能混用的。
其實(shí)最重要的是字符串時(shí)間->時(shí)間類(lèi)型,這個(gè)在實(shí)際中用的非常多!
順便還有python-dateutil的relativedelta相關(guān)方法,能夠自由加減時(shí)間,算是挺方便的。