常用模块 - datetime模块
一、简介
datetime是Python处理日期和时间的标准库。
1、datetime模块中常用的类:
类名 |
功能说明 |
date |
日期对象,常用的属性有year, month, day |
time |
时间对象 |
datetime |
日期时间对象,常用的属性有hour, minute, second |
2、datetime模块中包含的常量
常量 |
功能说明 |
用法 |
返回值 |
MAXYEAR |
返回能表示的最大年份 |
datetime.MAXYEAR |
9999 |
MINYEAR |
返回能表示的最小年份 |
datetime.MINYEAR |
1 |
二、date类
(一)、date对象构成
1、date对象由year年份、month月份及day日期三部分构成:
>>> datetime.date(2018, 5, 1) datetime.date(2018, 5, 1)
2、通过year, month, day三个数据描述符可以进行访问:
>>> date_today = datetime.date.today() >>> date_today datetime.date(2018, 4, 25) >>> date_today.year 2018 >>> date_today.month 4 >>> date_today.day 25 >>>
3、也可以用__getattribute__()方法获得上年、月、日的值:
>>> date_today.__getattribute__("year") 2018 >>> date_today.__getattribute__("month") 4 >>> date_today.__getattribute__("day") 25 >>>
(二)、date对象中包含的方法与属性
1、用于日期比较大小的方法
方法名 |
方法说明 |
用法 |
__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__() |
__ne__() |
是否不等于(x!=y) |
x.__ne__(y) |
注:以上方法的返回值为True或者False
示例代码如下:
>>> a = datetime.date(2018, 4, 25) >>> b = datetime.date(2018, 5, 1) >>> a.__eq__(b) False >>> a.__ge__(b) False >>> a.__gt__(b) False >>> a.__le__(b) True >>> a.__lt__(b) True >>> a.__ne__(b) True >>>
2、获得两个日期相关多少天
使用__sub__()和__rsub__()方法,其实两个方法差不太多,一个是正向操作,一个是反向操作:
方法名 |
方法说明 |
用法 |
__sub__() |
x - y |
x.__sub__(y) |
__rsub__() |
y - x |
x.__rsub__(y) |
示例代码如下:
>>> a = datetime.date(2018, 4, 25) >>> b = datetime.date(2018, 5, 1) >>> a.__sub__(b) datetime.timedelta(-6) >>> a.__rsub__(b) datetime.timedelta(6) >>>
计算结果的返回值类型为datetime.timedelta,如果想获得整数类型的结果,其操作如下:
>>> a.__sub__(b).days -6 >>> a.__rsub__(b).days 6 >>>
3、ISO标准化日期
如果想要让所使用的日期符合ISO标准,那么使用如下四个方法:
1)、isocalendar():返回一个包含三个值的元组,三个值依次为year年份、week number周数、weekday星期数(周一为1…周日为7)
示例代码如下:
>>> date_today = datetime.date.today() >>> date_today.isocalendar() (2018, 17, 3) >>> date_today.isocalendar()[0] 2018 >>> date_today.isocalendar()[1] 17 >>> date_today.isocalendar()[2] 3 >>>
2)、isoformat():返回符合ISO标准(YYYY-MM-DD)的日期字符串
示例代码如下:
>>> date_today = datetime.date.today() >>> date_today.isoformat() '2018-04-25' >>>
3)、isoweekday():返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7)
示例代码如下:
>>> date_today = datetime.date.today() >>> date_today.isoweekday() 3 >>>
4)、weekday():与isoweekday()相似,只不过是weekday()方法返回的是周一为0,周日为6
示例代码如下:
>>> date_today = datetime.date.today() >>> date_today.weekday() 2 >>>
4、其他方法与属性
1)、timetuple():该方法为了兼容time.localtime()返回一个类型为time.struct_time的数组,但跟时间相关的部分元素值为0
>>> date_today = datetime.date.today() >>> date_today.timetuple() time.struct_time(tm_year=2018, tm_mon=4, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=115, tm_isdst=-1) >>> date_today.timetuple().tm_year 2018 >>> date_today.timetuple().tm_mon 4 >>> date_today.timetuple().tm_mday 25 >>>
2)、toordinal():返回公元公历开始到现在的天数。公元1年1月1日为1
>>> date_today = datetime.date.today() >>> date_today.toordinal() 736809 >>>
3)、replace():返回一个替换指定日期字段的新date对象。参数3个可选参数,分别为year, month, day。需注意替换是产生新对象,不会影响原date对象
>>> date_today = datetime.date.today() >>> date_today datetime.date(2018, 4, 25) >>> new_date = date_today.replace(2017) >>> new_date datetime.date(2017, 4, 25) >>> date_today datetime.date(2018, 4, 25) >>> new_date = date_today.replace(2016, 5, 1) >>> new_date datetime.date(2016, 5, 1) >>> date_today datetime.date(2018, 4, 25) >>>
4)、resolution:date对象表示日期的最小单位。这里是天
>>> datetime.date.resolution datetime.timedelta(1) >>>
5)、fromordinal():将整型数字(从公元公历开始的天数)转换成date对象
>>> date_for_int = date_today.fromordinal(736809) >>> date_for_int datetime.date(2018, 4, 25)
6)、fromtimestamp():根据给定的时间戳,返回一个date对象
>>> time.time() 1524625600.0626569 >>> datetime.date.fromtimestamp(time.time()) datetime.date(2018, 4, 25) >>>
7)、today():返回当前日期
>>> datetime.date.today() datetime.date(2018, 4, 25) >>>
8)、max:date类能表示的最大年、月、日的数值
>>> datetime.date.max datetime.date(9999, 12, 31) >>>
9)、min:date类能表示的最小的年、月、日的数值
>>> datetime.date.min datetime.date(1, 1, 1) >>>
(三)、日期的字符串输出
1、__format__():将日期对象转化为指定格式的字符串
>>> date_today = datetime.date.today() >>> date_today.__format__("%Y-%m-%d") '2018-04-25' >>> date_today.__format__("%Y/%m/%d") '2018/04/25' >>> date_today.__format__("%y/%m/%d") '18/04/25' >>> date_today.__format__("%D") '04/25/18' >>>
与此方法等价的方法为strftime()
>>> date_today = datetime.date.today() >>> date_today.strftime("%Y-%m-%d") '2018-04-25' >>> date_today.strftime("%Y/%m/%d") '2018/04/25' >>> date_today.strftime("%y/%m/%d") '18/04/25' >>> date_today.strftime("%D") '04/25/18' >>>
关于时间日期格式化符号见文末的时间日期格式化符号表。
2、__str__():简单的获得日期的字符串
>>> date_today = datetime.date.today() >>> date_today.__str__() '2018-04-25' >>>
3、ctime():获得ctime样式的格式
>>> date_today = datetime.date.today() >>> date_today.ctime() 'Wed Apr 25 00:00:00 2018' >>>
三、time类
(一)、time类的数据构成
time类由hour小时、minute分钟、second秒钟、microsecond毫秒和tzinfo时区五部分组成
time([hour[, minute[, second[, microsecond[, tzinfo]]]]])
相应的,time类中就有上述五个变量来存储对应的值:
>>> temp_time = datetime.time(13, 54, 43, 801) >>> temp_time datetime.time(13, 54, 43, 801) >>> temp_time.hour 13 >>> temp_time.minute 54 >>> temp_time.second 43 >>> temp_time.microsecond 801 >>> temp_time.tzinfo >>>
与date类一样,time类也包含__getattribute__()方法可以读取相应属性:
>>> temp_time = datetime.time(13, 54, 43, 801) >>> temp_time.__getattribute__('hour') 13 >>> temp_time.__getattribute__('minute') 54 >>> temp_time.__getattribute__('second') 43 >>> temp_time.__getattribute__('microsecond') 801 >>> temp_time.__getattribute__('tzinfo') >>>
(二)、time类中的方法和属性
1、用于比较时间大小的方法
方法名 |
方法说明 |
用法 |
__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__() |
__ne__() |
是否不等于(x!=y) |
x.__ne__(y) |
注:以上方法的返回值为True或者False
示例代码如下:
>>> a = datetime.time(12, 20, 59, 899) >>> b = datetime.time(11, 20, 59, 899) >>> a.__eq__(b) False >>> a.__ge__(b) True >>> a.__gt__(b) True >>> a.__le__(b) False >>> a.__lt__(b) False >>> a.__ne__(b) True >>>
2、其他属性
1)、max:最大的时间表示数值:
>>> datetime.time.max datetime.time(23, 59, 59, 999999) >>>
2)、min:最小的时间表示数值:
>>> datetime.time.min datetime.time(0, 0) >>>
(三)、时间的字符串输出
1、__format__():将日期对象转化为指定格式的字符串
>>> temp_time = datetime.time(12, 20, 59, 899) >>> temp_time datetime.time(12, 20, 59, 899) >>> temp_time.__format__("%H:%M:%S") '12:20:59' >>>
与此方法等价的方法为strftime()方法
>>> temp_time = datetime.time(12, 20, 59, 899) >>> temp_time datetime.time(12, 20, 59, 899) >>> temp_time.strftime("%H:%M:%S") '12:20:59' >>>
关于时间日期格式化符号见文末的时间日期格式化符号表。
2、__str__():简单的获得日期的字符串
>>> temp_time = datetime.time(12, 20, 59, 899) >>> temp_time datetime.time(12, 20, 59, 899) >>> temp_time.__str__() '12:20:59.000899' >>>
3、ifoformat():ISO标准输出
>>> temp_time = datetime.time(12, 20, 59, 899) >>> temp_time datetime.time(12, 20, 59, 899) >>> temp_time.isoformat() '12:20:59.000899' >>>
四、datetime类
(一)、datetime类的数据构成
datetime类可以看做是date类和time类的结合体,其大部分的方法和属性都继承于这两个类,相关的方法可以参考date类和time类。其数据构成也是由这两个类所有的属性所组成的。
datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])
(二)、datetime的专属方法和属性(date类和time类所没有的)
1、date():返回datetime对象的日期部分
>>> datetime_now = datetime.datetime.now() >>> datetime_now datetime.datetime(2018, 4, 25, 14, 31, 57, 555633) >>> datetime_now.date() datetime.date(2018, 4, 25) >>>
2、time():返回datetime对象的时间部分
>>> datetime_now = datetime.datetime.now() >>> datetime_now datetime.datetime(2018, 4, 25, 14, 33, 5, 444498) >>> datetime_now.time() datetime.time(14, 33, 5, 444498) >>>
3、utctimetuple():返回UTC时间元组
>>> datetime_now = datetime.datetime.now() >>> datetime_now datetime.datetime(2018, 4, 25, 14, 33, 5, 444498) >>> datetime_now.utctimetuple() time.struct_time(tm_year=2018, tm_mon=4, tm_mday=25, tm_hour=14, tm_min=33, tm_sec=5, tm_wday=2, tm_yday=115, tm_isdst=0) >>>
4、combine():将一个date对象和一个time对象合并生成一个datetime对象
>>> datetime_now = datetime.datetime.now() >>> datetime_now datetime.datetime(2018, 4, 25, 14, 33, 5, 444498) >>> datetime.datetime.combine(datetime_now.date(), datetime_now.time()) datetime.datetime(2018, 4, 25, 14, 33, 5, 444498) >>>
5、now():返回当前日期时间的datetime对象
>>> datetime_now = datetime.datetime.now() >>> datetime_now datetime.datetime(2018, 4, 25, 14, 33, 5, 444498)
6、utcnow():返回当前日期时间的UTC datetime对象
>>> datetime_now = datetime.datetime.utcnow() >>> datetime_now datetime.datetime(2018, 4, 25, 6, 37, 47, 665777) >>>
7、strptime():根据string, format两个参数,返回一个对应的datetime对象
>>> datetime.datetime.strptime("2018-4-25 14:33", "%Y-%m-%d %H:%M") datetime.datetime(2018, 4, 25, 14, 33) >>>
8、utcfromtimestamp():UTC时间戳的datetime对象
>>> datetime.datetime.utcfromtimestamp(time.time()) datetime.datetime(2018, 4, 25, 6, 41, 31, 888988) >>>
五、timedelta类
timedelta类是用来计算两个datetime对象的差值的。
此类中包含如下属性:
1、days:天数
2、microseconds:微秒数(>=0并且<1秒)
3、seconds:秒数(>=0并且<1天)
六、日期计算实例
1、获取当前日期时间:
>>> datetime_now = datetime.datetime.now() >>> datetime_now datetime.datetime(2018, 4, 25, 14, 45, 59, 239506) >>> date_today = datetime.date.today() >>> date_today datetime.date(2018, 4, 25) >>> datetime_now.date() datetime.date(2018, 4, 25) >>> datetime_now.time() datetime.time(14, 45, 59, 239506) >>>
2、获取上个月第一天和最后一天的日期:
>>> date_today = datetime.date.today() >>> date_today datetime.date(2018, 4, 25) >>> mlast_day = datetime.date(date_today.year, date_today.month, 1) - datetime.timedelta(1) >>> mlast_day datetime.date(2018, 3, 31) >>> mfirst_day = datetime.date(mlast_day.year, mlast_day.month, 1) >>> mfirst_day datetime.date(2018, 3, 1) >>>
3、获取时间差:
>>> start_time = datetime.datetime.now() >>> end_time = datetime.datetime.now() >>> (end_time - start_time).seconds 10 >>> >>> (end_time - start_time).days 0 >>> (end_time - start_time).microseconds 22076 >>>
4、计算当前时间向后8个小时的时间:
>>> datetime1 = datetime.datetime.now() >>> datetime2 = datetime1 + datetime.timedelta(hours = 8) >>> datetime1 datetime.datetime(2018, 4, 25, 14, 55, 41, 598834) >>> datetime2 datetime.datetime(2018, 4, 25, 22, 55, 41, 598834) >>>
timedelta的参数可以有:days(天)、hours(小时)、minutes(分钟)、seconds(秒钟)、microseconds(微秒)
5、计算上周一和周日的日期:
>>> date_today = datetime.date.today() >>> date_today datetime.date(2018, 4, 25) >>> today_weekday = date_today.isoweekday() >>> today_weekday 3 >>> last_sunday = date_today - datetime.timedelta(days = today_weekday) >>> last_sunday datetime.date(2018, 4, 22) >>> last_monday = last_sunday - datetime.timedelta(days = 6) >>> last_monday datetime.date(2018, 4, 16) >>>
6、计算指定日期当月最后一天的日期和当月的天数:
>>> temp_date = datetime.date(2018, 4, 25) >>> def eomonth(date_obj): ... if date_obj.month == 12: ... next_month_first_date = datetime.date(date_obj.year + 1, 1, 1) ... else: ... next_month_first_date = datetime.date(date_obj.year, date_obj.month + 1, 1) ... return next_month_first_date - datetime.timedelta(1) ... >>> eomonth(temp_date) datetime.date(2018, 4, 30) >>> eomonth(temp_date).day 30 >>>
7、计算指定日期下个月当天的日期:
>>> temp_date = datetime.date(2018, 4, 25) >>> def edate(date_obj): ... if date_obj.month == 12: ... next_month_date = datetime.date(date_obj.year + 1, 1, date_obj.day) ... else: ... next_month_first_day = datetime.date(date_obj.year, date_obj.month + 1, 1) ... if date_obj.day > eomonth(next_month_first_day).day: ... next_month_date = datetime.date(date_obj.year, date_obj.month + 1, eomonth(next_month_first_day).day) ... else: ... next_month_date = datetime.date(date_obj.year, date_obj.month +1, date_obj.day) ... return next_month_date ... >>> edate(temp_date) datetime.date(2018, 5, 25) >>>
注:这里调用了上一个事例中的eomonth()函数。
8、获得本周一至今天的时间段并获得上周对应的时间段:
>>> temp_today = datetime.date.today() >>> temp_today datetime.date(2018, 4, 25) >>> this_monday = temp_today - datetime.timedelta(temp_today.isoweekday() - 1) >>> this_monday datetime.date(2018, 4, 23) >>> last_weekday = temp_today - datetime.timedelta(7) >>> last_weekday datetime.date(2018, 4, 18) >>> last_monday = this_monday - datetime.timedelta(7) >>> last_monday datetime.date(2018, 4, 16) >>>
附录:Python中时间日期格式化符号对应表
符号 |
说明 |
%y |
两位数的年份(00-99) |
%Y |
四位数的年份表示(0001-9999) |
%m |
两位数的月份(01-12) |
%d |
两位数的天数(01-31) |
%H |
24小时制小时数(0-23) |
%I |
12小时制小时数(1-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),0表示周日 |
%W |
一年中的第几周(00-53),周一为星期的开始 |
%x |
本地相应的日期表示 |
%X |
本地相应的时间表示 |
%Z |
当前时区的名称 |
%% |
%号本身 |
上一篇: Linux系统下使用Flacon导入CD音频文件中的歌曲
下一篇: 鳝鱼莴苣这道美食怎么做好吃呢