python中常用的處理時(shí)間的模塊有兩個(gè):time 模塊、datetime 模塊,time模塊是比較基礎(chǔ)的一個(gè)模塊,可滿足對(duì)時(shí)間類型數(shù)據(jù)的基本處理;而 datetime模塊可以看做是 對(duì)time模塊的一個(gè)高級(jí)封裝,功能更加強(qiáng)大,例如在時(shí)間的加減上(獲取指定時(shí)間的前(后)一天的時(shí)間,獲取指定時(shí)間的前(后)一小時(shí)的時(shí)間),使用datetime模塊,實(shí)現(xiàn)起來更為方便~
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),三河企業(yè)網(wǎng)站建設(shè),三河品牌網(wǎng)站建設(shè),網(wǎng)站定制,三河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,三河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
時(shí)間也是一個(gè)數(shù)據(jù)類型,這個(gè)類型中的數(shù)據(jù)一般可分為 3類 時(shí)間形式:時(shí)間戳(timestamp),結(jié)構(gòu)化時(shí)間(struct_time),格式化的時(shí)間字符串(format string)~
在計(jì)算機(jī)中,時(shí)間是用數(shù)字來表示的。1970年1月1日 00:00:00 UTC+00:00時(shí)區(qū)的時(shí)刻稱為 epoch time,記為0(1970年以前的時(shí)間timestamp為負(fù)數(shù)),當(dāng)前時(shí)間就是相對(duì)于epoch time的秒數(shù)(浮點(diǎn)型),即 timestamp。
?
獲取當(dāng)前時(shí)間的時(shí)間戳:
>>> import time
>>> time.time()
1539009280.9001613 # float 類型
結(jié)構(gòu)化時(shí)間是一個(gè) struct_time元組,其中有9個(gè)字段,具體說明如下:
字段 | 說明 |
---|---|
tm_year | 年,例如:2018 |
tm_mon | 月,取值:1-12 |
tm_mday | 日,取值:1-31 |
tm_hour | 小時(shí),取值:0-23 |
tm_min | 分鐘,取值:0-59 |
tm_sec | 秒,取值:0-60 |
tm_wday | 星期幾,取值:0到6 (0是周一) |
tm_yday | 一年中的第幾天,取值:1 到 366 |
tm_isdst | 標(biāo)志位,決定是否為夏令時(shí),取值:-1, 0, 1 |
獲取當(dāng)前時(shí)間的結(jié)構(gòu)化時(shí)間:
>>> time.localtime()
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=22, tm_min=59, tm_sec=12, tm_wday=0, tm_yday=281, tm_isdst=0)
# time.localtime() 還可以接收一個(gè)時(shí)間戳參數(shù),獲取指定的時(shí)間:
>>> time.localtime(10)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)
# Tip:由于是東8時(shí)區(qū)所以 tm_hour 是8,而不是0~
# time.gmtime() 與 time.localtime() 作用類似,區(qū)別在于 localtime() 返回的是當(dāng)前時(shí)區(qū)的時(shí)間,gmtime()返回的是格林威治時(shí)間,即 UTC 時(shí)間~
>>> time.gmtime()
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=15, tm_min=5, tm_sec=25, tm_wday=0, tm_yday=281, tm_isdst=0)
>>> time.gmtime(10)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)
也可以手動(dòng)創(chuàng)建結(jié)構(gòu)化時(shí)間(9個(gè)參數(shù)依次傳入,注意是以元組的方式傳入),這種方式并不常用:
>>> time.struct_time((2018,10,8,23,0,9,3,335,-1))
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=23, tm_min=0, tm_sec=9, tm_wday=3, tm_yday=335, tm_isdst=-1)
格式化的時(shí)間字符串 就是使用字符串表示時(shí)間,例如:'2018-10-08 23:13:23'。
字符串時(shí)間的獲取:
>>> time.ctime()
'Sun Oct 14 08:32:04 2018'
>>> time.asctime()
'Sun Oct 14 08:32:10 2018'
結(jié)構(gòu)化時(shí)間轉(zhuǎn)為字符串時(shí)間
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
'2018-10-14 08:42:58'
# strftime函數(shù)的第一個(gè)參數(shù)指定時(shí)間的格式,可以根據(jù)需求而定,例如僅獲取時(shí)間年月日
>>> time.strftime('%Y%m%d', time.localtime())
'20181014'
時(shí)間的format格式如下:
%a 本地(local)簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化月份名稱
%B 本地完整月份名稱
%c 本地相應(yīng)的日期和時(shí)間表示
%d 一個(gè)月中的第幾天(01-31)
%H 一天中的第幾個(gè)小時(shí)(24小時(shí)制,00-23)
%l 一天中的第幾個(gè)小時(shí)(12小時(shí)制,01-12)
%j 一年中的第幾天(01-366)
%m 月份(01-12)
%M 分鐘數(shù)(00-59)
%p 本地am或者pm的相應(yīng)符
%S 秒(01-61)
%U 一年中的星期數(shù)(00-53,星期天是一個(gè)星期的開始,第一個(gè)星期天之前的所有天數(shù)都放在第0周)
%w 一個(gè)星期中的第幾天(0-6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一為一個(gè)星期的開始
%x 本地相應(yīng)日期
%X 本地相應(yīng)時(shí)間
%y 去掉世紀(jì)的年份(00-99)
%Y 完整的年份
%z 用+HHMM或者-HHMM表示距離格林威治的時(shí)區(qū)偏移(H代表十進(jìn)制的小時(shí)數(shù),M代表十進(jìn)制的分鐘數(shù))
%Z 時(shí)區(qū)的名字(如果不存在為空字符)
%% %號(hào)本身
%p只有與%I配合使用才有效果
當(dāng)使用strptime()函數(shù)時(shí),只有當(dāng)在這年中的周數(shù)和天數(shù)被確定的時(shí)候%U和%W才會(huì)被計(jì)算
除了strftime函數(shù),還有asctime函數(shù)可以將結(jié)構(gòu)化時(shí)間轉(zhuǎn)為時(shí)間字符串,只是這個(gè)函數(shù)最多僅接受一個(gè)參數(shù),無法實(shí)現(xiàn)對(duì)字符串進(jìn)行定制~
>>> time.asctime(time.localtime())
'Sun Oct 14 09:16:57 2018'
# 不傳參的情況,默認(rèn)傳入的就是time.localtime()
>>> time.asctime()
'Sun Oct 14 09:19:09 2018'
# 定制結(jié)構(gòu)化時(shí)間
>>> time.asctime(time.struct_time((2000,11,30,0,0,0,3,335,-1)))
'Thu Nov 30 00:00:00 2000'
字符串時(shí)間轉(zhuǎn)為結(jié)構(gòu)化時(shí)間
# 第一個(gè)參數(shù)為時(shí)間字符串,第二個(gè)參數(shù)指定之間格式
>>> time.strptime('2018-10-14 08:42:58', '%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=8, tm_min=42, tm_sec=58, tm_wday=6, tm_yday=287, tm_isdst=-1)
>>> time.strptime('2018-10-14', '%Y-%m-%d')
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=287, tm_isdst=-1)
# 第二個(gè)參數(shù)也可以不指定,只是這個(gè)時(shí)候字符串的格式必須是 '%a %b %d %H:%M:%S %Y'
>>> time.strptime('Sun Oct 14 09:03:46 2018')
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=3, tm_sec=46, tm_wday=6, tm_yday=287, tm_isdst=-1)
>>> time.strptime('Sun Oct 14 09:03:46 2018', '%a %b %d %H:%M:%S %Y')
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=3, tm_sec=46, tm_wday=6, tm_yday=287, tm_isdst=-1)
時(shí)間戳轉(zhuǎn)為結(jié)構(gòu)化時(shí)間
上面提到的time.localtime(),time.gmtime()其實(shí)就是將時(shí)間戳轉(zhuǎn)為格式化時(shí)間
# time.localtime() 可以接受一個(gè) int 類型 的參數(shù),即表示時(shí)間戳
>>> time.localtime(10)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)
# 不傳入?yún)?shù)時(shí),默認(rèn)傳入的就是當(dāng)前時(shí)間戳,即time.time()
print(time.localtime())
print(time.localtime(time.time()))
輸出結(jié)果:
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=34, tm_sec=13, tm_wday=6, tm_yday=287, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=34, tm_sec=13, tm_wday=6, tm_yday=287, tm_isdst=0)
結(jié)構(gòu)化時(shí)間轉(zhuǎn)為時(shí)間戳
>>> >>> time.mktime(time.localtime())
1539481022.0
注:字符串時(shí)間 和 時(shí)間戳 之間,無法實(shí)現(xiàn) 直接轉(zhuǎn)換
datetime是python處理時(shí)間和日期的標(biāo)準(zhǔn)庫,功能要比 time模塊 強(qiáng)大,且使用起來更為方便~
?
datetime模塊中定義的類
類 | 說明 |
---|---|
datetime.date | 表示日期,常用的屬性有:year, month和day |
datetime.time | 表示時(shí)間,常用屬性有:hour, minute, second, microsecond |
datetime.datetime | 表示日期時(shí)間 |
datetime.timedelta | 表示兩個(gè)date、time、datetime實(shí)例之間的時(shí)間間隔,分辨率(最小單位)可達(dá)到微秒 |
datetime.tzinfo | 時(shí)區(qū)相關(guān)信息對(duì)象的抽象基類。它們由datetime和time類使用,以提供自定義時(shí)間的而調(diào)整。 |
datetime.timezone | Python 3.2中新增的功能,實(shí)現(xiàn)tzinfo抽象基類的類,表示與UTC的固定偏移量 |
?
datetime模塊中定義的常量
常量名稱 | 說明 |
---|---|
datetime.MINYEAR | datetime.date或datetime.datetime對(duì)象所允許的年份的最小值,值為1 |
datetime.MAXYEAR | datetime.date或datetime.datetime對(duì)象所允許的年份的最大值,只為9999 |
這里主要說明的是datetime模塊中datetime類~
使用datetime.datetime類獲取當(dāng)前時(shí)間
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 10, 14, 10, 29, 55, 175498)
# 指定標(biāo)準(zhǔn)時(shí)區(qū)
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2018, 10, 14, 2, 30, 1, 831932, tzinfo=datetime.timezone.utc)
這里返回的時(shí)間類型就是 datetime.datetime。datetime.datetime類 里面封裝的方法可實(shí)現(xiàn) datetime.datetime類型的時(shí)間和 上述所說的3種時(shí)間類型 之間的相互轉(zhuǎn)換~
在實(shí)例化 datetime.datetime類 過程中,傳遞參數(shù),來獲取指定的時(shí)間。
# 其中 year,month,day為必須傳遞的參數(shù)
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
# 示例
>>> datetime.datetime(year=2018, month=10, day=14)
datetime.datetime(2018, 10, 14, 0, 0)
參數(shù)說明如下:
參數(shù) | 取值范圍 |
---|---|
year | [MINYEAR, MAXYEAR] |
month | [1, 12] |
day | [1, 指定年份的月份中的天數(shù)] |
hour | [0, 23] |
minute | [0, 59] |
second | [0, 59] |
microsecond | 微妙,[0, 1000000] |
tzinfo | 時(shí)區(qū),tzinfo的子類對(duì)象 |
# 從結(jié)構(gòu)化時(shí)間到 datetime,即是在實(shí)例化datetime類時(shí),指定各個(gè)參數(shù);無法實(shí)現(xiàn)從 time.struct_time 到 datetime的直接轉(zhuǎn)換~
>>> datetime.datetime(year=2018, month=10, day=14, hour=10, minute=49, second=50)
datetime.datetime(2018, 10, 14, 10, 49, 50)
# 從datetime到結(jié)構(gòu)化時(shí)間
>>> datetime.datetime.now().timetuple()
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=10, tm_min=52, tm_sec=23, tm_wday=6, tm_yday=287, tm_isdst=-1)
# 從時(shí)間戳到 datetime
>>> datetime.datetime.fromtimestamp(10) # 當(dāng)前時(shí)區(qū)
datetime.datetime(1970, 1, 1, 8, 0, 10)
>>> datetime.datetime.utcfromtimestamp(10) # 標(biāo)準(zhǔn)時(shí)區(qū)
datetime.datetime(1970, 1, 1, 0, 0, 10)
# 根據(jù)當(dāng)前時(shí)間戳獲取 datetime
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2018, 10, 14, 10, 56, 46, 302245)
# 從datetime 到時(shí)間戳
>>> datetime.datetime.timestamp(datetime.datetime.now())
1539486116.698343
>>> datetime.datetime.timestamp(datetime.datetime.now(datetime.timezone.utc))
1539486173.079687
datetime 和時(shí)間字符串之間的轉(zhuǎn)換 與 time.strftime、time.strptime類似~
# 從 datetime 到 時(shí)間字符串
>>> dt = datetime.datetime.now()
>>> dt.strftime('%Y-%m-%d %H:%M:%S')
'2018-10-14 11:32:49'
# 從 時(shí)間字符串 到datetime
>>> datetime.datetime.strptime('2018-10-14 11:32:49', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2018, 10, 14, 11, 32, 49)
timedelta 類用于表示兩個(gè)時(shí)間之間的差值,可以直接對(duì)datetime.datetime對(duì)象進(jìn)行加減操作~,若使用time模塊,需要先將 字符串時(shí)間 或者 結(jié)構(gòu)化時(shí)間(struct_time)轉(zhuǎn)換為時(shí)間戳個(gè)格式,然后對(duì)該時(shí)間戳加上或者減去 n 秒,最后再將時(shí)間戳格式轉(zhuǎn)換回 字符串時(shí)間 或者 結(jié)構(gòu)化時(shí)間,這樣非常的麻煩。利用 datetime 模塊提供的 timedelta 類 可以直接對(duì) datetime.date,datetime.time,datetime.datetime對(duì)象進(jìn)行 以 天,秒、微秒、毫秒、分鐘、小時(shí)、周 為單位的加減運(yùn)算~
如下是timedelta類的inti方法:
def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ...,
milliseconds: float = ..., minutes: float = ..., hours: float = ...,
weeks: float = ...) -> None: ...
示例:
>>> dt = datetime.datetime.now()
# 2天后的時(shí)間
>>> dt + datetime.timedelta(2)
datetime.datetime(2018, 10, 16, 11, 49, 0, 699630)
# 2天前的時(shí)間
>>> dt + datetime.timedelta(-2)
datetime.datetime(2018, 10, 12, 11, 49, 0, 699630)
# 1小時(shí)之后
>>> dt + datetime.timedelta(hours=1)
datetime.datetime(2018, 10, 14, 12, 49, 0, 699630)
# 一小時(shí)前
>>> dt + datetime.timedelta(hours=-1)
datetime.datetime(2018, 10, 14, 10, 49, 0, 699630)
# 一天一小時(shí)之后
>>> dt + datetime.timedelta(days=1, hours=1)
datetime.datetime(2018, 10, 15, 12, 49, 0, 699630)
# 一個(gè)半小時(shí)之后
>>> dt + datetime.timedelta(hours=1, minutes=30)
datetime.datetime(2018, 10, 14, 13, 19, 0, 699630)
datetime模塊中除了datetime類,還有date,time。date和time類并不常用~
date 的 init 方法,其中year,month,day都是必須參數(shù):
def __init__(self, year: int, month: int, day: int) -> None: ...
獲取 date 對(duì)象:
>>> datetime.date(year=2018, month=10, day=14)
datetime.date(2018, 10, 14)
使用示例:
>>> today = datetime.date.today()
>>> today
datetime.date(2018, 10, 14)
>>> today.year
2018
>>> today.month
10
>>> today.day
14
# 時(shí)間戳轉(zhuǎn)為date
>>> datetime.date.fromtimestamp(time.time())
datetime.date(2018, 10, 14)
# date轉(zhuǎn)為結(jié)構(gòu)化時(shí)間
>>> today.timetuple()
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=287, tm_isdst=-1)
time 的 init 方法,其中 hour 為必須參數(shù):
def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ...,
tzinfo: Optional[tzinfo] = ...) -> None: ...
參數(shù)說明:
hour # 小時(shí),取值范圍:[0, 23]
minute # 分鐘,取值范圍:[0, 59]
second # 秒,取值范圍:[0, 59]
microsecond # 微秒,取值范圍:[0, 1000000]
tzinfo # tzinfo的子類對(duì)象,如timezone類的實(shí)例
獲取 time 對(duì)象:
>>> datetime.time(hour=23, minute=2, second=16)
datetime.time(23, 2, 16)
簡單示例:
>>> dt = datetime.time(hour=23, minute=2, second=16)
>>> dt
datetime.time(23, 2, 16)
>>> dt.hour
23
>>> dt.minute
2
>>> dt.second
16
>>> dt.microsecond
0
>>> dt.tzinfo
# 按照指定的格式轉(zhuǎn)為字符串
>>> dt.strftime('%H%M%S')
'230216'
.................^_^