Python中時間處理datetime包

推薦使用arrow包進行日期和時間處理吩蔑,其方法更簡單丁稀、更容易理解~


一躲因、模塊介紹


  1. datetime模塊包含5個類對象
類名 功能說明
date 日期對象盏檐,常用屬性:year蜗巧、month睹簇、day
time 時間對象奏赘,常用屬性:hour、second太惠、minute
datetime 日期時間對象磨淌,常用的屬性:hour、minute凿渊、year梁只、day等
timedelta 時間間隔對象,即兩個時間點之間的長度
tzinfo 時區(qū)信息對象
  1. datetime模塊包含2個常量
常量 功能說明 用法 返回值
MAXYEAR 返回能表示的最大年份 datetime.MAXYEAR 9999
MINYEAR 返回能表示的最小年份 datetime.MINYEAR 1
  1. Python標準庫提供的datetime和time側(cè)重點不同埃脏,time更加側(cè)重于linux時間戳搪锣。

二、date類


(一)類構(gòu)成

  1. date由year年份彩掐、month月份构舟、day日期三部分構(gòu)成;
  2. 通過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
    
  3. 通過屬性__getattribute__(…)進行數(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對象都會被認為是True弹澎,也就是 if date 這個判斷永遠是成立的。

(二)方法與屬性

  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標準化日期
  • 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
    
  1. 其它常用方法和屬性
  • 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)
    

(三)日期的字符串輸出

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

  1. 由時hour诵冒、分鐘minute、秒second谊惭、毫秒microsecond汽馋、tzinfo五個變量組成;
  2. 數(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
    

(二)方法和屬性

  1. 時間比較:與date類的比較方法一致,如__eq__(...)药磺,__ge__(...)告组,__gt__(...)__le__(...)癌佩,__lt__(...)木缝,__ne__(…)便锨;
  2. __nonzero__():判斷時間對象是否非零,返回值為True / False我碟;
  3. 其它常用屬性: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)
    

(三)時間的字符串輸出

  1. __str__():返回時間的字符串吱殉;
  2. isoformat():返回符合ISO標準的時間字符串;
  3. __format__(..):返回指定格式的時間字符串厘托;
  4. 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的方法和屬性

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


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


六沐兰、日期計算


  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)
    
  2. 獲取上個月第一天和最后一天的日期
    # 上個月最后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)
    
  3. 獲取時間差
    (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. 計算指定日期當前月最后一天的日期和本月天數(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ū)的名稱
%% %號本身
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓜浸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子比原,更是在濱河造成了極大的恐慌插佛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量窘,死亡現(xiàn)場離奇詭異雇寇,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門锨侯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫩海,“玉大人,你說我怎么就攤上這事囚痴∪郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵深滚,是天一觀的道長奕谭。 經(jīng)常有香客問我,道長痴荐,這世上最難降的妖魔是什么血柳? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮生兆,結(jié)果婚禮上混驰,老公的妹妹穿的比我還像新娘。我一直安慰自己皂贩,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布昆汹。 她就那樣靜靜地躺著明刷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪满粗。 梳的紋絲不亂的頭發(fā)上辈末,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音映皆,去河邊找鬼挤聘。 笑死,一個胖子當著我的面吹牛捅彻,可吹牛的內(nèi)容都是我干的组去。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼步淹,長吁一口氣:“原來是場噩夢啊……” “哼从隆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缭裆,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤键闺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澈驼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辛燥,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挎塌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徘六。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勃蜘,靈堂內(nèi)的尸體忽然破棺而出硕噩,到底是詐尸還是另有隱情,我是刑警寧澤缭贡,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布炉擅,位于F島的核電站,受9級特大地震影響阳惹,放射性物質(zhì)發(fā)生泄漏谍失。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一莹汤、第九天 我趴在偏房一處隱蔽的房頂上張望快鱼。 院中可真熱鬧,春花似錦纲岭、人聲如沸抹竹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窃判。三九已至,卻和暖如春喇闸,著一層夾襖步出監(jiān)牢的瞬間袄琳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工燃乍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唆樊,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓刻蟹,卻偏偏與公主長得像逗旁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子座咆,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

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