16.3. time — 时间的访问和转换
尽管此模块始终可用,但并非所有平台上都提供所有功能。 此模块中定义的大多数函数是调用了所在平台 C 语言库的同名函数。 因为这些函数的语义因平台而异,所以使用时最好查阅平台相关文档。
下面是一些术语和惯例的解释.
epoch 是时间开始的点,并且取决于平台。对于Unix, epoch 是1970年1月1日00:00:00(UTC)。要找出给定平台上的 epoch ,请查看 。
术语 Unix 纪元秒数 是指自国际标准时间 1970 年 1 月 1 日零时以来经过的总秒数,通常不包括 。 在所有符合 POSIX 标准的平台上,闰秒都会从总秒数中被扣除。
此模块中的功能可能无法处理纪元之前或将来的远期日期和时间。未来的截止点由C库决定;对于32位系统,它通常在2038年。
Year 2000 (Y2K) issues: Python depends on the platform’s C library, which generally doesn’t have year 2000 issues, since all dates and times are represented internally as seconds since the epoch. Function strptime() can parse 2-digit years when given
%y
format code. When 2-digit years are parsed, they are converted according to the POSIX and ISO C standards: values 69–99 are mapped to 1969–1999, and values 0–68 are mapped to 2000–2068.UTC是协调世界时(以前称为格林威治标准时间,或GMT)。缩写UTC不是错误,而是英语和法语之间的妥协。
各种实时函数的精度可能低于表示其值或参数的单位所建议的精度。例如,在大多数Unix系统上,时钟 “ticks” 仅为每秒50或100次。
另一方面, 和 sleep() 的精度优于它们的Unix等价物:时间表示为浮点数, 返回最准确的时间 (使用Unix
gettimeofday()
如果可用),并且 sleep() 将接受非零分数的时间(Unixselect()
用于实现此功能,如果可用)。时间值由 ,localtime() 和 返回,并被 asctime(), 和 strftime() 接受,是一个 9 个整数的序列。 , localtime() 和 的返回值还提供各个字段的属性名称。
请参阅 struct_time 以获取这些对象的描述。
在 3.3 版更改: 在平台支持相应的
struct tm
成员时, 类型被扩展提供tm_gmtoff
和tm_zone
属性。在 3.6 版更改: struct_time 的属性
tm_gmtoff
和tm_zone
现在可在所有平台上使用。使用以下函数在时间表示之间进行转换:
time.asctime
([t])
转换一个元组或 表示的时间,由 gmtime() 或 返回为以下形式的字符串: 'Sun Jun 20 23:21:05 1993'
。如果未提供 t ,则使用由 localtime() 返回的当前时间。 区域信息不被函数 使用。
注解
与同名的C函数不同, asctime() 不添加尾随换行符。
time.clock
()
在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精确度,实际上是“处理器时间”含义的定义,取决于同名C函数的精度。
在Windows上,此函数返回自第一次调用此函数以来经过的 wallclock 秒数,作为浮点数,基于Win32函数 QueryPerformanceCounter()
。分辨率通常优于1微秒。
3.3 版后已移除: 此函数的行为取决于平台:根据你的需求,使用 或 process_time() 获得具有明确定义的行为。
time.clock_getres
(clk_id)
返回指定时钟 clk_id 的分辨率(精度)。有关 clk_id 的可接受值列表,请参阅 。
Availability: Unix.
3.3 新版功能.
time.clock_gettime
(clk_id)
返回指定 clk_id 时钟的时间。有关 clk_id 的可接受值列表,请参阅 Clock ID 常量 。
Availability: Unix.
3.3 新版功能.
time.clock_settime
(clk_id, time)
设置指定 clk_id 时钟的时间。 目前, 是 clk_id 唯一可接受的值。
Availability: Unix.
3.3 新版功能.
time.ctime
([secs])
将以自 epoch 开始的秒数表示的时间转换为表示本地时间的字符串。 如果未提供 secs 或为 None,则使用 所返回的当前时间。 ctime(secs)
相当于 asctime(localtime(secs))
。 区域信息不会被 ctime() 使用。
time.get_clock_info
(name)
获取有关指定时钟的信息作为命名空间对象。 支持的时钟名称和读取其值的相应函数是:
'clock'
:'monotonic'
: time.monotonic()'perf_counter'
:'process_time'
: time.process_time()
结果具有以下属性:
adjustable : 如果时钟可以自动更改(例如通过NTP守护程序)或由系统管理员手动更改,则为
True
,否则为False
。implementation : 用于获取时钟值的基础C函数的名称。有关可能的值,请参阅 。
monotonic :如果时钟不能倒退,则为
True
,否则为False
。resolution : 以秒为单位的时钟分辨率( float )
3.3 新版功能.
time.gmtime
([secs])
将以自 epoch 开始的秒数表示的时间转换为 UTC 的 ,其中 dst 标志始终为零。 如果未提供 secs 或为 None ,则使用 所返回的当前时间。 一秒以内的小数将被忽略。 有关 struct_time 对象的说明请参见上文。 有关此函数的逆操作请参阅 。
time.localtime
([secs])
与 gmtime() 相似但转换为当地时间。如果未提供 secs 或为 ,则使用由 time() 返回的当前时间。当 DST 适用于给定时间时,dst标志设置为 1
。
time.mktime
(t)
这是 的反函数。它的参数是 struct_time 或者完整的 9 元组(因为需要 dst 标志;如果它是未知的则使用 -1
作为dst标志),它表示 local 的时间,而不是 UTC 。它返回一个浮点数,以便与 兼容。如果输入值不能表示为有效时间,则 OverflowError 或 将被引发(这取决于Python或底层C库是否捕获到无效值)。它可以生成时间的最早日期取决于平台。
time.monotonic
()
返回单调时钟的值(以小数秒为单位),即不能倒退的时钟。时钟不受系统时钟更新的影响。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。
On Windows versions older than Vista, monotonic() detects GetTickCount()
integer overflow (32 bits, roll-over after 49.7 days). It increases an internal epoch (reference time) by 232 each time that an overflow is detected. The epoch is stored in the process-local state and so the value of may be different in two Python processes running for more than 49 days. On more recent versions of Windows and on other operating systems, monotonic() is system-wide.
3.3 新版功能.
在 3.5 版更改: The function is now always available.
time.perf_counter
()
返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟,以测量短持续时间。它确实包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。
3.3 新版功能.
time.process_time
()
返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)。它不包括睡眠期间经过的时间。根据定义,它在整个进程范围中。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。
3.3 新版功能.
time.sleep
(secs)
暂停执行调用线程达到给定的秒数。参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止 。此外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意量。
在 3.5 版更改: 即使睡眠被信号中断,该函数现在至少睡眠 secs ,除非信号处理程序引发异常(参见 PEP 475 作为基本原理)。
time.strftime
(format[, t])
转换一个元组或 表示的由 gmtime() 或 返回的时间到由 format 参数指定的字符串。如果未提供 t ,则使用由 localtime() 返回的当前时间。 format 必须是一个字符串。如果 t 中的任何字段超出允许范围,则引发 。
0是时间元组中任何位置的合法参数;如果它通常是非法的,则该值被强制改为正确的值。
注释:
当与 strptime() 函数一起使用时,如果使用
%I
指令来解析小时,%p
指令只影响输出小时字段。范围真的是
0
到61
;值60
在表示 的时间戳中有效,并且由于历史原因支持值61
。当与 strptime() 函数一起使用时,
%U
和%W
仅用于指定星期几和年份的计算。
下面是一个示例,一个与 Internet电子邮件标准以兼容的日期格式。 1
某些平台可能支持其他指令,但只有此处列出的指令具有 ANSI C 标准化的含义。要查看平台支持的完整格式代码集,请参阅 strftime(3) 文档。
在某些平台上,可选的字段宽度和精度规范可以按照以下顺序紧跟在指令的初始 '%'
之后;这也不可移植。字段宽度通常为2,除了 %j
,它是3。
time.strptime
(string[, format])
根据格式解析表示时间的字符串。 返回值为一个被 或 localtime() 返回的 。
format 参数使用与 strftime() 相同的指令。 它默认为匹配 所返回的格式 "%a %b %d %H:%M:%S %Y"`
。 如果 string 不能根据 format 来解析,或者解析后它有多余的数据,则会引发 ValueError。 当无法推断出更准确的值时,用于填充任何缺失数据的默认值是 (1900, 1, 1, 0, 0, 0, 0, 1, -1)
。 string 和 format 都必须为字符串。
例如:
支持 %Z
指令是基于 tzname
中包含的值以及 daylight
是否为真。因此,它是特定于平台的,除了识别始终已知的 UTC 和 GMT (并且被认为是非夏令时时区)。
仅支持文档中指定的指令。因为每个平台都实现了 strftime()
,它有时会提供比列出的指令更多的指令。但是 strptime()
独立于任何平台,因此不一定支持所有未记录为支持的可用指令。
class time.struct_time
返回的时间值序列的类型为 、 localtime() 和 。它是一个带有 named tuple 接口的对象:可以通过索引和属性名访问值。 存在以下值:
请注意,与C结构不同,月份值是 [1,12] 的范围,而不是 [0,11] 。
在调用 时, tm_isdst
可以在夏令时生效时设置为1,而在夏令时不生效时设置为0。 值-1表示这是未知的,并且通常会导致填写正确的状态。
当一个长度不正确的元组被传递给期望 struct_time 的函数,或者具有错误类型的元素时,会引发 。
time.time
()
返回以浮点数表示的从 epoch 开始的秒数的时间值。 epoch 的具体日期和 的处理取决于平台。 在 Windows 和大多数 Unix 系统中, epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),并且闰秒将不计入从 epoch 开始的秒数。 这通常被称为 Unix 时间。 要了解给定平台上 epoch 的具体定义,请查看 gmtime(0)
。
请注意,即使时间总是作为浮点数返回,但并非所有系统都提供高于1秒的精度。虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值。
返回的数字 可以通过将其传递给 gmtime() 函数或转换为UTC中更常见的时间格式(即年、月、日、小时等)或通过将它传递给 函数获得本地时间。在这两种情况下都返回一个 struct_time 对象,日历日期组件可以从中作为属性访问。
time.tzset
()
Resets the time conversion rules used by the library routines. The environment variable TZ
specifies how this is done.
Availability: Unix.
注解
虽然在很多情况下,更改 TZ
环境变量而不调用 可能会影响函数的输出,例如 localtime() ,不应该依赖此行为。
TZ
不应该包含空格。
TZ
环境变量的标准格式是(为了清晰起见,添加了空格):
组件的位置是:
std
和dst
三个或更多字母数字,给出时区缩写。这些将传到 time.tzname
offset
偏移量的形式为:
± hh[:mm[:ss]]
。这表示添加到达UTC的本地时间的值。如果前面有 ‘-‘ ,则时区位于本初子午线的东边;否则,在它是西边。如果dst之后没有偏移,则假设夏令时比标准时间提前一小时。start[/time], end[/time]
指示何时更改为DST和从DST返回。开始日期和结束日期的格式为以下之一:
time
的格式与offset
的格式相同,但不允许使用前导符号( ‘-‘ 或 ‘+’ )。如果没有给出时间,则默认值为02:00:00。
在许多Unix系统(包括 BSD , Linux , Solaris 和 Darwin 上),使用系统的区域信息( tzfile(5)* )数据库来指定时区规则会更方便。为此,将 TZ
环境变量设置为所需时区数据文件的路径,相对于系统 ‘zoneinfo’ 时区数据库的根目录,通常位于 /usr/share/zoneinfo
。 例如,'US/Eastern'
、 'Australia/Melbourne'
、 'Egypt'
或 'Europe/Amsterdam'
。
这些常量用作 和 clock_gettime() 的参数。
time.CLOCK_HIGHRES
Solaris OS 有一个 CLOCK_HIGHRES
计时器,试图使用最佳硬件源,并可能提供接近纳秒的分辨率。 CLOCK_HIGHRES
是不可调节的高分辨率时钟。
Availability: Solaris.
3.3 新版功能.
time.CLOCK_MONOTONIC
无法设置的时钟,表示自某些未指定的起点以来的单调时间。
Availability: Unix.
3.3 新版功能.
time.CLOCK_MONOTONIC_RAW
类似于 ,但可以访问不受NTP调整影响的原始硬件时间。
Availability: Linux 2.6.28 or later.
3.3 新版功能.
time.CLOCK_PROCESS_CPUTIME_ID
来自CPU的高分辨率每进程计时器。
Availability: Unix.
3.3 新版功能.
time.CLOCK_THREAD_CPUTIME_ID
特定于线程的CPU时钟。
Availability: Unix.
3.3 新版功能.
以下常量是唯一可以发送到 clock_settime() 的参数。
time.CLOCK_REALTIME
系统范围的实时时钟。 设置此时钟需要适当的权限。
Availability: Unix.
3.3 新版功能.
time.altzone
本地DST时区的偏移量,以UTC为单位的秒数,如果已定义。如果当地DST时区在UTC以东(如在西欧,包括英国),则是负数。 只有当 daylight
非零时才使用它。 见下面的注释。
time.daylight
如果定义了DST时区,则为非零。 见下面的注释。
time.timezone
本地(非DST)时区的偏移量,UTC以西的秒数(西欧大部分地区为负,美国为正,英国为零)。 见下面的注释。
time.tzname
两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。 如果未定义DST时区,则不应使用第二个字符串。 见下面的注释。
注解
对于上述时区常量( 、 daylight 、 和 tzname ),该值由模块加载时有效的时区规则确定,或者最后一次 被调用时,并且在过去的时间可能不正确。建议使用来自 localtime() 结果的 tm_gmtoff
和 tm_zone
来获取时区信息。
参见
模块
更多面向对象的日期和时间接口。
模块 locale
国际化服务。 区域设置会影响 和 strptime() 中许多格式说明符的解析。
模块
一般日历相关功能。这个模块的 timegm()
是函数 gmtime() 的反函数。
备注
现在不推荐使用 %Z
,但是所有 ANSI C 库都不支持扩展为首选小时/分钟偏移量的``%z``转义符。 此外,严格的 1982 年原始 标准要求两位数的年份(%y而不是%Y),但是实际在2000年之前很久就转移到了4位数年。之后, RFC 822 已经废弃了,4位数的年份首先被推荐 ,然后被 RFC 2822 强制执行。