time 模块
在Python中,通常有这几种方式来表示时间:
- 时间戳
- 格式化的时间字符串
- 元组(struct_time)共九个元素。
由于 Python 的 time 模块实现主要调用 C 库,所以各个平台可能有所不同。
UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。
时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行 type(time.time())
,返回的是 float
类型。
元组(struct_time)方式:struct_time 元组共有9个元素,返回 struct_time 的函数主要有 gmtime()
,localtime()
,strptime()
。下面列出这种方式元组中的几个元素:
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
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(weekday) | 0 - 6(0表示周日) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为-1 |
time 模块内置函数
time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的:
time.asctime(tupletime: time.struct_time)
接受时间元组 time.struct_time
并返回一个可读的形式为 "Thu May 12 11:42:45 2022" 的24个字符的字符串。
time.ctime(secs: float)
接受时时间戳 timestamp
并返回一个可读的形式为 "Thu May 12 11:42:45 2022" 的24个字符的字符串。
time.gmtime(secs: float)
接受时时间戳 timestamp
并返回格林威治天文时间下的时间元组 time.struct_time
。
time.localtime(secs: float)
接受时时间戳 timestamp
并返回当地时间下的时间元组 time.struct_time
。
time.mktime(tupletime: time.struct_time)
接受时间元组 time.struct_time
并返回时间戳 timestamp
。
time.sleep(secs: float|int)
推迟调用线程的运行,secs 指秒数。
time.strftime(fmt: str, tupletime: time.struct_time)
接收以时间元组,并返回以可读字符串表示的当地时间,格式由 fmt 决定。
其中 fmt 格式:
- %Y 年份
- %m 月份(十进制) [01,12]
- %d 月份中的某一天 [01,31]
- %H 小时(24 小时制)[00,23]
- %M 分钟 [00,59]
- %S 秒 [00,61]
- %z 时区与 UTC 的偏移量
- %a 星期缩写
- %A 星期全称
- %b 月份缩写
- %B 月份全称
- %c 适当日期和时间表示
- %I 小时(12 小时制) [01,12]
- %p AM or PM
time.strptime(str, fmt='%a %b %d %H:%M:%S %Y')
根据 fmt 的格式把一个时间字符串解析为时间元组。
time.time( )
返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
time.perf_counter()
返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。
time 模块 重要属性
time.timezone
属性 time.timezone
是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲<=0大部分欧洲,亚洲,非洲)。
time.tzname
属性 time.tzname
包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。
三种时间转换关系图
GMT时间元组和当地时间元组的区别
执行下面代码会发现,输出的元组除了小时其他都一样。差了8小时,因为北京时间是东八区。
import time
t = time.time()
a = time.gmtime(t)
b = time.localtime(t)
print(a)
print(b)
输出:
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=12, tm_hour=8, tm_min=56, tm_sec=14, tm_wday=3, tm_yday=132, tm_isdst=0)
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=12, tm_hour=16, tm_min=56, tm_sec=14, tm_wday=3, tm_yday=132, tm_isdst=0)
但将这两个时间元组转换回时间戳会发现时间时间戳是一样的,当然这是肯定的,但是如何做到的呢?
import time
t = time.time()
a = time.gmtime(t)
b = time.localtime(t)
c = time.mktime(a)
d = time.mktime(b)
print(a)
print(b)
print(c)
print(d)
输出:
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=12, tm_hour=9, tm_min=4, tm_sec=31, tm_wday=3, tm_yday=132, tm_isdst=0)
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=12, tm_hour=17, tm_min=4, tm_sec=31, tm_wday=3, tm_yday=132, tm_isdst=0)
1652317471.0
1652346271.0
因为时间元组中有个属性 tm_gmtoff
存放者与 GMT 时间偏移的信息量。
import time
t = time.time()
a = time.gmtime(t)
b = time.localtime(t)
c = time.mktime(a)
d = time.mktime(b)
print(a)
print(b)
print(c)
print(d)
print(a.tm_gmtoff)
print(b.tm_gmtoff)
输出:
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=12, tm_hour=9, tm_min=7, tm_sec=45, tm_wday=3, tm_yday=132, tm_isdst=0)
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=12, tm_hour=17, tm_min=7, tm_sec=45, tm_wday=3, tm_yday=132, tm_isdst=0)
1652317665.0
1652346465.0
0
28800
Local 时间与 GMT 时间偏移了28800秒,正好是8小时。而偏移的秒数存放在 time.timezone
这个属性中。
评论区(暂无评论)