Python中時(shí)間處理datetime包

推薦使用arrow包進(jìn)行日期和時(shí)間處理,其方法更簡單、更容易理解~


一、模塊介紹


  1. 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ū)信息對象
  1. datetime模塊包含2個(gè)常量
常量 功能說明 用法 返回值
MAXYEAR 返回能表示的最大年份 datetime.MAXYEAR 9999
MINYEAR 返回能表示的最小年份 datetime.MINYEAR 1
  1. Python標(biāo)準(zhǔn)庫提供的datetime和time側(cè)重點(diǎn)不同,time更加側(cè)重于linux時(shí)間戳。

二、date類


(一)類構(gòu)成

  1. date由year年份、month月份、day日期三部分構(gòu)成;
  2. 通過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
    
  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
    
  4. date可以作為字典的key,所有的date對象都會(huì)被認(rèn)為是True,也就是 if date 這個(gè)判斷永遠(yuǎn)是成立的。

(二)方法與屬性

  1. 日期比較:返回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
  1. 日期差:返回值類型為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
  1. 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
    
  1. 其它常用方法和屬性
  • 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)
    

(三)日期的字符串輸出

  1. __str__():返回日期的字符串;
  2. ctime():返回ctime格式的字符串;
  3. __format__(...):返回指定格式的日期字符串;
  4. 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)成

  1. 由時(shí)hour、分鐘minute、秒second、毫秒microsecond、tzinfo五個(gè)變量組成;
  2. 數(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
    

(二)方法和屬性

  1. 時(shí)間比較:與date類的比較方法一致,如__eq__(...)__ge__(...)__gt__(...),__le__(...)__lt__(...),__ne__(…);
  2. __nonzero__():判斷時(shí)間對象是否非零,返回值為True / False;
  3. 其它常用屬性: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í)間的字符串輸出

  1. __str__():返回時(shí)間的字符串;
  2. isoformat():返回符合ISO標(biāo)準(zhǔn)的時(shí)間字符串;
  3. __format__(..):返回指定格式的時(shí)間字符串;
  4. 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的方法和屬性

  1. now():返回當(dāng)前日期時(shí)間的datetime對象;
  2. date():返回datetime對象的日期部分;
  3. time():返回datetime對象的時(shí)間部分;
  4. 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)
    
  5. 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類


  1. 類構(gòu)成:計(jì)算2個(gè)datetime對象的差值;
  2. 有7個(gè)可選參數(shù),默認(rèn)值為0:datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, second=0, microsecond=0, milliseconas=0)
  3. 有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ì)算


  1. 獲取當(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)
    
  2. 獲取上個(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)
    
  3. 獲取時(shí)間差
    (datetime.date(2018,6,14) - datetime.date(2018, 6, 29)).days
    -- > -15
    
    (datetime.datetime.now() - datetime.datetime.now()).seconds
    -- > 86399
    
  4. 獲取上周一和周日的日期
    # 上周日的日期
    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)
    
  5. 計(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ū)的名稱
%% %號本身
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文鏈接:http://www.cnblogs.com/lhj588/archive/2012/04/23/246...
    qtruip閱讀 1,415評論 0 0
  • 醉里挑燈看劍,夢回吹角連營。八百里分麾下炙,五十弦翻塞外聲。沙場秋點(diǎn)兵。馬作的盧飛快,弓如霹靂弦驚。了卻君王天下事...
    SlashBoyMr_wang閱讀 2,054評論 0 2
  • Python提供了多個(gè)內(nèi)置模塊用于操作日期時(shí)間,像calendar,time,datetime。time模塊我在之...
    曉函閱讀 1,434評論 0 0
  • datetime庫概述 datetime庫定義了2個(gè)常量和5個(gè)類。 2個(gè)常量分別是MINYEAR=1和MAXYEA...
    Shenjiming閱讀 20,767評論 0 15
  • 又到了改交房租和學(xué)費(fèi)的日子,看看自己銀行卡里的那點(diǎn)余額,重重的嘆了口氣。心想:不得不又伸手給我媽要錢了啊。 不知為...
    柚子溪閱讀 202評論 0 0

友情鏈接更多精彩內(nèi)容