python中经常使用的处理时间的模块有两个:time 模块、datetime 模块,time模块是比较基础的一个模块,可知足对时间类型数据的基本处理;而 datetime模块能够看作是 对time模块的一个高级封装,功能更增强大,例如在时间的加减上(获取指定时间的前(后)一天的时间,获取指定时间的前(后)一小时的时间),使用datetime模块,实现起来更为方便~python
时间也是一个数据类型,这个类型中的数据通常可分为 3类 时间形式:时间戳(timestamp),结构化时间(struct_time),格式化的时间字符串(format string)~ide
在计算机中,时间是用数字来表示的。1970年1月1日 00:00:00 UTC+00:00时区的时刻称为 epoch time,记为0(1970年之前的时间timestamp为负数),当前时间就是相对于epoch time的秒数(浮点型),即 timestamp。
获取当前时间的时间戳:函数
>>> import time >>> time.time() 1539009280.9001613 # float 类型
结构化时间是一个 struct_time元组,其中有9个字段,具体说明以下:code
字段 | 说明 |
---|---|
tm_year | 年,例如:2018 |
tm_mon | 月,取值:1-12 |
tm_mday | 日,取值:1-31 |
tm_hour | 小时,取值:0-23 |
tm_min | 分钟,取值:0-59 |
tm_sec | 秒,取值:0-60 |
tm_wday | 星期几,取值:0到6 (0是周一) |
tm_yday | 一年中的第几天,取值:1 到 366 |
tm_isdst | 标志位,决定是否为夏令时,取值:-1, 0, 1 |
获取当前时间的结构化时间:orm
>>> time.localtime() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=22, tm_min=59, tm_sec=12, tm_wday=0, tm_yday=281, tm_isdst=0) # time.localtime() 还能够接收一个时间戳参数,获取指定的时间: >>> time.localtime(10) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0) # Tip:因为是东8时区因此 tm_hour 是8,而不是0~ # time.gmtime() 与 time.localtime() 做用相似,区别在于 localtime() 返回的是当前时区的时间,gmtime()返回的是格林威治时间,即 UTC 时间~ >>> time.gmtime() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=15, tm_min=5, tm_sec=25, tm_wday=0, tm_yday=281, tm_isdst=0) >>> time.gmtime(10) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)
也能够手动建立结构化时间(9个参数依次传入,注意是以元组的方式传入),这种方式并不经常使用:对象
>>> time.struct_time((2018,10,8,23,0,9,3,335,-1)) time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=23, tm_min=0, tm_sec=9, tm_wday=3, tm_yday=335, tm_isdst=-1)
格式化的时间字符串 就是使用字符串表示时间,例如:'2018-10-08 23:13:23'。ip
字符串时间的获取:字符串
>>> time.ctime() 'Sun Oct 14 08:32:04 2018' >>> time.asctime() 'Sun Oct 14 08:32:10 2018'
结构化时间转为字符串时间string
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) '2018-10-14 08:42:58' # strftime函数的第一个参数指定时间的格式,能够根据需求而定,例如仅获取时间年月日 >>> time.strftime('%Y%m%d', time.localtime()) '20181014'
时间的format格式以下:it
%a 本地(local)简化星期名称 %A 本地完整星期名称 %b 本地简化月份名称 %B 本地完整月份名称 %c 本地相应的日期和时间表示 %d 一个月中的第几天(01-31) %H 一天中的第几个小时(24小时制,00-23) %l 一天中的第几个小时(12小时制,01-12) %j 一年中的第几天(01-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 用+HHMM或者-HHMM表示距离格林威治的时区偏移(H表明十进制的小时数,M表明十进制的分钟数) %Z 时区的名字(若是不存在为空字符) %% %号自己 %p只有与%I配合使用才有效果 当使用strptime()函数时,只有当在这年中的周数和天数被肯定的时候%U和%W才会被计算
除了strftime函数,还有asctime函数能够将结构化时间转为时间字符串,只是这个函数最多仅接受一个参数,没法实现对字符串进行定制~
>>> time.asctime(time.localtime()) 'Sun Oct 14 09:16:57 2018' # 不传参的状况,默认传入的就是time.localtime() >>> time.asctime() 'Sun Oct 14 09:19:09 2018' # 定制结构化时间 >>> time.asctime(time.struct_time((2000,11,30,0,0,0,3,335,-1))) 'Thu Nov 30 00:00:00 2000'
字符串时间转为结构化时间
# 第一个参数为时间字符串,第二个参数指定之间格式 >>> time.strptime('2018-10-14 08:42:58', '%Y-%m-%d %H:%M:%S') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=8, tm_min=42, tm_sec=58, tm_wday=6, tm_yday=287, tm_isdst=-1) >>> time.strptime('2018-10-14', '%Y-%m-%d') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=287, tm_isdst=-1) # 第二个参数也能够不指定,只是这个时候字符串的格式必须是 '%a %b %d %H:%M:%S %Y' >>> time.strptime('Sun Oct 14 09:03:46 2018') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=3, tm_sec=46, tm_wday=6, tm_yday=287, tm_isdst=-1) >>> time.strptime('Sun Oct 14 09:03:46 2018', '%a %b %d %H:%M:%S %Y') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=3, tm_sec=46, tm_wday=6, tm_yday=287, tm_isdst=-1)
时间戳转为结构化时间
上面提到的time.localtime(),time.gmtime()其实就是将时间戳转为格式化时间
# time.localtime() 能够接受一个 int 类型 的参数,即表示时间戳 >>> time.localtime(10) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0) # 不传入参数时,默认传入的就是当前时间戳,即time.time() print(time.localtime()) print(time.localtime(time.time())) 输出结果: time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=34, tm_sec=13, tm_wday=6, tm_yday=287, tm_isdst=0) time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=34, tm_sec=13, tm_wday=6, tm_yday=287, tm_isdst=0)
结构化时间转为时间戳
>>> >>> time.mktime(time.localtime()) 1539481022.0
注:字符串时间 和 时间戳 之间,没法实现 直接转换
datetime是python处理时间和日期的标准库,功能要比 time模块 强大,且使用起来更为方便~
datetime模块中定义的类
类 | 说明 |
---|---|
datetime.date | 表示日期,经常使用的属性有:year, month和day |
datetime.time | 表示时间,经常使用属性有:hour, minute, second, microsecond |
datetime.datetime | 表示日期时间 |
datetime.timedelta | 表示两个date、time、datetime实例之间的时间间隔,分辨率(最小单位)可达到微秒 |
datetime.tzinfo | 时区相关信息对象的抽象基类。它们由datetime和time类使用,以提供自定义时间的而调整。 |
datetime.timezone | Python 3.2中新增的功能,实现tzinfo抽象基类的类,表示与UTC的固定偏移量 |
datetime模块中定义的常量
常量名称 | 说明 |
---|---|
datetime.MINYEAR | datetime.date或datetime.datetime对象所容许的年份的最小值,值为1 |
datetime.MAXYEAR | datetime.date或datetime.datetime对象所容许的年份的最大值,只为9999 |
这里主要说明的是datetime模块中datetime类~
使用datetime.datetime类获取当前时间
>>> import datetime >>> datetime.datetime.now() datetime.datetime(2018, 10, 14, 10, 29, 55, 175498) # 指定标准时区 >>> datetime.datetime.now(datetime.timezone.utc) datetime.datetime(2018, 10, 14, 2, 30, 1, 831932, tzinfo=datetime.timezone.utc)
这里返回的时间类型就是 datetime.datetime。datetime.datetime类 里面封装的方法可实现 datetime.datetime类型的时间和 上述所说的3种时间类型 之间的相互转换~
在实例化 datetime.datetime类 过程当中,传递参数,来获取指定的时间。
# 其中 year,month,day为必须传递的参数 class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) # 示例 >>> datetime.datetime(year=2018, month=10, day=14) datetime.datetime(2018, 10, 14, 0, 0)
参数说明以下:
参数 | 取值范围 |
---|---|
year | [MINYEAR, MAXYEAR] |
month | [1, 12] |
day | [1, 指定年份的月份中的天数] |
hour | [0, 23] |
minute | [0, 59] |
second | [0, 59] |
microsecond | 微妙,[0, 1000000] |
tzinfo | 时区,tzinfo的子类对象 |
# 从结构化时间到 datetime,便是在实例化datetime类时,指定各个参数;没法实现从 time.struct_time 到 datetime的直接转换~ >>> datetime.datetime(year=2018, month=10, day=14, hour=10, minute=49, second=50) datetime.datetime(2018, 10, 14, 10, 49, 50) # 从datetime到结构化时间 >>> datetime.datetime.now().timetuple() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=10, tm_min=52, tm_sec=23, tm_wday=6, tm_yday=287, tm_isdst=-1)
# 从时间戳到 datetime >>> datetime.datetime.fromtimestamp(10) # 当前时区 datetime.datetime(1970, 1, 1, 8, 0, 10) >>> datetime.datetime.utcfromtimestamp(10) # 标准时区 datetime.datetime(1970, 1, 1, 0, 0, 10) # 根据当前时间戳获取 datetime >>> datetime.datetime.fromtimestamp(time.time()) datetime.datetime(2018, 10, 14, 10, 56, 46, 302245) # 从datetime 到时间戳 >>> datetime.datetime.timestamp(datetime.datetime.now()) 1539486116.698343 >>> datetime.datetime.timestamp(datetime.datetime.now(datetime.timezone.utc)) 1539486173.079687
datetime 和时间字符串之间的转换 与 time.strftime、time.strptime相似~
# 从 datetime 到 时间字符串 >>> dt = datetime.datetime.now() >>> dt.strftime('%Y-%m-%d %H:%M:%S') '2018-10-14 11:32:49' # 从 时间字符串 到datetime >>> datetime.datetime.strptime('2018-10-14 11:32:49', '%Y-%m-%d %H:%M:%S') datetime.datetime(2018, 10, 14, 11, 32, 49)
timedelta 类用于表示两个时间之间的差值,能够直接对datetime.datetime对象进行加减操做~,若使用time模块,须要先将 字符串时间 或者 结构化时间(struct_time)转换为时间戳个格式,而后对该时间戳加上或者减去 n 秒,最后再将时间戳格式转换回 字符串时间 或者 结构化时间,这样很是的麻烦。利用 datetime 模块提供的 timedelta 类 能够直接对 datetime.date,datetime.time,datetime.datetime对象进行 以 天,秒、微秒、毫秒、分钟、小时、周 为单位的加减运算~
以下是timedelta类的inti方法:
def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ..., milliseconds: float = ..., minutes: float = ..., hours: float = ..., weeks: float = ...) -> None: ...
示例:
>>> dt = datetime.datetime.now() # 2天后的时间 >>> dt + datetime.timedelta(2) datetime.datetime(2018, 10, 16, 11, 49, 0, 699630) # 2天前的时间 >>> dt + datetime.timedelta(-2) datetime.datetime(2018, 10, 12, 11, 49, 0, 699630) # 1小时以后 >>> dt + datetime.timedelta(hours=1) datetime.datetime(2018, 10, 14, 12, 49, 0, 699630) # 一小时前 >>> dt + datetime.timedelta(hours=-1) datetime.datetime(2018, 10, 14, 10, 49, 0, 699630) # 一天一小时以后 >>> dt + datetime.timedelta(days=1, hours=1) datetime.datetime(2018, 10, 15, 12, 49, 0, 699630) # 一个半小时以后 >>> dt + datetime.timedelta(hours=1, minutes=30) datetime.datetime(2018, 10, 14, 13, 19, 0, 699630)
datetime模块中除了datetime类,还有date,time。date和time类并不经常使用~
date 的 init 方法,其中year,month,day都是必须参数:
def __init__(self, year: int, month: int, day: int) -> None: ...
获取 date 对象:
>>> datetime.date(year=2018, month=10, day=14) datetime.date(2018, 10, 14)
使用示例:
>>> today = datetime.date.today() >>> today datetime.date(2018, 10, 14) >>> today.year 2018 >>> today.month 10 >>> today.day 14 # 时间戳转为date >>> datetime.date.fromtimestamp(time.time()) datetime.date(2018, 10, 14) # date转为结构化时间 >>> today.timetuple() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=287, tm_isdst=-1)
time 的 init 方法,其中 hour 为必须参数:
def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo: Optional[tzinfo] = ...) -> None: ...
参数说明:
hour # 小时,取值范围:[0, 23]
minute # 分钟,取值范围:[0, 59]
second # 秒,取值范围:[0, 59]
microsecond # 微秒,取值范围:[0, 1000000]
tzinfo # tzinfo的子类对象,如timezone类的实例
获取 time 对象:
>>> datetime.time(hour=23, minute=2, second=16) datetime.time(23, 2, 16)
简单示例:
>>> dt = datetime.time(hour=23, minute=2, second=16) >>> dt datetime.time(23, 2, 16) >>> dt.hour 23 >>> dt.minute 2 >>> dt.second 16 >>> dt.microsecond 0 >>> dt.tzinfo # 按照指定的格式转为字符串 >>> dt.strftime('%H%M%S') '230216'
.................^_^