Python时间日期格式化之time与datetime模块总结!
1 引言 2 理论准备 3 time模块 4 timedate模块 4.1 date类 4.2 time类 4.3 datetime类 4.4 datedelta类 1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time、datetime等模块下的不同函数,这些函数名又很是相似,几次下来头都昏了,今天来彻底总结梳理一下Python中日期时间获取与格式化。 2 理论准备 首先必须做一点理论准备,不然待会都不知道为什么会有这些函数。介绍3个概念: UTC time Coordinated Universal Time,世界协调时,又称格林尼治天文时间、世界标准时间。与UTC time对应的是各个时区的local time,也就是本地时间,例如我们的北京时间。 epoch time表示时间开始的起点;它是一个特定的时间,不同平台上这个时间点的值不太相同,对于Unix而言,epoch time为 1970-01-01 00:00:00 UTC。 timestamp(时间戳) 也称为Unix时间 或 POSIX时间;它是一种时间表示方式,表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但是有些编程语言的相关方法返回的是秒数,例如我们的天下第一编程语言-Python大法就是这样(请不要反驳我)。所谓的时间戳timestamp就是当前时间与格林尼治时间1970年1月1日0时0分0秒之间过了多少秒。 进群“960410445”即可获取数十套PDF哦! 相应的,日期时间就有三种表示方法: 1)stamptime时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。stamptime表现为一个float类型数据。 2)struct_time时间元组,共有九个元素组。stamptime时间戳和格式化时间字符串之间的转化必须通过struct_time才行,所以struct_time时间元组时3中时间表示的中心。 3)format time 格式化时间,已格式化的结构字符串使时间更具可读性。包括自定义格式和固定格式。 那么,下面要说的就是怎么获取这三个时间,并进行这三个时间之间的转化。先总结一下time模块。 3 time模块 先放两个图: time模块中,几乎所有时间获取与格式转化的函数都在上图中了,只要理清了这幅图的关系,那么time模块就不再是问题。图中,蓝色方块表示那三种时间格式,箭头表示时间的转化。下面,重点来了: 1)获取当前时间的方法只有一个,那就是通过上图中的函数1——time.time()。也就是说,要想获取当前时间,只能通过这个方法,而且获取的是时间戳格式的时间。想直接获取当前时间的时间元组格式或格式化字符串?没门,只能老老实实转化。 2)当传入默认参数时,指的是使用当前时间作为参数值。图中带黄色底纹的都是设有默认值的参数(虽然默认值为None),函数2、3不传入该参数时,系统会自动获取当前时间的时间戳作为该参数值。而函数5则是系统会自动获取当前时间的时间元组作为该参数值,不是不能直接获取当前时间的时间元组吗?是的,但系统会先获取当前时间的时间戳,然后转化为时间元组。上图中只有向左的箭头所代表的函数才有默认值,就是因为向右才能由时间戳转化得到需要的时间格式。 3) localtime(函数2)和gmtime(函数3)都可以实现将时间戳转化为时间元组,但是,localtime转化的是本地时间,gmtime转为的是世界标准时间。 4)asctime(函数7)和ctime(函数8)只能转为为%a %b %d %H:%M:%S %Y格式的字符串时间。不传入参数时,用的也是当前时间。 5)struct_time元组元素结构: 下标/索引 属性名称 描述 0 tm_year 年份,如 2018 1 tm_mon 月份,取值范围为[1,12] 2 tm_mday 一个月中的第几天,取值范围为[1-31] 3 tm_hour 小时, 取值范围为[0-23] 4 tm_min 分钟,取值范围为[0,59] 5 tm_sec 秒,取值范围为[0,61] 6 tm_wday 一个星期中的第几天,取值范围为[0-6],0表示星期一 7 tm_yday 一年中的第几天,取值范围为[1,366] 8 tm_isdst 是否为夏令时,可取值为:0,1 或 -1,默认值为-1 struct_time属性值的获取方式有两种:
6)format time结构化表示: 格式 含义 %a 本地(locale)简化星期名称 %A 本地完整星期名称 %b 本地简化月份名称 %B 本地完整月份名称 %c 本地相应的日期和时间表示 %d 一个月中的第几天(01 - 31) %H 一天中的第几个小时(24小时制,00 - 23) %I 第几个小时(12小时制,01 - 12) %j 一年中的第几天(001 - 366) %m 月份(01 - 12) %M 分钟数(00 - 59) %p 本地am或者pm的相应符 %S 秒(01 - 61) %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 %w 一个星期中的第几天(0 - 6,0是星期天) %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。 %x 本地相应日期 %X 本地相应时间 %y 去掉世纪的年份(00 - 99) %Y 完整的年份 %Z 时区的名字(如果不存在为空字符) %% ‘%’字符 在代码中实践一下上面的内容: 1)time.time() >>> import time >>> time.time() 1544278402.1804464 2)time.localtime() >>> time.localtime() # 不传入参数 time.struct_time(tm_year=2018,tm_mon=12,tm_mday=8,tm_hour=22,tm_min=14,tm_sec=58,tm_wday=5,tm_yday=342,tm_isdst=0) >>> time.localtime(time.time()) # 传入当前时间 time.struct_time(tm_year=2018,tm_min=15,tm_sec=33,tm_isdst=0) >>> time.localtime(1544200000.1232) # 传入其他时间戳 time.struct_time(tm_year=2018,tm_hour=0,tm_min=26,tm_sec=40,tm_isdst=0) 3)time.gctime() >>> time.gmtime() time.struct_time(tm_year=2018,tm_hour=14,tm_min=18,tm_sec=38,tm_isdst=0) 4)time.mktime() >>> time.mktime(time.localtime()) 1544279024.0 5)strftime(format,p_tuple=None) >>> time.strftime('%y-%m-%d',time.localtime()) '18-12-08' >>> time.strftime('%Y-%m-%d',time.localtime()) '2018-12-08' >>> time.strftime('%Y年%m月%d日 %M时%I分%S秒',time.localtime()) '2018年12月08日 34时10分04秒' 6)strptime(string,format) >>> time.strptime('2018年12月08日 34时10分04秒','%Y年%m月%d日 %M时%I分%S秒') time.struct_time(tm_year=2018,tm_hour=10,tm_min=34,tm_sec=4,tm_isdst=-1) 7)asctime(p_tuple=None) >>> time.asctime() # 不传入参数,默认是当前时间 'Sat Dec 8 22:42:46 2018' >>> time.asctime(time.localtime(1544278402.1804464)) 'Sat Dec 8 22:13:22 2018' 8)ctime(seconds=None) >>> time.ctime() # 不传入参数 'Sat Dec 8 22:45:58 2018' >>> time.ctime(1544278402.1804464) 'Sat Dec 8 22:13:22 2018' 4 datetime模块 datetime模块是time模块的进一步封装,对用户更加友好,在时间各属性的获取上回更加方便一些,当然,在效率上会略微低一些。datetime模块的功能主要都几种在datetime、date、time、timedelta、tzinfo五个类中。这五个类功能如下表所示: 类名 功能 date 提供日期(年、月、日)的处理 time 提供时间(时、分、秒)的处理 datetime 同时提供对日期和时间的处理 timedelta 两个date、time、datetime实例之间的时间间隔(时间加减运算) tzinfo 时区信息 4.1 date类 先来说说date类,其定义如下: class datetime.date(year,month,day) year,month 和 day都是是必须参数,各参数的取值范围为: 参数名称 取值范围 year [MINYEAR,MAXYEAR] month [1,12] day [1,指定年份的月份中的天数] 类方法和属性 类方法/属性名称 描述 date.max date对象所能表示的最大日期:9999-12-31 date.min date对象所能表示的最小日志:00001-01-01 date.resoluation date对象表示的日期的最小单位:天 date.today() 返回一个表示当前本地日期的date对象 date.fromtimestamp(timestamp) 根据跟定的时间戳,返回一个date对象 对象方法和属性 对象方法/属性名称 描述 d.year 年 d.month 月 d.day 日 d.replace(year[,month[,day]]) 生成并返回一个新的日期对象,原日期对象不变 d.timetuple() 返回日期对应的time.struct_time对象 d.toordinal() 返回日期是是自 0001-01-01 开始的第多少天 d.weekday() 返回日期是星期几,[0,6],0表示星期一 d.isoweekday() 返回日期是星期几,[1,7],1表示星期一 d.isocalendar() 返回一个元组,格式为:(year,weekday,isoweekday) d.isoformat() 返回‘YYYY-MM-DD’格式的日期字符串 d.strftime(format) 返回指定格式的日期字符串,与time模块的strftime(format,struct_time)功能相同 4.2 time类 定义格式: class datetime.time(hour,[minute[,second,[microsecond[,tzinfo]]]]) hour为必须参数,其他为可选参数。各参数的取值范围为: 参数名称 取值范围 hour [0,23] minute [0,59] second [0,59] microsecond [0,1000000] tzinfo tzinfo的子类对象,如timezone类的实例 类方法和属性 类方法/属性名称 描述 time.max time类所能表示的最大时间:time(23,59,999999) time.min time类所能表示的最小时间:time(0,0) time.resolution 时间的最小单位,即两个不同时间的最小差值:1微秒 对象方法和属性 对象方法/属性名称 描述 t.hour 时 t.minute 分 t.second 秒 t.microsecond 微秒 t.tzinfo 返回传递给time构造方法的tzinfo对象,如果该参数未给出,则返回None t.replace(hour[,minute[,second[,microsecond[,tzinfo]]]]) 生成并返回一个新的时间对象,原时间对象不变 t.isoformat() 返回一个‘HH:MM:SS.%f’格式的时间字符串 t.strftime() 返回指定格式的时间字符串,与time模块的strftime(format,struct_time)功能相同 4.3 datetime类 datetime类的定义如下: class datetime.datetime(year,day,hour=0,minute=0,second=0,microsecond=0,tzinfo=None) year,month 和 day是必须要传递的参数, tzinfo可以是None或tzinfo子类的实例。 各参数的取值范围为: 参数名称 取值范围 year [MINYEAR,指定年份的月份中的天数] hour [0,1000000] tzinfo tzinfo的子类对象,如timezone类的实例 如果一个参数超出了这些范围,会引起ValueError异常。 类方法和属性: 类方法/?属性名称 描述 datetime.today() 返回一个表示当前本期日期时间的datetime对象 datetime.now([tz]) 返回指定时区日期时间的datetime对象,如果不指定tz参数则结果同上 datetime.utcnow() 返回当前utc日期时间的datetime对象 datetime.fromtimestamp(timestamp[,tz]) 根据指定的时间戳创建一个datetime对象 datetime.utcfromtimestamp(timestamp) 根据指定的时间戳创建一个datetime对象 datetime.combine(date,time) 把指定的date和time对象整合成一个datetime对象 datetime.strptime(date_str,format) 将时间字符串转换为datetime对象 对象方法和属性: 对象方法/?属性名称 描述 dt.year,dt.month,dt.day 年、月、日 dt.hour,dt.minute,dt.second 时、分、秒 dt.microsecond,dt.tzinfo 微秒、时区信息 dt.date() 获取datetime对象对应的date对象 dt.time() 获取datetime对象对应的time对象, tzinfo 为None dt.timetz() 获取datetime对象对应的time对象,tzinfo与datetime对象的tzinfo相同 dt.replace([year[,day[,hour[,tzinfo]]]]]]]]) 生成并返回一个新的datetime对象,如果所有参数都没有指定,则返回一个与原datetime对象相同的对象 dt.timetuple() 返回datetime对象对应的tuple(不包括tzinfo) dt.utctimetuple() 返回datetime对象对应的utc时间的tuple(不包括tzinfo) dt.toordinal() 同date对象 dt.weekday() 同date对象 dt.isocalendar() 同date独享 dt.isoformat([sep]) 返回一个‘%Y-%m-%d dt.ctime() 等价于time模块的time.ctime(time.mktime(d.timetuple())) dt.strftime(format) 返回指定格式的时间字符串 上面是date、time、datetime三个类的方法和属性,关于这三个类,使用方法上基本与time模块差不多,看方法名基本就一目了然,实在忘记,直接查表就好,本文不在过多介绍。 4.4 timedelta类 timedelta可以方便实现日期(date实例、time实例、datetime实例)之间的加减运算。 datetime.timedelta类的定义 class datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,hours=0,weeks=0) 所有参数都是默认参数,因此都是可选参数。参数的值可以是整数或浮点数,也可以是正数或负数。内部值存储days、seconds 和 microseconds,其他所有参数都将被转换成这3个单位:
然后对这3个值进行标准化,使得它们的表示是唯一的:
类属性: 类属性名称 描述 timedelta.min timedelta(-999999999) timedelta.max timedelta(days=999999999,hours=23,minutes=59,seconds=59,microseconds=999999) timedelta.resolution timedelta(microseconds=1) 实例方法和属性: 实例方法/属性名称 描述 td.days 天 [-999999999,999999999] td.seconds 秒 [0,86399] td.microseconds 微秒 [0,999999] td.total_seconds() 时间差中包含的总秒数,等价于: td / timedelta(seconds=1) 5 总结 对于Python中时间、日期模块的应用主要集中在time模块和datetime模块中,其中涉及到的方法和属性有些多容易混淆,可以以time模块为出发点,只要理清time模块中3种时间格式之间的关系,就容易记忆了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |