加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Python时间日期格式化之time与datetime模块概括

发布时间:2021-11-12 14:16:50 所属栏目:教程 来源:互联网
导读:1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time、datetime等模块下的不同函数,这些函数名又很是相似,几次下来头都昏了,今天来彻底总结梳理

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秒之间过了多少秒。
 
  相应的,日期时间就有三种表示方法:
 
  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属性值的获取方式有两种:
 
  可以把它当做一种特殊的有序不可变序列通过 下标/索引 获取各个元素的值,如t[0]
  也可以通过对象名 “t.属性名” 的方式来获取各个元素的值,如t.tm_year。
  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()
1545216390.84174
 
Python时间日期格式化之time与datetime模块总结
 
  2)time.localtime()
 
>>> time.localtime() # 不传入参数
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=19, tm_hour=18, tm_min=47, tm_sec=30, tm_wday=2, tm_yday=353, tm_isdst=0)
>>> time.localtime(time.time()) # 传入当前时间
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=19, tm_hour=18, tm_min=47, tm_sec=39, tm_wday=2, tm_yday=353, tm_isdst=0)
>>> time.localtime(1544200000.1232) # 传入其他时间戳
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=8, tm_hour=0, tm_min=26, tm_sec=40, tm_wday=5, tm_yday=342, tm_isdst=0)
 
Python时间日期格式化之time与datetime模块总结
 
  3)time.gctime()
>>> time.gmtime()
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=19, tm_hour=10, tm_min=53, tm_sec=10, tm_wday=2, tm_yday=353, tm_isdst=0)
  4)time.mktime()
 
>>> time.mktime(time.localtime())
1545216822.0
 
  5)strftime(format, p_tuple=None)
 
>>> time.strftime('%y-%m-%d' , time.localtime())
'18-12-19'
>>> time.strftime('%Y-%m-%d' , time.localtime())
'2018-12-19'
>>> time.strftime('%Y年%m月%d日 %M时%I分%S秒' , time.localtime())
'2018年12月19日 54时06分20秒'
 
 Python时间日期格式化之time与datetime模块总结
 
  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_mon=12, tm_mday=8, tm_hour=10, tm_min=34, tm_sec=4, tm_wday=5, tm_yday=342, tm_isdst=-1)
>>> time.strptime('2018年12月19日 54时06分20秒' , '%Y年%m月%d日 %M时%I分%S秒')
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=19, tm_hour=6, tm_min=54, tm_sec=20, tm_wday=2, tm_yday=353, tm_isdst=-1)
Python时间日期格式化之time与datetime模块总结
  7)asctime(p_tuple=None)
 
>>> time.asctime() # 不传入参数,默认是当前时间
'Wed Dec 19 18:59:22 2018'
>>> time.asctime(time.localtime(1544278402.1804464))
'Sat Dec  8 22:13:22 2018'
 
  8)ctime(seconds=None)
 
>>> time.ctime() # 不传入参数
'Wed Dec 19 19:00:05 2018'
>>> time.ctime(1544278402.1804464)
'Sat Dec  8 22:13:22 2018'
 
Python时间日期格式化之time与datetime模块总结
 
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, 59, 999999)
 
time.min
 
time类所能表示的最小时间:time(0, 0, 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, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
  year, month 和 day是必须要传递的参数, tzinfo可以是None或tzinfo子类的实例。
 
  各参数的取值范围为:
 
参数名称
 
取值范围
 
year
 
[MINYEAR, MAXYEAR]
 
month
 
[1, 12]
 
day
 
[1, 指定年份的月份中的天数]
 
hour
 
[0, 23]
 
minute
 
[0, 59]
 
second
 
[0, 59]
 
microsecond
 
[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[, month[, day[, hour[, minute[, second[, microsecond[, 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个单位:
1毫秒转换为1000微秒
1分钟转换为60秒
1小时转换为3600秒
1周转换为7天
  然后对这3个值进行标准化,使得它们的表示是唯一的:
 
microseconds : [0, 999999]
seconds : [0, 86399]
days : [-999999999, 999999999]
  类属性:
类属性名称
 
描述
 
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种时间格式之间的关系,就容易记忆了。

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读