Python时间模块(time)
author:onceday date:2022年6月3日
文章目录
- Python时间模块(time)
- 1.概述和术语解释
- 2.结构化时间(struct_time)
- 3.格式化时间字符串
- 4.time模块主要函数
- 4.1 time.asctime([*t*])
- 4.2 time.ctime([secs])
- 4.3 time.get_clock_info(name)
- 4.4 time.gmtime([secs])
- 4.5 time.localtime([secs])
- 4.6 time.mktime(t)
- 4.7 time.monotonic()→float /time.monotonic_ns() → int
- 4.8 time.perf_counter() → float/time.perf_counter_ns() → int
- 4.9 time.process_time() → float/time.process_time_ns() → int
- 4.10 time.sleep(t)
- 4.11 time.strftime(format[, t])
- 4.12 time.strptime(string[, format])
- 4.13 time.time() → float/time.time_ns() → int
- 4.14 time.thread_time() → float/time.thread_time_ns() → int
- 5.可用于Unix平台的time模块方法
- 5.1 time.pthread_getcpuclockid(thread_id)
- 5.2 time.clock_getres(clk_id)
- 5.3 time.clock_gettime(clk_id)
- 5.4 time.clock_gettime_ns(clk_id)
- 5.5 time.clock_settime(clk_id, time: float)
- 5.6 time.clock_settime_ns(clk_id, time: int)
- 5.7 time.tzset()
- 6.Clock ID 可用常量
- 6.1 time.CLOCK_MONOTONIC
- 6.2 time.CLOCK_BOOTTIME
- 6.3 time.CLOCK_HIGHRES
- 6.4 time.CLOCK_MONOTONIC_RAW
- 6.5 time.CLOCK_PROCESS_CPUTIME_ID
- 6.6 time.CLOCK_PROF
- 6.7 time.CLOCK_TAI
- 6.8 time.CLOCK_THREAD_CPUTIME_ID
- 6.9 time.CLOCK_UPTIME
- 6.10 time.CLOCK_UPTIME_RAW
- 6.11 time.CLOCK_REALTIME
- 7. 时区常量
- 7.1 time.altzone
- 7.2 time.daylight
- 7.3 time.timezone
- 7.4 time.tzname
- 注:本内容收集整理与互联网,仅供学习交流之用!
1.概述和术语解释
time
模块中定义的大多数函数的实现都是调用其所在平台的C语言库的同名函数。因为这些函数的语义可能因平台而异,所以使用时最好查阅对应平台的相关文档。
推荐参考文档:
- time — 时间的访问和转换 — Python 3.10.4 文档
- python time - 刘江的python教程 (liujiangblog.com)
- Unix 时间和闰秒 - 堆栈内存溢出 (stackoom.com)
以下是关于time
模块中常见定义的描述:
- epoch 是时间开始的点,其值取决于平台。对于Unix, epoch 是1970年1月1日00:00:00(UTC)。要找出给定平台上的 epoch ,请查看 time.gmtime(0) 。
- 术语纪元秒数是指自 epoch (纪元)时间点以来经过的总秒数,通常不包括 闰秒。 在所有符合 POSIX 标准的平台上,闰秒都不会记录在总秒数中。
- 此模块中的函数可能无法处理纪元之前或遥远未来的日期和时间。“遥远未来”的定义由对应的C语言库决定;对于32位系统,它通常是指2038年及以后。
- 函数
strptime()
在接收到%y
格式代码时可以解析使用 2 位数表示的年份。当解析 2 位数年份时,函数会按照 POSIX 和 ISO C 标准进行年份转换:数值 69–99 被映射为 1969–1999;数值 0–68 被映射为 2000–2068。 - UTC是协调世界时(Coordinated Universal Time)的缩写。它以前也被称为格林威治标准时间(GMT)。
- DST是夏令时(Daylight Saving Time)的缩写,在一年的某一段时间中将当地时间调整(通常)一小时。 DST的规则非常神奇(由当地法律确定),并且每年的起止时间都不同。C语言库中有一个表格,记录了各地的夏令时规则(实际上,为了灵活性,C语言库通常是从某个系统文件中读取这张表)。
- 由于平台限制,各种实时函数的精度可能低于其值或参数所要求(或给定)的精度。例如,在大多数Unix系统上,时钟频率仅为每秒50或100次。
在python中,用三种方式来表示时间,分别是时间戳、格式化时间字符串和结构化时间:
- 时间戳(
timestamp
):也就是1970年1月1日之后的秒,例如1506388236.216345,可以通过time.time()
获得。时间戳是一个浮点数,可以进行加减运算,但请注意不要让结果超出取值范围。 - 格式化的时间字符串(
string_time
):也就是年月日时分秒这样的我们常见的时间字符串,例如2017-09-26 09:12:48
,可以通过time.localtime()
获得; - 结构化时间(
struct_time
):一个包含了年月日时分秒的多元元组,例如time.struct_time(tm_year=2017, tm_mon=9, tm_mday=26, tm_hour=9, tm_min=14, tm_sec=50, tm_wday=1, tm_yday=269, tm_isdst=0)
,可以通过time.strftime('%Y-%m-%d')
获得。
python三种格式的时间可以按照以下方式进行转化:
2.结构化时间(struct_time)
>>> date=time.localtime()
>>> date
time.struct_time(tm_year=2022, tm_mon=6, tm_mday=3, tm_hour=11, tm_min=46, tm_sec=39, tm_wday=4, tm_yday=154, tm_isdst=0)
>>> date.tm_year
2022
>>> date[0]
2022
>>>
它是一个结构化时间元组,这种可以通过名称来访问内部元素的元组也叫named tuple – 具名元组:
以下是不同的属性名的取值范围,与C结构不同,月份值是 [1,12] 的范围,而不是 [0,11] 。
索引 | 属性 | 值 |
0 |
| (例如,1993) |
1 |
| range [1, 12] |
2 |
| range [1, 31] |
3 |
| range [0, 23] |
4 |
| range [0, 59] |
5 |
| range [0, 61]; 见 strftime() 介绍中的 (2) |
6 |
| range [0, 6] ,周一为 0 |
7 |
| range [1, 366] |
8 |
| 0, 1 或 -1;值-1表示这是未知的 |
N/A |
| 时区名称的缩写 |
N/A |
| 以秒为单位的UTC以东偏离 |
元组可以使用切片取值,但是值是不可变类型。
>>> date[0:5]
(2022, 6, 3, 11, 46)
>>> date[5]=42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'time.struct_time' object does not support item assignment
3.格式化时间字符串
>>> time.strftime('%Y-%m-%d %H:%M:%S')
'2022-06-03 12:06:58'
其控制格式符如下表所示:
指令 | 含意 |
| 本地化的缩写星期中每日的名称。 |
| 本地化的星期中每日的完整名称。 |
| 本地化的月缩写名称。 |
| 本地化的月完整名称。 |
| 本地化的适当日期和时间表示。 |
| 十进制数 [01,31] 表示的月中日。 |
| 十进制数 [00,23] 表示的小时(24小时制)。 |
| 十进制数 [01,12] 表示的小时(12小时制)。 |
| 十进制数 [001,366] 表示的年中日。 |
| 十进制数 [01,12] 表示的月。 |
| 十进制数 [00,59] 表示的分钟。 |
| 本地化的 AM 或 PM 。 |
| 十进制数 [00,61] 表示的秒。 |
| 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)。 在第一个星期日之前的新年中的所有日子都被认为是在第 0 周。 |
| 十进制数 [0(星期日),6] 表示的周中日。 |
| 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 在第一个星期一之前的新年中的所有日子被认为是在第 0 周。 |
| 本地化的适当日期表示。 |
| 本地化的适当时间表示。 |
| 十进制数 [00,99] 表示的没有世纪的年份。 |
| 十进制数表示的带世纪的年份。 |
| Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59]. 1 |
| Time zone name (no characters if no time zone exists). Deprecated. 1 |
| 字面的 |
某些平台可能支持其他指令,但只有此处列出的指令具有 ANSI C 标准化的含义。要查看平台支持的完整格式代码集,请参阅 strftime(3) 文档。
4.time模块主要函数
4.1 time.asctime([t])
把结构化时间struct_time元组表示为以下形式的字符串: 'Sun Jun 20 23:21:05 1993'
。日期字段的长度为两个字符,如果日期只有一个数字则会以零填充,例如: 'Wed Jun 9 04:26:40 1993'
- 如果未提供 t,则会使用 localtime() 所返回的当前时间。 asctime() 不会使用区域设置信息。
- 与同名的C函数不同, asctime() 不添加尾随换行符。
4.2 time.ctime([secs])
转换以距离初始纪元的秒数表示的时间为以下形式的字符串: ‘Sun Jun 20 23:21:05 1993’ 代表本地时间。填充规则与time.asctime([t])相同。
- 如果 secs 未提供或为 None,则使用 time() 所返回的当前时间。
ctime(secs)
等价于asctime(localtime(secs))
。 ctime() 不会使用区域设置信息。
4.3 time.get_clock_info(name)
获取有关指定时钟的信息作为命名空间对象。 命名空间是存放变量的场所,里面包含以下变量:
- adjustable : 如果时钟可以自动更改(例如通过NTP守护程序)或由系统管理员手动更改,则为
True
,否则为False
。 - implementation : 用于获取时钟值的基础C函数的名称。
- monotonic :如果时钟不能倒退,则为
True
,否则为False
。 - resolution : 以秒为单位的时钟分辨率(
float
)
>>> time.get_clock_info('time')
namespace(implementation='GetSystemTimeAsFileTime()', monotonic=False, adjustable=True, resolution=0.015625)
支持的时钟名称和读取其值的相应函数是:
-
'monotonic'
: time.monotonic() -
'perf_counter'
: time.perf_counter() -
'process_time'
: time.process_time() -
'thread_time'
: time.thread_time() -
'time'
: time.time()
4.4 time.gmtime([secs])
将以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time ,其中 dst 标志始终为零。 如果未提供 secs 或为 None ,则使用 time() 所返回的当前时间。 一秒以内的小数将被忽略。
4.5 time.localtime([secs])
与 gmtime() 相似但转换为当地时间。如果未提供 secs 或为 None ,则使用由 time() 返回的当前时间。当 DST 适用于给定时间时,dst标志设置为 1 。
注意:如果给定的时间超出了底层平台©支持时,比如32位限制1970 and 2038,将触发溢出错误。
4.6 time.mktime(t)
这是 localtime() 的反函数。
- 参数是 struct_time 或者完整的 9 元组(因为需要 dst 标志;如果它是未知的则使用 -1 作为dst标志)
- 表示 local 的时间,而不是 UTC 。
- 返回一个浮点数,以便与 time() 兼容。
- 如果输入值不能表示为有效时间,则触发错误
- 可以生成的最早时间,取决于平台实现
4.7 time.monotonic()→float /time.monotonic_ns() → int
(以小数表示的秒为单位)返回一个单调时钟的值,即不能倒退的时钟。 该时钟不受系统时钟更新的影响。
返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。
4.8 time.perf_counter() → float/time.perf_counter_ns() → int
(以小数表示的秒为单位)返回一个性能计数器的值,即用于测量较短持续时间的具有最高有效精度的时钟。 它会包括睡眠状态所消耗的时间并且作用于全系统范围。
返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。
4.9 time.process_time() → float/time.process_time_ns() → int
(以小数表示的秒为单位)返回当前进程的系统和用户 CPU 时间的总计值。 它不包括睡眠状态所消耗的时间。 根据定义它只作用于进程范围。
返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。
4.10 time.sleep(t)
time模块最常用的方法之一,用来睡眠或者暂停程序t秒,t可以是浮点数或整数。
由于系统需要调度其他活动,实际暂停时长也可能比请求的时间长。
4.11 time.strftime(format[, t])
把结构化时间struct_time元组表示为,由 format 参数指定的字符串。
如果未提供 t ,则使用由 localtime() 返回的当前时间。
4.12 time.strptime(string[, format])
根据格式解析表示时间的字符串。 返回值为一个结构化时间struct_time元组。
- format 参数使用与 strftime() 相同的指令。 、
- 默认为匹配 ctime() 所返回的格式 “%a %b %d %H:%M:%S %Y”` 。
- 如果 string 不能根据 format 来解析,或者解析后它有多余的数据,则会引发 ValueError
>>> time.strptime("2022-6-1 12:15:18","%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2022, tm_mon=6, tm_mday=1, tm_hour=12, tm_min=15, tm_sec=18, tm_wday=2, tm_yday=152, tm_isdst=-1)
4.13 time.time() → float/time.time_ns() → int
返回以浮点数表示的从 epoch 开始的秒数的时间值。 epoch 的具体日期和 leap seconds 的处理取决于平台。 在 Windows 和大多数 Unix 系统中, epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),并且闰秒将不计入从 epoch 开始的秒数。 这通常被称为 Unix 时间。
两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值。
4.14 time.thread_time() → float/time.thread_time_ns() → int
以小数表示的秒为单位)返回当前线程的系统和用户 CPU 时间的总计值。 它不包括睡眠状态所消耗的时间。 根据定义它只作用于线程范围。 返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。
5.可用于Unix平台的time模块方法
5.1 time.pthread_getcpuclockid(thread_id)
返回指定的 thread_id 的特定于线程的CPU时间时钟的 clk_id 。
5.2 time.clock_getres(clk_id)
返回指定时钟 clk_id 的分辨率(精度)。
5.3 time.clock_gettime(clk_id)
返回指定 clk_id 时钟的时间,返回值为浮点数。
5.4 time.clock_gettime_ns(clk_id)
与 clock_gettime() 相似,但返回时间为纳秒,整数。
5.5 time.clock_settime(clk_id, time: float)
设置指定 clk_id 时钟的时间。 目前, CLOCK_REALTIME 是 clk_id 唯一可接受的值。
5.6 time.clock_settime_ns(clk_id, time: int)
与 clock_settime() 相似,但设置时间为纳秒。
5.7 time.tzset()
重置库例程使用的时间转换规则。环境变量 TZ
指定如何完成。具体详看官方文档!
6.Clock ID 可用常量
这些常量用作 clock_getres() 和 clock_gettime() 的参数。
6.1 time.CLOCK_MONOTONIC
无法设置的时钟,表示自某些未指定的起点以来的单调时间。
可用性: Unix。
6.2 time.CLOCK_BOOTTIME
与 CLOCK_MONOTONIC 相同,除了它还包括系统暂停的任何时间。
可用性: Linux 2.6.39 或更新
6.3 time.CLOCK_HIGHRES
Solaris OS 有一个 CLOCK_HIGHRES 计时器,试图使用最佳硬件源,并可能提供接近纳秒的分辨率。 CLOCK_HIGHRES 是不可调节的高分辨率时钟。
6.4 time.CLOCK_MONOTONIC_RAW
类似于 CLOCK_MONOTONIC ,但可以访问不受NTP调整影响的原始硬件时间。
可用性: Linux 2.6.28 和更新版本, macOS 10.12 和更新版本。
6.5 time.CLOCK_PROCESS_CPUTIME_ID
来自CPU的高分辨率每进程计时器。
可用性: Unix。
6.6 time.CLOCK_PROF
来自CPU的高分辨率每进程计时器。
6.7 time.CLOCK_TAI
国际原子时间
该系统必须有一个当前闰秒表以便能给出正确的回答。 PTP 或 NTP 软件可以用来维护闰秒表。
可用性: Linux。
6.8 time.CLOCK_THREAD_CPUTIME_ID
特定于线程的CPU时钟。
可用性: Unix。
6.9 time.CLOCK_UPTIME
该时间的绝对值是系统运行且未暂停的时间,提供准确的正常运行时间测量,包括绝对值和间隔值。
可用性: FreeBSD, OpenBSD 5.5 或更新。
6.10 time.CLOCK_UPTIME_RAW
单调递增的时钟,记录从一个任意起点开始的时间,不受频率或时间调整的影响,并且当系统休眠时将不会递增。
可用性: macOS 10.12 和更新版本。
6.11 time.CLOCK_REALTIME
是唯一可以发送到 clock_settime() 的参数。
系统范围的实时时钟。 设置此时钟需要适当的权限。
可用性: Unix。
7. 时区常量
7.1 time.altzone
本地DST时区的偏移量,以UTC为单位的秒数,如果已定义。如果当地DST时区在UTC以东(如在西欧,包括英国),则是负数。 只有当 daylight 非零时才使用它。
7.2 time.daylight
如果定义了DST时区,则为非零。
7.3 time.timezone
本地(非DST)时区的偏移量,UTC以西的秒数(西欧大部分地区为负,美国为正,英国为零)。 见下面的注释。
7.4 time.tzname
两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。 如果未定义DST时区,则不应使用第二个字符串。