python中有许多关于时间的模块,这里记录一下。
首先得介绍一下时间戳的概念:啥是时间戳呢?官方地讲,就是一个能表示一份数据再某个特定时间之前已经存在的、完整的、可验证的数据。那么通俗一点地讲,就是指格林尼治时间1970年01月01日00时00分00秒到现在的总秒数。
为了后面的理解,我们需要直到python中经常使用到的一些特殊的符号来格式化时间日期,类似于字符串格式化中的“ %s ”、“ %d ”等。
符号 | 含义 |
---|---|
%y | 两位数的年份表示(00~99) |
%Y | 四位数的年份表示(0000~9999) |
%m | 月份(01~12) |
%d | 月内的一天 |
%H | 24小时制的小时数(0~23) |
%I | 12小时制的小时数(01~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),星期天为一个星期的开始 |
%W | 一年中的星期数(00~53) |
%x | 本地相应的日期表示 |
% | X本地相应的时间表示 |
%Z | 当前时区的名称 |
python中很多函数用一个元组装起来的九组数字处理时间:
序号 | 字段 | :值 |
---|---|---|
0 | 4位数的年 | 2022 |
1 | 月 | 1~12 |
2 | 日 | 1~31 |
3 | 小时 | 0~23 |
4 | 分钟 | 0~59 |
5 | 秒 | 0~61 |
6 | 一周的第几日 | 0~6(0是周一) |
7 | 一年的第几日 | 1~366(儒略历) |
8 | 夏令时 | -1,0,1(-1是决定是否为夏令时的旗帜) |
上面的元组也就是time模块中的struct_time对象,这种结构具有如下属性:
序号 | 属性 | 值 |
---|---|---|
0 | tm_year | 2022 |
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(60或61是闰秒) |
6 | tm_wday | 0~6 |
7 | tm_yday | 1~366(儒略历) |
8 | tm_isdst | -1,0,1(夏时令) |
害,这东西可是真多啊。啥又是儒略历,啥又是夏令时?对此我也是很费解啊,赶紧去百度了一下。
儒略历:就是公历的前身,一年被划分为12个月,大小月交替;四年一闰,平年365日,闰年366日为在当年二月底增加一闰日,年平均长度为365.25日。但是在实际使用过程中导致积累的误差随时间越来越大,就变成公历了~~
夏时令:这个就是人为地规定的为节约能源的制度。大概就是在夏季的时候,人为将时间提前一小时,减少照明量…我国以前也实行过,不过后来就取消了。
好了好了,科普结束,回到正题
首先要说明一点啊,日期和时间的区别啊,我现在的理解大概就是日期是年月日,时间呢就是时分秒,以前我老是分不清楚。
time模块中呢,就主要介绍几个常用的函数。
time函数用于返回当前时间的时间戳,没错,就是那个啥格林尼治时间到现在的秒数。记录一下现在的时间是2022.8.30 22:00,请看下面例子:
import time
a = time.time()
print(a)
#1661868092.4191587
可以看出,它返回的是一个浮点数。
该函数是将时间戳格式化为本地时间,返回struct_time对象。它有一个参数用于接收时间戳,如果调用函数时不提供时间戳(注意是提供秒数哦,很大的),它会默认使用当前时间戳。例如:
import time
a = time.localtime()
print(a)
#time.struct_time(tm_year=2022, tm_mon=8, tm_mday=30, tm_hour=22, tm_min=11, tm_sec=49, tm_wday=1, tm_yday=242, tm_isdst=0)
import time
a = time.localtime(0)
print(a)
#time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
可以看到如果提供0的时间戳,它返回的就恰好是那个格林尼治时间。同时它返回的也是struct_time类型。
它接收struct_time对象作为参数,它返回的是用秒数来表示时间的浮点数(该浮点数小数后面全是0,前面time.time()返回的浮点数小数后面就不全为0),就是从格林尼治时间到某年某月某日某时某分某秒的秒数。它的参数可以是结构化的时间。
import time
a = (2022,8,30,22,19,40,1,1,0)
print(time.mktime(a))
#1661869180.0
print(time.localtime(time.mktime(a)))
#time.struct_time(tm_year=2022, tm_mon=8, tm_mday=30, tm_hour=22, tm_min=19, tm_sec=40, tm_wday=1, tm_yday=242, tm_isdst=0)
可以看出,mktime函数可以用时间元组作为参数,也可以使用time_struct对象作为参数。
它能将一个时间戳转换为UTC的struct_time,参数为时间戳,默认参数为当前时间戳(也就是time.time())。那么,啥是UTC?科普时间到!
UTC,协调世界时,也叫世界标准时间,它是以原子时秒长在时刻上尽量接近于世界时的一种时间计量系统。具体的你们得就去问度娘了~~
例如:
import time
print(time.gmtime())
#time.struct_time(tm_year=2022, tm_mon=8, tm_mday=30, tm_hour=14, tm_min=34, tm_sec=26, tm_wday=1, tm_yday=242, tm_isdst=0)
print(time.gmtime(0))
#time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
它接收时间元组并返回一个形式为“ Tue Aug 30 22:36:35 2022 ”的24个字符的字符串(空格也要算)。它接收的参数可以是时间元组也可以是time_struct对象。例如:
import time
a = (2022,8,30,22,36,35,1,1,0)
print(time.asctime(a))
#Tue Aug 30 22:36:35 2022
print(time.asctime(time.localtime()))
#Tue Aug 30 22:39:44 2022
我是结合自身这边时间来做的哈。
它能把一个时间戳转化为time.asctime()形式。参数为时间戳,默认为当前时间戳(也就是time.time()),它的作用相当于执行time.asctime(localtime())。(哎,不得不吐槽一句,这是真复杂啊)例如:
import time
print(time.ctime())
#Tue Aug 30 22:42:52 2022
这个函数是重点啊,圈起来圈起来。
它用于推迟调用线程的运行,参数为秒数,表示进程挂起的时间。也就是我让你睡多久你就必须睡多久!例如:
import time
print("进程睡觉前:%s" % time.ctime())
time.sleep(5)
print("进程起床后:%s" % time.ctime())
#进程睡觉前:Tue Aug 30 22:47:35 2022
#进程起床后:Tue Aug 30 22:47:40 2022
它有两个参数,一个是format格式化符号,另一个是就是时间元组,并返回以一个字符串表示的当地时间,格式由参数format决定,也就是前面的格式化符号。例如:
import time
a = (2022,8,30,23,3,11,1,1,0)
b = time.mktime(a)
print(time.strftime("%b %d %Y %H:%M:%S",time.gmtime(b)))
#Aug 30 2022 15:03:11
根据指定的格式把一个时间字符串解析为时间元组(time_struct对象)。它有两个参数,一个是字符串,另一个是format格式化符号,例如:
import time
a = time.strptime("Aug 30 2022 23:06:54","%b %d %Y %H:%M:%S")
print(a)
#time.struct_time(tm_year=2022, tm_mon=8, tm_mday=30, tm_hour=23, tm_min=6, tm_sec=54, tm_wday=1, tm_yday=242, tm_isdst=-1)