推薦使用arrow包進(jìn)行日期和時(shí)間處理,其方法更簡單、更容易理解~
一、模塊介紹
- datetime模塊包含5個(gè)類對象
| 類名 | 功能說明 |
|---|---|
| date | 日期對象,常用屬性:year、month、day |
| time | 時(shí)間對象,常用屬性:hour、second、minute |
| datetime | 日期時(shí)間對象,常用的屬性:hour、minute、year、day等 |
| timedelta | 時(shí)間間隔對象,即兩個(gè)時(shí)間點(diǎn)之間的長度 |
| tzinfo | 時(shí)區(qū)信息對象 |
- datetime模塊包含2個(gè)常量
| 常量 | 功能說明 | 用法 | 返回值 |
|---|---|---|---|
| MAXYEAR | 返回能表示的最大年份 | datetime.MAXYEAR | 9999 |
| MINYEAR | 返回能表示的最小年份 | datetime.MINYEAR | 1 |
- Python標(biāo)準(zhǔn)庫提供的datetime和time側(cè)重點(diǎn)不同,time更加側(cè)重于linux時(shí)間戳。
二、date類
(一)類構(gòu)成
-
date由year年份、month月份、day日期三部分構(gòu)成; - 通過
year/month/day進(jìn)行數(shù)據(jù)訪問;import datetime a = datetime.date.today() print(a) -- > 2018-07-03 print(a.year) -- > 2018 print(a.month) -- > 7 print(a.day) -- > 3 - 通過屬性
__getattribute__(…)進(jìn)行數(shù)據(jù)訪問a = datetime.date(2018, 6, 11) a -- > datetime.date(2018, 6, 11) a.__getattribute__('month') -- > 6 a.__getattribute__('day') -- > 11 - date可以作為字典的key,所有的date對象都會(huì)被認(rèn)為是True,也就是 if date 這個(gè)判斷永遠(yuǎn)是成立的。
(二)方法與屬性
- 日期比較:返回True或False
| 方法名稱 | 方法說明 | 用法 |
|---|---|---|
| __eq__(...) | 等于(x==y) | x.__eq__(y) |
| __ge__(...) | 大于等于(x>=y) | x.__ge__(y) |
| __gt__(...) | 大于(x>y) | x.__gt__(y) |
| __le__(...) | 小于等于(x<=y) | x.__le__(y) |
| __lt__(...) | 小于(x<y) | x.__lt__(y) |
| __ne__(...) | 不等于(x!=y) | x.__ne__(y) |
a = datetime.date(2018, 1, 1)
b = datetime.date(2018, 1, 15)
a.__eq__(b)
-- > False
a.__ne__(b)
-- > True
a.__le__(b)
-- >True
- 日期差:返回值類型為datetime.timedelta
| 方法名稱 | 方法說明 | 用法 | 方向 |
|---|---|---|---|
| __sub__(...) | x - y | x.__sub__(y) | 正向 |
| __rsub__(...) | y - x | x.__rsub__(y) | 反向 |
a = datetime.date(2018, 6, 14)
b = datetime.date(2018, 6, 25)
a.__sub__(b)
-- > datetime.timedelta(-11)
a.__sub__(b).days
-- > -11
a.__rsub__(b)
-- > datetime.timedelta(11)
a.__rsub__(b).days
-- > 11
- ISO標(biāo)準(zhǔn)化日期
-
isocalendar():返回包含三個(gè)值的元組,分別為:year年份、week number周數(shù)、weekday星期幾(周一為1、周日為7);a = datetime.date(2018, 6, 21) a -- > datetime.date(2018, 6, 21) a.isocalendar() -- > (2018, 25, 4) -
isoformat():返回符合ISO 8601標(biāo)準(zhǔn)(YYYY-MM-DD)的日期字符串;a = datetime.date(2018, 6, 27) a.isoformat() -- > '2018-06-27' -
isoweekday():返回符合ISO標(biāo)準(zhǔn)的指定日期所在的星期數(shù)(周一為1、周日為7),weekday()方法以周日為0;a = datetime.date(2018, 6, 13) a.isoweekday() -- > 3 a.weekday() -- > 2
- 其它常用方法和屬性
-
today():返回當(dāng)前日期;datetime.date.today() -- > datetime.date(2018, 7, 3) -
replace():返回一個(gè)替換指定日期字段的新date對象(不影響原數(shù)據(jù)對象),有3個(gè)可選參數(shù):year/month/day;a = datetime.date(2018, 6, 17) a.replace(day=4) -- > datetime.date(2018, 6, 4) -
max:返回date類能表示的最大的年、月、日的數(shù)值;datetime.date.max -- > datetime.date(9999, 12, 31) -
min:返回date類能表示的最小的年、月、日的數(shù)值。datetime.date.min -- > datetime.date(1, 1, 1)
(三)日期的字符串輸出
-
__str__():返回日期的字符串; -
ctime():返回ctime格式的字符串; -
__format__(...):返回指定格式的日期字符串; -
strftime(...):返回指定格式的日期字符串,與方法3等價(jià);a = datetime.date(2018, 6, 19) a -- > datetime.date(2018, 6, 19) a.__str__() -- > '2018-06-19' a.ctime() -- > 'Tue Jun 19 00:00:00 2018' a.__format__('%Y/%m/%d') -- > '2018/06/19’ a.strftime('%Y-%m-%d') -- > '2018-06-19'
三、time類
(一)類構(gòu)成
- 由時(shí)hour、分鐘minute、秒second、毫秒microsecond、tzinfo五個(gè)變量組成;
- 數(shù)據(jù)訪問:可以通過類中的5個(gè)變量進(jìn)行訪問,也可以用方法
__getattribute__(…)訪問;a = datetime.time(11, 38, 44,900) a -- > datetime.time(11, 38, 44, 900) a.second -- > 44 a.__getattribute__('minute') -- > 38
(二)方法和屬性
- 時(shí)間比較:與date類的比較方法一致,如
__eq__(...),__ge__(...),__gt__(...),__le__(...),__lt__(...),__ne__(…); -
__nonzero__():判斷時(shí)間對象是否非零,返回值為True / False; - 其它常用屬性:1)
max:能表示的最大的時(shí)間數(shù)值;2)min:能表示的最小的時(shí)間數(shù)值;3)resolution:時(shí)間間隔單位為分鐘;datetime.time.max -- > datetime.time(23, 59, 59, 999999) datetime.time.min -- > datetime.time(0, 0) datetime.time.resolution -- > datetime.timedelta(0, 0, 1)
(三)時(shí)間的字符串輸出
-
__str__():返回時(shí)間的字符串; -
isoformat():返回符合ISO標(biāo)準(zhǔn)的時(shí)間字符串; -
__format__(..):返回指定格式的時(shí)間字符串; -
strftime(...):返回指定格式的時(shí)間字符串,與方法3等價(jià);a = datetime.time(12,20,59,899) a datetime.time(12, 20, 59, 899) a.__str__() -- > '12:20:59.000899' a.isoformat() -- > '12:20:59.000899' a.strftime('%H:%M:%S') -- > '12:20:59' a.__format__('%H:%M:%S') -- > '12:20:59'
四、datetime類
(一)類構(gòu)成:
- 可以看做是
date類和time類的合體,大部分的方法和屬性都繼承于這2個(gè)類,其數(shù)據(jù)構(gòu)成也是由這2個(gè)類的所有屬性構(gòu)成。
(二)專屬于datetime的方法和屬性
-
now():返回當(dāng)前日期時(shí)間的datetime對象; -
date():返回datetime對象的日期部分; -
time():返回datetime對象的時(shí)間部分; -
utcnow():返回當(dāng)前日期時(shí)間的UTC的datetime對象;datetime.datetime.now() -- > datetime.datetime(2018, 7, 4, 21, 4, 16, 845663) datetime.datetime.now().date() -- > datetime.date(2018, 7, 4) datetime.datetime.now().time() -- > datetime.time(21, 4, 40, 484204) datetime.datetime.utcnow() -- > datetime.datetime(2018, 7, 4, 14, 22, 28, 841156) -
combine():合并date對象和time對象生成一個(gè)datetime對象a = datetime.date(2018, 6, 29) b = datetime.time(22, 14, 15) c = datetime.datetime.combine(a, b) -- > c datetime.datetime(2018, 6, 29, 22, 14, 15)
五、timedelta類
- 類構(gòu)成:計(jì)算2個(gè)datetime對象的差值;
- 有7個(gè)可選參數(shù),默認(rèn)值為0:
datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, second=0, microsecond=0, milliseconas=0); - 有3個(gè)只讀屬性:1)
timedelta.min:負(fù)數(shù)最大時(shí)間差;2)timedelta.max:正數(shù)最大時(shí)間差;3)timdelta.resolution:兩個(gè)時(shí)間的最小差值;datetime.timedelta.max --> datetime.timedelta(999999999, 86399, 999999) datetime.timedelta.min --> datetime.timedelta(-999999999) datetime.timedelta.resolution --> datetime.timedelta(0, 0, 1)
六、日期計(jì)算
- 獲取當(dāng)前的日期和時(shí)間
datetime.datetime.now() -- > datetime.datetime(2018, 7, 4, 22, 41, 58, 620537) datetime.datetime.now().date() -- > datetime.date(2018, 7, 4) datetime.datetime.now().time() -- > datetime.time(22, 42, 35, 429337) datetime.date.today() -- > datetime.date(2018, 7, 4) - 獲取上個(gè)月第一天和最后一天的日期
# 上個(gè)月最后1天 datetime.date(datetime.date.today().year,datetime.date.today().month,1)- datetime.timedelta(days=1) -- > datetime.date(2018, 6, 30) # 上個(gè)月第1天 datetime.date(datetime.date.today().year,datetime.date.today().month-1,1) -- > datetime.date(2018, 6, 1) - 獲取時(shí)間差
(datetime.date(2018,6,14) - datetime.date(2018, 6, 29)).days -- > -15 (datetime.datetime.now() - datetime.datetime.now()).seconds -- > 86399 - 獲取上周一和周日的日期
# 上周日的日期 datetime.date.today() - datetime.timedelta(days=datetime.date.today().isoweekday()) -- > datetime.date(2018, 7, 1) # 上周一的日期 datetime.date.today() - datetime.timedelta(days=datetime.date.today().isoweekday()+6) -- > datetime.date(2018, 6, 25) - 計(jì)算指定日期當(dāng)前月最后一天的日期和本月天數(shù)
import datetime current_date = datetime.date(2018, 12, 14) def get_date(cur_date): if cur_date.month == 12: next_month_date = datetime.date(cur_date.year + 1, 1, 1) else: next_month_date = datetime.date(cur_date.year, cur_date.month + 1, 1) return next_month_date - datetime.timedelta(days=1) print(get_date(current_date)) -- > 2018-12-31 print(get_date(current_date).day) -- > 31
附錄:Python中時(shí)間日期格式化符號:
| 符號 | 說明 |
|---|---|
| %y | 兩位數(shù)的年份表示(00-99) |
| %Y | 四位數(shù)的年份表示(000-9999) |
| %m | 月份(01-12) |
| %d | 月內(nèi)中的一天(0-31) |
| %H | 24小時(shí)制小時(shí)數(shù)(0-23) |
| %I | 12小時(shí)制小時(shí)數(shù)(01-12) |
| %M | 分鐘數(shù)(00=59) |
| %S | 秒(00-59) |
| %a | 本地簡化星期名稱 |
| %A | 本地完整星期名稱 |
| %b | 本地簡化的月份名稱 |
| %B | 本地完整的月份名稱 |
| %c | 本地相應(yīng)的日期表示和時(shí)間表示 |
| %j | 年內(nèi)的一天(001-366) |
| %p | 本地A.M.或P.M.的等價(jià)符 |
| %U | 一年中的星期數(shù)(00-53),星期天為星期的開始 |
| %w | 星期(0-6),星期天為星期的開始 |
| %W | 一年中的星期數(shù)(00-53),星期一為星期的開始 |
| %x | 本地相應(yīng)的日期表示 |
| %X | 本地相應(yīng)的時(shí)間表示 |
| %Z | 當(dāng)前時(shí)區(qū)的名稱 |
| %% | %號本身 |