16.3. time — 时间的访问和转换


该模块提供了各种时间相关的函数。相关功能还可以参阅 datetimecalendar 模块。

尽管此模块始终可用,但并非所有平台上都提供所有功能。 此模块中定义的大多数函数是调用了所在平台 C 语言库的同名函数。 因为这些函数的语义因平台而异,所以使用时最好查阅平台相关文档。

下面是一些术语和惯例的解释.

  • epoch 是时间开始的点,并且取决于平台。对于Unix, epoch 是1970年1月1日00:00:00(UTC)。要找出给定平台上的 epoch ,请查看 time.gmtime(0)
  • 术语 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不是错误,而是英语和法语之间的妥协。
  • DST是夏令时,在一年中的一部分时间(通常)调整时区一小时。 DST规则很神奇(由当地法律确定),并且每年都会发生变化。 C 库有一个包含本地规则的表(通常是从系统文件中读取以获得灵活性),并且在这方面是True Wisdom的唯一来源。

  • 各种实时函数的精度可能低于表示其值或参数的单位所建议的精度。例如,在大多数Unix系统上,时钟 “ticks” 仅为每秒50或100次。

  • 另一方面, time()sleep() 的精度优于它们的Unix等价物:时间表示为浮点数,time() 返回最准确的时间 (使用Unix gettimeofday() 如果可用),并且 sleep() 将接受非零分数的时间(Unix select() 用于实现此功能,如果可用)。

  • 时间值由 gmtime()localtime()strptime() 返回,并被 asctime()mktime()strftime() 接受,是一个 9 个整数的序列。 gmtime()localtime()strptime() 的返回值还提供各个字段的属性名称。

    请参阅 struct_time 以获取这些对象的描述。

    在 3.3 版更改: 在平台支持相应的 struct tm 成员时,struct_time 类型被扩展提供 tm_gmtofftm_zone 属性。

  • 使用以下函数在时间表示之间进行转换:

    使用
    seconds since the epoch UTC 的 struct_time gmtime()
    seconds since the epoch 本地时间的 struct_time localtime()
    UTC 的 struct_time seconds since the epoch calendar.timegm()
    本地时间的 struct_time seconds since the epoch mktime()

The module defines the following functions and data items:

time.altzone

The offset of the local DST timezone, in seconds west of UTC, if one is defined. This is negative if the local DST timezone is east of UTC (as in Western Europe, including the UK). Only use this if daylight is nonzero.

time.asctime([t])

转换一个元组或 struct_time 表示的时间,由 gmtime()localtime() 返回为以下形式的字符串: 'Sun Jun 20 23:21:05 1993' 。如果未提供 t ,则使用由 localtime() 返回的当前时间。 区域信息不被函数 asctime() 使用。

注解

与同名的C函数不同, asctime() 不添加尾随换行符。

time.clock()

在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精确度,实际上是“处理器时间”含义的定义,取决于同名C函数的精度。

在Windows上,此函数返回自第一次调用此函数以来经过的 wallclock 秒数,作为浮点数,基于Win32函数 QueryPerformanceCounter()。分辨率通常优于1微秒。

3.3 版后已移除: 此函数的行为取决于平台:根据你的需求,使用 perf_counter()process_time() 获得具有明确定义的行为。

time.clock_getres(clk_id)

Return the resolution (precision) of the specified clock clk_id.

Availability: Unix.

3.3 新版功能.

time.clock_gettime(clk_id)

Return the time of the specified clock clk_id.

Availability: Unix.

3.3 新版功能.

time.clock_settime(clk_id, time)

Set the time of the specified clock clk_id.

Availability: Unix.

3.3 新版功能.

time.CLOCK_HIGHRES

The Solaris OS has a CLOCK_HIGHRES timer that attempts to use an optimal hardware source, and may give close to nanosecond resolution. CLOCK_HIGHRES is the nonadjustable, high-resolution clock.

Availability: Solaris.

3.3 新版功能.

time.CLOCK_MONOTONIC

无法设置的时钟,表示自某些未指定的起点以来的单调时间。

Availability: Unix.

3.3 新版功能.

time.CLOCK_MONOTONIC_RAW

类似于 CLOCK_MONOTONIC ,但可以访问不受NTP调整影响的原始硬件时间。

Availability: Linux 2.6.28 or later.

3.3 新版功能.

time.CLOCK_PROCESS_CPUTIME_ID

来自CPU的高分辨率每进程计时器。

Availability: Unix.

3.3 新版功能.

time.CLOCK_REALTIME

系统范围的实时时钟。 设置此时钟需要适当的权限。

Availability: Unix.

3.3 新版功能.

time.CLOCK_THREAD_CPUTIME_ID

特定于线程的CPU时钟。

Availability: Unix.

3.3 新版功能.

time.ctime([secs])

将以自 epoch 开始的秒数表示的时间转换为表示本地时间的字符串。 如果未提供 secs 或为 None,则使用 time() 所返回的当前时间。 ctime(secs) 相当于 asctime(localtime(secs))。 区域信息不会被 ctime() 使用。

time.daylight

Nonzero if a DST timezone is defined.

