推薦使用arrow
包進行日期和時間處理吩蔑,其方法更簡單丁稀、更容易理解~
一躲因、模塊介紹
- datetime模塊包含5個類對象
類名 | 功能說明 |
---|---|
date | 日期對象盏檐,常用屬性:year蜗巧、month睹簇、day |
time | 時間對象奏赘,常用屬性:hour、second太惠、minute |
datetime | 日期時間對象磨淌,常用的屬性:hour、minute凿渊、year梁只、day等 |
timedelta | 時間間隔對象,即兩個時間點之間的長度 |
tzinfo | 時區(qū)信息對象 |
- datetime模塊包含2個常量
常量 | 功能說明 | 用法 | 返回值 |
---|---|---|---|
MAXYEAR | 返回能表示的最大年份 | datetime.MAXYEAR | 9999 |
MINYEAR | 返回能表示的最小年份 | datetime.MINYEAR | 1 |
- Python標準庫提供的datetime和time側(cè)重點不同埃脏,time更加側(cè)重于linux時間戳搪锣。
二、date類
(一)類構(gòu)成
-
date
由year年份彩掐、month月份构舟、day日期三部分構(gòu)成; - 通過
year/month/day
進行數(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__(…)
進行數(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對象都會被認為是True弹澎,也就是 if date 這個判斷永遠是成立的。
(二)方法與屬性
- 日期比較:返回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標準化日期
-
isocalendar()
:返回包含三個值的元組努咐,分別為: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標準(YYYY-MM-DD)
的日期字符串;a = datetime.date(2018, 6, 27) a.isoformat() -- > '2018-06-27'
-
isoweekday()
:返回符合ISO標準的指定日期所在的星期數(shù)(周一為1免胃、周日為7),weekday()方法以周日為0惫撰;a = datetime.date(2018, 6, 13) a.isoweekday() -- > 3 a.weekday() -- > 2
- 其它常用方法和屬性
-
today()
:返回當前日期羔沙;datetime.date.today() -- > datetime.date(2018, 7, 3)
-
replace()
:返回一個替換指定日期字段的新date對象(不影響原數(shù)據(jù)對象),有3個可選參數(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等價;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)成
- 由時hour诵冒、分鐘minute、秒second谊惭、毫秒microsecond汽馋、tzinfo五個變量組成;
- 數(shù)據(jù)訪問:可以通過類中的5個變量進行訪問圈盔,也可以用方法
__getattribute__(…)
訪問豹芯;a = datetime.time(11, 38, 44,900) a -- > datetime.time(11, 38, 44, 900) a.second -- > 44 a.__getattribute__('minute') -- > 38
(二)方法和屬性
- 時間比較:與date類的比較方法一致,如
__eq__(...)
药磺,__ge__(...)
告组,__gt__(...)
,__le__(...)
癌佩,__lt__(...)
木缝,__ne__(…)
便锨; -
__nonzero__()
:判斷時間對象是否非零,返回值為True / False我碟; - 其它常用屬性:1)
max
:能表示的最大的時間數(shù)值放案;2)min
:能表示的最小的時間數(shù)值;3)resolution
:時間間隔單位為分鐘矫俺;datetime.time.max -- > datetime.time(23, 59, 59, 999999) datetime.time.min -- > datetime.time(0, 0) datetime.time.resolution -- > datetime.timedelta(0, 0, 1)
(三)時間的字符串輸出
-
__str__()
:返回時間的字符串吱殉; -
isoformat()
:返回符合ISO標準的時間字符串; -
__format__(..)
:返回指定格式的時間字符串厘托; -
strftime(...)
:返回指定格式的時間字符串友雳,與方法3等價;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個類,其數(shù)據(jù)構(gòu)成也是由這2個類的所有屬性構(gòu)成包斑。
(二)專屬于datetime的方法和屬性
-
now()
:返回當前日期時間的datetime對象流礁; -
date()
:返回datetime對象的日期部分; -
time()
:返回datetime對象的時間部分罗丰; -
utcnow()
:返回當前日期時間的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對象生成一個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)成:計算2個datetime對象的差值萌抵;
- 有7個可選參數(shù)找御,默認值為0:
datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, second=0, microsecond=0, milliseconas=0)
; - 有3個只讀屬性:1)
timedelta.min
:負數(shù)最大時間差谜嫉;2)timedelta.max
:正數(shù)最大時間差萎坷;3)timdelta.resolution
:兩個時間的最小差值;datetime.timedelta.max --> datetime.timedelta(999999999, 86399, 999999) datetime.timedelta.min --> datetime.timedelta(-999999999) datetime.timedelta.resolution --> datetime.timedelta(0, 0, 1)
六沐兰、日期計算
- 獲取當前的日期和時間
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)
- 獲取上個月第一天和最后一天的日期
# 上個月最后1天 datetime.date(datetime.date.today().year,datetime.date.today().month,1)- datetime.timedelta(days=1) -- > datetime.date(2018, 6, 30) # 上個月第1天 datetime.date(datetime.date.today().year,datetime.date.today().month-1,1) -- > datetime.date(2018, 6, 1)
- 獲取時間差
(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)
- 計算指定日期當前月最后一天的日期和本月天數(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中時間日期格式化符號:
符號 | 說明 |
---|---|
%y | 兩位數(shù)的年份表示(00-99) |
%Y | 四位數(shù)的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月內(nèi)中的一天(0-31) |
%H | 24小時制小時數(shù)(0-23) |
%I | 12小時制小時數(shù)(01-12) |
%M | 分鐘數(shù)(00=59) |
%S | 秒(00-59) |
%a | 本地簡化星期名稱 |
%A | 本地完整星期名稱 |
%b | 本地簡化的月份名稱 |
%B | 本地完整的月份名稱 |
%c | 本地相應的日期表示和時間表示 |
%j | 年內(nèi)的一天(001-366) |
%p | 本地A.M.或P.M.的等價符 |
%U | 一年中的星期數(shù)(00-53)哆档,星期天為星期的開始 |
%w | 星期(0-6),星期天為星期的開始 |
%W | 一年中的星期數(shù)(00-53)住闯,星期一為星期的開始 |
%x | 本地相應的日期表示 |
%X | 本地相應的時間表示 |
%Z | 當前時區(qū)的名稱 |
%% | %號本身 |