• Python datetime模块详解


    作者:cmzsteven

    出处:https://blog.csdn.net/cmzsteven/article/details/64906245

    一、datetime模块介绍

    (一)、datetime模块中包含如下类:

     

    (二)、datetime模块中包含的常量

     

    二、date类

    (一)、date对象构成

    1、date对象由year年份、month月份及day日期三部分构成:

    date(year,month,day)1

    2、 通过year, month, day三个数据描述符可以进行访问:

    >>> a = datetime.date.today()
    >>> a
    datetime.date(2017, 3, 22)
    >>> a.year
    2017
    >>> a.month
    3
    >>> a.day
    22 123456789

    3、当然,你也可以用__getattribute__(...)方法获得上述值:

    >>> a.__getattribute__('year')
    2017
    >>> a.__getattribute__('month')
    3
    >>> a.__getattribute__('day')
    22123456

    (二)、date对象中包含的方法与属性

    1、用于日期比较大小的方法

     

    以上方法的返回值为TrueFalse
    示例如下:

    >>> a=datetime.date(2017,3,1)
    >>> b=datetime.date(2017,3,15)
    >>> a.__eq__(b)
    False
    >>> a.__ge__(b)
    False
    >>> a.__gt__(b)
    False
    >>> a.__le__(b)
    True
    >>> a.__lt__(b)
    True
    >>> a.__ne__(b)
    True1234567891011121314

    2、获得二个日期相差多少天

    使用__sub__(...)和__rsub__(...)方法,其实二个方法差不太多,一个是正向操作,一个是反向操作:

     

    示例如下:

    >>> a
    datetime.date(2017, 3, 22)
    >>> b
    datetime.date(2017, 3, 15)
    >>> a.__sub__(b)
    datetime.timedelta(7)
    >>> a.__rsub__(b)
    datetime.timedelta(-7)12345678

    计算结果的返回值类型为datetime.timedelta, 如果获得整数类型的结果则按下面的方法操作:

    >>> a.__sub__(b).days
    7
    >>> a.__rsub__(b).days
    -71234

    3、ISO标准化日期

    如果想要让所使用的日期符合ISO标准,那么使用如下三个方法:
    1).* isocalendar(...)*:返回一个包含三个值的元组,三个值依次为:year年份,week number周数,weekday星期数(周一为1…周日为7):
    示例如下:

    >>> a = datetime.date(2017,3,22)
    >>> a.isocalendar()
    (2017, 12, 3)
    >>> a.isocalendar()[0]
    2017
    >>> a.isocalendar()[1]
    12
    >>> a.isocalendar()[2]
    3123456789

    2). isoformat(...): 返回符合ISO 8601标准 (YYYY-MM-DD) 的日期字符串;
    示例如下

    >>> a = datetime.date(2017,3,22)
    >>> a.isoformat()
    '2017-03-22'123

    3). isoweekday(...): 返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7)
    示例如下:

    >>> a = datetime.date(2017,3,22)
    >>> a.isoweekday()
    3123

    4).与isoweekday(...)相似的还有一个weekday(...)方法,只不过是weekday(...)方法返回的周一为 0, 周日为 6
    示例如下:

    >>> a = datetime.date(2017,3,22)
    >>> a.weekday()
    2123

    4、其他方法与属性

    1). timetuple(...):该方法为了兼容time.localtime(...)返回一个类型为time.struct_time的数组,但有关时间的部分元素值为0:

    >>> a = datetime.date(2017,3,22)
    >>> a.timetuple()
    time.struct_time(tm_year=2017, tm_mon=3, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=81, tm_isdst=-1)
    >>> a.timetuple().tm_year
    2017
    >>> a.timetuple().tm_mon
    3
    >>> a.timetuple().tm_mday
    22123456789

    2).toordinal(...): 返回公元公历开始到现在的天数。公元1年1月1日为1

    >>> a = datetime.date(2017,3,22)
    >>> a.toordinal()
    736410123

    3). replace(...):返回一个替换指定日期字段的新date对象。参数3个可选参数,分别为year,month,day。注意替换是产生新对象,不影响原date对象。

    >>> a = datetime.date(2017,3,22)
    >>> b = a.replace(2017,2,28)
    >>> a
    datetime.date(2017, 3, 22)
    >>> b
    datetime.date(2017, 2, 28)123456

    4).resolution:date对象表示日期的最小单位。这里是天。

    >>> datetime.date.resolution
    datetime.timedelta(1)12

    5).fromordinal(...):将Gregorian日历时间转换为date对象;Gregorian Calendar :一种日历表示方法,类似于我国的农历,西方国家使用比较多。

    >>> a = datetime.date(2017,3,22)
    >>> b = a.toordinal()
    >>> datetime.date.fromordinal(b)
    datetime.date(2017, 3, 22)1234

    6).fromtimestamp(...):根据给定的时间戮,返回一个date对象

    >>> time.time()
    1490165087.2242179
    >>> datetime.date.fromtimestamp(time.time())
    datetime.date(2017, 3, 22)1234

    7).today(...):返回当前日期

    >>> datetime.date.today()
    datetime.date(2017, 3, 22)12

    8).max: date类能表示的最大的年、月、日的数值

    >>> datetime.date.max
    datetime.date(9999, 12, 31)12

    9).min: date类能表示的最小的年、月、日的数值

    >>> datetime.date.min
    datetime.date(1, 1, 1)12

    (三)、日期的字符串输出

    1、如果你想将日期对象转化为字符串对象的话,可以用到__format__(...)方法以指定格式进行日期输出:

    >>> a = datetime.date(2017,3,22)
    >>> a.__format__('%Y-%m-%d')
    '2017-03-22'
    >>> a.__format__('%Y/%m/%d')
    '2017/03/22'
    >>> a.__format__('%y/%m/%d')
    '17/03/22'
    >>> a.__format__('%D')
    '03/22/17'123456789

    与此方法等价的方法为strftime(...)

    >>> a.strftime("%Y%m%d")
    '20170322'12

    关于格式化字符串的相关内容,请查阅本文最后的:附录:python中时间日期格式化符号
    2、如果只是相简单的获得日期的字符串,则使用__str__(...)

    >>> a.__str__()
    '2017-03-22'12

    3、如果想要获得ctime样式的格式请使用ctime(...):

    >>> a.ctime()
    'Wed Mar 22 00:00:00 2017'
    123

    三、time类

    (一)、time类的数据构成

    time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo五部分组成

    time([hour[, minute[, second[, microsecond[, tzinfo]]]]])1

    相应的,time类中就有上述五个变量来存储应该的值:

    >>> a = datetime.time(12,20,59,899)
    >>> a
    datetime.time(12, 20, 59, 899)
    >>> a.hour
    12
    >>> a.minute
    20
    >>> a.second
    59
    >>> a.microsecond
    899
    >>> a.tzinfo123456789101112

    与date类一样,time类也包含__getattribute__(...)方法可以读取相关属性:

    >>> a.__getattribute__('hour')
    12
    >>> a.__getattribute__('minute')
    20
    >>> a.__getattribute__('second')
    59123456

    (二)、time类中的方法和属性

    1、比较时间大小

    相关方法包括:__eq__(...), __ge__(...), __gt__(...), __le__(...), __lt__(...), __ne__(...)
    这里的方法与date类中定义的方法大同小异,使用方法与一样,这里就不过多介绍了,示例如下:

    >>> a = datetime.time(12,20,59,899)
    >>> b = datetime.time(11,20,59,889)
    >>> a.__eq__(b)
    False
    >>> a.__ne__(b)
    True
    >>> a.__ge__(b)
    True
    >>> a.__gt__(b)
    True
    >>> a.__le__(b)
    False
    >>> a.__lt__(b)
    False1234567891011121314

    2、__nonzero__(...)

    判断时间对象是否非零,返回值为True/False:

    >>> a = datetime.time(12,20,59,899)
    >>> a.__nonzero__()
    True123

    3、其他属性

    1)、max:最大的时间表示数值:

    >>> datetime.time.max
    datetime.time(23, 59, 59, 999999)12

    2)、min:最小的时间表示数值

    >>> datetime.time.min
    datetime.time(0, 0)12

    3)、resolution:时间间隔单位为分钟

    >>> datetime.time.resolution
    datetime.timedelta(0, 0, 1)12

    (三)、时间的字符串输出

    1、如果你想将时间对象转化为字符串对象的话,可以用到__format__(...)方法以指定格式进行时间输出:

    >>> a = datetime.time(12,20,59,899)
    >>> a.__format__('%H:%M:%S')
    '12:20:59'123

    与此方法等价的方法为strftime(...)

    >>> a = datetime.time(12,20,59,899)
    >>> a.strftime('%H:%M:%S')
    '12:20:59'123

    关于格式化字符串的相关内容,请查阅本文最后的:附录:python中时间日期格式化符号
    2、ISO标准输出
    如果要使输出的时间字符符合ISO标准,请使用isoformat(...):

    >>> a = datetime.time(12,20,59,899)
    >>> a.isoformat()
    '12:20:59.000899'123

    3、如果只是相简单的获得时间的字符串,则使用__str__(...)

    >>> a = datetime.time(12,20,59,899)
    >>> a.__str__()
    '12:20:59.000899'123

    四、datetime类

    (一)、datetime类的数据构成

    datetime类其实是可以看做是date类和time类的合体,其大部分的方法和属性都继承于这二个类,相关的操作方法请参阅,本文上面关于二个类的介绍。其数据构成也是由这二个类所有的属性所组成的。

    datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])1

    (二)、专属于datetime的方法和属性

    1、 date(…):返回datetime对象的日期部分:

    >>> a = datetime.datetime.now()
    >>> a
    datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
    >>> a.date()
    datetime.date(2017, 3, 22)12345

    2、time(…):返回datetime对象的时间部分:

    >>> a = datetime.datetime.now()
    >>> a
    datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
    >>> a.time()
    datetime.time(16, 9, 33, 494248)12345

    3、utctimetuple(…):返回UTC时间元组:

    >>> a = datetime.datetime.now()
    >>> a
    datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
    >>> a.utctimetuple()
    time.struct_time(tm_year=2017, tm_mon=3, tm_mday=22, tm_hour=16, tm_min=9, tm_sec=33, tm_wday=2, tm_yday=81, tm_isdst=0)12345

    4、combine(…):将一个date对象和一个time对象合并生成一个datetime对象:

    >>> a = datetime.datetime.now()
    >>> a
    datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
    >>>datetime.datetime.combine(a.date(),a.time())
    datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)12345

    5、now(…):返回当前日期时间的datetime对象:

    >>> a = datetime.datetime.now()
    >>> a
    datetime.datetime(2017, 3, 22, 16, 9, 33, 123

    6、utcnow(…):返回当前日期时间的UTC datetime对象:

    >>> a = datetime.datetime.utcnow()
    >>> a
    datetime.datetime(2017, 3, 22, 8, 26, 54, 935242)123

    7、strptime(…):根据string, format 2个参数,返回一个对应的datetime对象:

    >>> datetime.datetime.strptime('2017-3-22 15:25','%Y-%m-%d %H:%M')
    datetime.datetime(2017, 3, 22, 15, 25)12

    8、utcfromtimestamp(…):UTC时间戳的datetime对象,时间戳值为time.time():

    >>> datetime.datetime.utcfromtimestamp(time.time())
    datetime.datetime(2017, 3, 22, 8, 29, 7, 654272)12

    五、timedelta类

    timedelta类是用来计算二个datetime对象的差值的。
    此类中包含如下属性:
    1、days:天数
    2、microseconds:微秒数(>=0 并且 <1秒)
    3、seconds:秒数(>=0 并且 <1天)

    六、日期计算实操

    1.获取当前日期时间:

    >>> now = datetime.datetime.now()
    >>> now
    datetime.datetime(2017, 3, 22, 16, 55, 49, 148233)
    >>> today = datetime.date.today()
    >>> today
    datetime.date(2017, 3, 22)
    >>> now.date()
    datetime.date(2017, 3, 22)
    >>> now.time()
    datetime.time(16, 55, 49, 148233)12345678910

    2.获取上个月第一天和最后一天的日期: 

    >>> today = datetime.date.today()
    >>> today
    datetime.date(2017, 3, 22)
    >>> mlast_day = datetime.date(today.year, today.month, 1) - datetime.timedelta(1)
    >>> mlast_day
    datetime.date(2017, 2, 28)
    >>> mfirst_day = datetime.date(mlast_day.year, mlast_day.month, 1)
    >>> mfirst_day
    datetime.date(2017, 2, 1)123456789

    3.获取时间差

    时间差单位为秒

    >>> start_time = datetime.datetime.now()
    >>> end_time = datetime.datetime.now()
    >>> (end_time - start_time).seconds
    71234

    差值不只是可以查看相差多少秒,还可以查看天(days), 秒(seconds), 微秒(microseconds).

    4.计算当前时间向后8个小时的时间

    >>> d1 = datetime.datetime.now()
    >>> d2 = d1 + datetime.timedelta(hours = 8)
    >>> d2
    datetime.datetime(2017, 3, 23, 1, 10, 37, 182240)1234

    可以计算: 天(days), 小时(hours), 分钟(minutes), 秒(seconds), 微秒(microseconds).

    5.计算上周一和周日的日期

    today = datetime.date.today()
    >>> today
    datetime.date(2017, 3, 23)
    >>> today_weekday = today.isoweekday()
    >>> last_sunday = today - datetime.timedelta(days=today_weekday)
    >>> last_monday = last_sunday - datetime.timedelta(days=6)
    >>> last_sunday
    datetime.date(2017, 3, 19)
    >>> last_monday
    datetime.date(2017, 3, 13)12345678910

    6.计算指定日期当月最后一天的日期和本月天数

    >>> date = datetime.date(2017,12,20)
    >>> def eomonth(date_object):
    ... if date_object.month == 12:
    ... next_month_first_date = datetime.date(date_object.year+1,1,1)
    ... else:
    ... next_month_first_date = datetime.date(date_object.year, date_object.month+1, 1)
    ... return next_month_first_date - datetime.timedelta(1)
    ...
    >>> eomonth(date)
    datetime.date(2017, 12, 31)
    >>> eomonth(date).day
    31123456789101112

    7.计算指定日期下个月当天的日期

    这里要调用上一项中的函数eomonth(...)

    >>> date = datetime.date(2017,12,20)
    >>> def edate(date_object):
    ... if date_object.month == 12:
    ... next_month_date = datetime.date(date_object.year+1, 1,date_object.day)
    ... else:
    ... next_month_first_day = datetime.date(date_object.year,date_object.month+1,1)
    ... if date_object.day > eomonth(last_month_first_day).day:
    ... next_month_date = datetime.date(date_object.year,date_object.month+1,eomonth(last_month_first_day).day)
    ... else:
    ... next_month_date = datetime.date(date_object.year, date_object.month+1, date_object.day)
    ... return next_month_date
    ...
    >>> edate(date)
    datetime.date(2018, 1, 20)1234567891011121314

    8.获得本周一至今天的时间段并获得上周对应同一时间段

    >>> today = datetime.date.today()
    >>> this_monday = today - datetime.timedelta(today.isoweekday()-1)
    >>> last_monday = this_monday - datetime.timedelta(7)
    >>> last_weekday = today -datetime.timedelta(7)
    >>> this_monday
    datetime.date(2017, 3, 20)
    >>> today
    datetime.date(2017, 3, 23)
    >>> last_monday
    datetime.date(2017, 3, 13)
    >>> last_weekday
    datetime.date(2017, 3, 16)123456789101112

  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/-wenli/p/11257149.html
Copyright © 2020-2023  润新知