time.get_clock_info(name)

获取有关指定时钟的信息作为命名空间对象。 支持的时钟名称和读取其值的相应函数是:

结果具有以下属性:

  • adjustable : 如果时钟可以自动更改(例如通过NTP守护程序)或由系统管理员手动更改,则为 True ,否则为 False
  • implementation: The name of the underlying C function used to get the clock value
  • monotonic :如果时钟不能倒退,则为 True ,否则为 False
  • resolution : 以秒为单位的时钟分辨率( float

3.3 新版功能.

time.gmtime([secs])

将以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time ,其中 dst 标志始终为零。 如果未提供 secs 或为 None ,则使用 time() 所返回的当前时间。 一秒以内的小数将被忽略。 有关 struct_time 对象的说明请参见上文。 有关此函数的逆操作请参阅 calendar.timegm()

time.localtime([secs])

gmtime() 相似但转换为当地时间。如果未提供 secs 或为 None ,则使用由 time() 返回的当前时间。当 DST 适用于给定时间时,dst标志设置为 1

time.mktime(t)

这是 localtime() 的反函数。它的参数是 struct_time 或者完整的 9 元组(因为需要 dst 标志;如果它是未知的则使用 -1 作为dst标志),它表示 local 的时间,而不是 UTC 。它返回一个浮点数,以便与 time() 兼容。如果输入值不能表示为有效时间,则 OverflowErrorValueError 将被引发(这取决于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 monotonic() 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)

暂停执行调用线程达到给定的秒数。参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止 sleep() 。此外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意量。

在 3.5 版更改: 即使睡眠被信号中断,该函数现在至少睡眠 secs ,除非信号处理程序引发异常(参见 PEP 475 作为基本原理)。

time.strftime(format[, t])

转换一个元组或 struct_time 表示的由 gmtime()localtime() 返回的时间到由 format 参数指定的字符串。如果未提供 t ,则使用由 localtime() 返回的当前时间。 format 必须是一个字符串。如果 t 中的任何字段超出允许范围,则引发 ValueError

0是时间元组中任何位置的合法参数;如果它通常是非法的,则该值被强制改为正确的值。

以下指令可以嵌入 format 字符串中。它们显示时没有可选的字段宽度和精度规范,并被 strftime() 结果中的指示字符替换:

指令 含义 注释
%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 。 (1)
%S 十进制数 [00,61] 表示的秒。 (2)
%U 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)作为。在第一个星期日之前的新年中的所有日子都被认为是在第0周。 (3)
%w 十进制数 [0(星期日),6] 表示的周中日。  
%W 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第0周。 (3)
%x 本地化的适当日期表示。  
%X 本地化的适当时间表示。  
%y 十进制数 [00,99] 表示的没有世纪的年份。  
%Y 十进制数表示的带世纪的年份。  
%z 时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, +23:59] 。  
%Z 时区名称(如果不存在时区,则不包含字符)。  
%% 字面的 '%' 字符。  

注释:

  1. 当与 strptime() 函数一起使用时,如果使用 %I 指令来解析小时, %p 指令只影响输出小时字段。
  2. 范围真的是 061 ;值 60 在表示 leap seconds 的时间戳中有效,并且由于历史原因支持值 61
  3. 当与 strptime() 函数一起使用时, %U%W 仅用于指定星期几和年份的计算。

下面是一个示例,一个与 RFC 2822 Internet电子邮件标准以兼容的日期格式。 [1]

>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
'Thu, 28 Jun 2001 14:17:15 +0000'

某些平台可能支持其他指令,但只有此处列出的指令具有 ANSI C 标准化的含义。要查看平台支持的完整格式代码集,请参阅 strftime(3) 文档。

在某些平台上,可选的字段宽度和精度规范可以按照以下顺序紧跟在指令的初始 '%' 之后;这也不可移植。字段宽度通常为2,除了 %j ,它是3。

time.strptime(string[, format])

根据格式解析表示时间的字符串。 返回值为一个被 gmtime()localtime() 返回的 struct_time

