Python中时间处理datetime包

推荐使用arrow包进行日期和时间处理,其方法更简单、更容易理解~


一、模块介绍


  1. datetime模块包含5个类对象
类名 功能说明
date 日期对象,常用属性:year、month、day
time 时间对象,常用属性:hour、second、minute
datetime 日期时间对象,常用的属性:hour、minute、year、day等
timedelta 时间间隔对象,即两个时间点之间的长度
tzinfo 时区信息对象
  1. datetime模块包含2个常量
常量 功能说明 用法 返回值
MAXYEAR 返回能表示的最大年份 datetime.MAXYEAR 9999
MINYEAR 返回能表示的最小年份 datetime.MINYEAR 1
  1. Python标准库提供的datetime和time侧重点不同,time更加侧重于linux时间戳。

二、date类


(一)类构成

  1. date由year年份、month月份、day日期三部分构成;
  2. 通过year/month/day进行数据访问;
    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__(…)进行数据访问
    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周数、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标准的指定日期所在的星期数(周一为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对象(不影响原数据对象),有3个可选参数:year/month/day;
    a = datetime.date(2018, 6, 17)
    a.replace(day=4)
    -- > datetime.date(2018, 6, 4)
    
  • max :返回date类能表示的最大的年、月、日的数值;
    datetime.date.max
    -- > datetime.date(9999, 12, 31)
    
  • min:返回date类能表示的最小的年、月、日的数值。
    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类


(一)类构成

  1. 由时hour、分钟minute、秒second、毫秒microsecond、tzinfo五个变量组成;
  2. 数据访问:可以通过类中的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:能表示的最大的时间数值;2)min:能表示的最小的时间数值;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类


(一)类构成:

  • 可以看做是date类和time类的合体,大部分的方法和属性都继承于这2个类,其数据构成也是由这2个类的所有属性构成。

(二)专属于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. 类构成:计算2个datetime对象的差值;
  2. 有7个可选参数,默认值为0:datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, second=0, microsecond=0, milliseconas=0)
  3. 有3个只读属性:1)timedelta.min:负数最大时间差;2)timedelta.max:正数最大时间差;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. 计算指定日期当前月最后一天的日期和本月天数
    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 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53),星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53),星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 原文链接:http://www.cnblogs.com/lhj588/archive/2012/04/23/246...
    qtruip阅读 1,271评论 0 0
  • 醉里挑灯看剑,梦回吹角连营。八百里分麾下炙,五十弦翻塞外声。沙场秋点兵。马作的卢飞快,弓如霹雳弦惊。了却君王天下事...
    SlashBoyMr_wang阅读 1,942评论 0 1
  • Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime。time模块我在之...
    晓函阅读 1,363评论 0 0
  • datetime库概述 datetime库定义了2个常量和5个类。 2个常量分别是MINYEAR=1和MAXYEA...
    Shenjiming阅读 20,215评论 0 15
  • 又到了改交房租和学费的日子,看看自己银行卡里的那点余额,重重的叹了口气。心想:不得不又伸手给我妈要钱了啊。 不知为...
    柚子溪阅读 140评论 0 0