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 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 当前时区的名称
%% %号本身

你可能感兴趣的:(Python中时间处理datetime包)