format 参数使用与 strftime() ;使用的指令相同的指令。它默认为匹配 ctime() 返回格式的 "%a %b %d %H:%M:%S %Y"` 。如果 string*不能根据 *format 解析,或者解析后它有多余的数据,则引发 ValueError 。当无法推断出更准确的值时,用于填充任何缺失数据的默认值是 (1900, 1, 1, 0, 0, 0, 0, 1, -1)stringformat 都必须是字符串。

例如:

>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y")   # doctest: +NORMALIZE_WHITESPACE
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)

支持 %Z 指令是基于 tzname 中包含的值以及 daylight 是否为真。因此,它是特定于平台的,除了识别始终已知的 UTC 和 GMT (并且被认为是非夏令时时区)。

仅支持文档中指定的指令。因为每个平台都实现了 strftime() ,它有时会提供比列出的指令更多的指令。但是 strptime() 独立于任何平台,因此不一定支持所有未记录为支持的可用指令。

class time.struct_time

返回的时间值序列的类型为 gmtime()localtime()strptime() 。它是一个带有 named tuple 接口的对象:可以通过索引和属性名访问值。 存在以下值:

索引 属性
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;如下所示
N/A tm_zone 时区名称的缩写
N/A tm_gmtoff 以秒为单位的UTC以东偏离

请注意,与C结构不同,月份值是 [1,12] 的范围,而不是 [0,11] 。

在调用 mktime() 时, tm_isdst 可以在夏令时生效时设置为1,而在夏令时不生效时设置为0。 值-1表示这是未知的,并且通常会导致填写正确的状态。

当一个长度不正确的元组被传递给期望 struct_time 的函数,或者具有错误类型的元素时,会引发 TypeError

在 3.3 版更改: tm_gmtoff and tm_zone attributes are available on platforms with C library supporting the corresponding fields in struct tm.

time.time()

返回以浮点数表示的从 epoch 开始的秒数的时间值。 epoch 的具体日期和 leap seconds 的处理取决于平台。 在 Windows 和大多数 Unix 系统中, epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),并且闰秒将不计入从 epoch 开始的秒数。 这通常被称为 Unix 时间。 要了解给定平台上 epoch 的具体定义,请查看 gmtime(0)

请注意,即使时间总是作为浮点数返回,但并非所有系统都提供高于1秒的精度。虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值。

返回的数字 time() 可以通过将其传递给 gmtime() 函数或转换为UTC中更常见的时间格式(即年、月、日、小时等)或通过将它传递给 localtime() 函数获得本地时间。在这两种情况下都返回一个 struct_time 对象,日历日期组件可以从中作为属性访问。

time.timezone

The offset of the local (non-DST) timezone, in seconds west of UTC (negative in most of Western Europe, positive in the US, zero in the UK).

time.tzname

A tuple of two strings: the first is the name of the local non-DST timezone, the second is the name of the local DST timezone. If no DST timezone is defined, the second string should not be used.

time.tzset()

Resets the time conversion rules used by the library routines. The environment variable TZ specifies how this is done.

Availability: Unix.

注解

虽然在很多情况下,更改 TZ 环境变量而不调用 tzset() 可能会影响函数的输出,例如 localtime() ,不应该依赖此行为。

TZ 不应该包含空格。

TZ 环境变量的标准格式是(为了清晰起见,添加了空格):

std offset [dst [offset [,start[/time], end[/time]]]]

组件的位置是:

stddst
三个或更多字母数字,给出时区缩写。这些将传到 time.tzname
offset
偏移量的形式为: ± hh[:mm[:ss]] 。这表示添加到达UTC的本地时间的值。如果前面有 ‘-‘ ,则时区位于本初子午线的东边;否则,在它是西边。如果dst之后没有偏移,则假设夏令时比标准时间提前一小时。
start[/time], end[/time]

指示何时更改为DST和从DST返回。开始日期和结束日期的格式为以下之一:

Jn
Julian日 n (1 <= n <= 365)。闰日不计算在内,因此在所有年份中,2月28日是第59天,3月1日是第60天。
n
从零开始的Julian日(0 <= n <= 365)。 闰日计入,可以引用2月29日。
Mm.n.d
The d’th day (0 <= d <= 6) or week n of month m of the year (1 <= n <= 5, 1 <= m <= 12, where week 5 means “the last d day in month m” which may occur in either the fourth or the fifth week). Week 1 is the first week in which the d’th day occurs. Day zero is Sunday.

time 的格式与 offset 的格式相同,但不允许使用前导符号( ‘-‘ 或 ‘+’ )。如果没有给出时间,则默认值为02:00:00。

>>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'02:07:36 05/08/03 EDT'
>>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'16:08:12 05/08/03 AEST'

在许多Unix系统(包括 *BSD , Linux , Solaris 和 Darwin 上),使用系统的区域信息( tzfile(5) )数据库来指定时区规则会更方便。为此,将 TZ 环境变量设置为所需时区数据文件的路径,相对于系统 ‘zoneinfo’ 时区数据库的根目录,通常位于 /usr/share/zoneinfo 。 例如,'US/Eastern''Australia/Melbourne''Egypt''Europe/Amsterdam'

>>> os.environ['TZ'] = 'US/Eastern'
>>> time.tzset()
>>> time.tzname
('EST', 'EDT')
>>> os.environ['TZ'] = 'Egypt'
>>> time.tzset()
>>> time.tzname
('EET', 'EEST')

参见

模块 datetime
更多面向对象的日期和时间接口。
模块 locale
国际化服务。 区域设置会影响 strftime()strptime() 中许多格式说明符的解析。
模块 calendar
一般日历相关功能。这个模块的 timegm() 是函数 gmtime() 的反函数。

备注

[1]现在不推荐使用 %Z ,但是所有 ANSI C 库都不支持扩展为首选小时/分钟偏移量的``%z``转义符。 此外,严格的 1982 年原始 RFC 822 标准要求两位数的年份(%y而不是%Y),但是实际在2000年之前很久就转移到了4位数年。之后, RFC 822 已经废弃了,4位数的年份首先被推荐 RFC 1123 ,然后被 RFC 2822 强制执行。