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模块中常见定义的描述:

  • 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中,用三种方式来表示时间,分别是时间戳、格式化时间字符串和结构化时间

  1. 时间戳(timestamp):也就是1970年1月1日之后的秒,例如1506388236.216345,可以通过time.time()获得。时间戳是一个浮点数,可以进行加减运算,但请注意不要让结果超出取值范围。
  2. 格式化的时间字符串(string_time):也就是年月日时分秒这样的我们常见的时间字符串,例如2017-09-26 09:12:48,可以通过time.localtime()获得;
  3. 结构化时间(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三种格式的时间可以按照以下方式进行转化

Pythontimestamp保存年月日_十进制数

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 – 具名元组

详情参阅:术语对照表 — Python 3.10.4 文档

以下是不同的属性名的取值范围,与C结构不同,月份值是 [1,12] 的范围,而不是 [0,11] 。

索引

属性


0

tm_year

(例如,1993)

1

tm_mon

range [1, 12]

2

tm_mday

range [1, 31]

3

tm_hour

range [0, 23]

4

tm_min

range [0, 59]

5

tm_sec

range [0, 61]; 见 strftime() 介绍中的 (2)

6

tm_wday

range [0, 6] ,周一为 0

7

tm_yday

range [1, 366]

8

tm_isdst

0, 1 或 -1;值-1表示这是未知的

N/A

tm_zone

时区名称的缩写

N/A

tm_gmtoff

以秒为单位的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'

其控制格式符如下表所示:

指令

含意

%a

本地化的缩写星期中每日的名称。

%A

本地化的星期中每日的完整名称。

%b

本地化的月缩写名称。

%B

本地化的月完整名称。

%c

本地化的适当日期和时间表示。

%d

十进制数 [01,31] 表示的月中日。

%H

十进制数 [00,23] 表示的小时(24小时制)。

%I

十进制数 [01,12] 表示的小时(12小时制)。

%j

十进制数 [001,366] 表示的年中日。

%m

十进制数 [01,12] 表示的月。

%M

十进制数 [00,59] 表示的分钟。

%p

本地化的 AM 或 PM 。

%S

十进制数 [00,61] 表示的秒。

%U

十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)。 在第一个星期日之前的新年中的所有日子都被认为是在第 0 周。

%w

十进制数 [0(星期日),6] 表示的周中日。

%W

十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 在第一个星期一之前的新年中的所有日子被认为是在第 0 周。

%x

本地化的适当日期表示。

%X

本地化的适当时间表示。

%y

十进制数 [00,99] 表示的没有世纪的年份。

%Y

十进制数表示的带世纪的年份。

%z

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

%Z

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)

支持的时钟名称和读取其值的相应函数是:

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_REALTIMEclk_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时区,则不应使用第二个字符串。