15.3. 时间-时间访问和转化

该模块提供各种与时间相关的Function。有关相关Function,另请参见datetimecalendar模块。

尽管此模块始终可用,但并非所有Function在所有平台上都可用。该模块中定义的大多数函数都调用具有相同名称的平台 C 库函数。有时查阅平台文档可能会有所帮助,因为这些Function的语义在平台之间会有所不同。

必须对一些术语和约定进行解释。

有关这些对象的说明,请参见struct_time

在版本 2.2 中进行了更改:时间值序列从 Tuples 更改为struct_time,并添加了字段的属性名称。

From To Use
自纪元以来的秒数 UTC struct_time gmtime()
自纪元以来的秒数 当地时间struct_time localtime()
UTC struct_time 自纪元以来的秒数 calendar.timegm()
当地时间struct_time 自纪元以来的秒数 mktime()

该模块定义了以下Function和数据项:

Note

与同名的 C 函数不同,没有尾随换行符。

在版本 2.1 中更改:允许Ellipsis* t *。

在 Windows 上,基于 Win32 函数QueryPerformanceCounter(),此函数返回自首次调用此函数以来经过的时间(以秒为单位),以浮点数表示。分辨率通常优于一微秒。

在版本 2.1 中更改:允许* secs *Ellipsis。

在版本 2.4 中更改:如果* secs *为None,则使用当前时间。

在版本 2.1 中更改:允许* secs *Ellipsis。

在版本 2.4 中更改:如果* secs *为None,则使用当前时间。

在版本 2.1 中更改:允许* secs *Ellipsis。

在版本 2.4 中更改:如果* secs *为None,则使用当前时间。

在版本 2.1 中更改:允许Ellipsis* t *。

在版本 2.4 中进行了更改:如果* t *中的字段超出范围,则引发ValueError

在版本 2.5 中进行了更改:0 现在是时间 Tuples 中任何位置的合法参数;如果通常是非法的,则将该值强制为正确的值。

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

Directive Meaning Notes
%a 语言环境的缩写工作日名称。
%A 语言环境的完整工作日名称。
%b 语言环境的缩写月份名称。
%B 语言环境的完整月份名称。
%c 语言环境的适当日期和时间表示。
%d 以十进制数[01,31]表示的月份中的一天。
%H 小时(24 小时制),为十进制数字[00,23]。
%I 小时(12 小时制)为十进制数字[01,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(Sunday),6]。
%W 一年中的星期号(星期一为星期的第一天),以十进制数[00,53]。第一个星期一之前的新的一年中的所有天都视为在第 0 周。 (3)
%x 语言环境的适当日期表示形式。
%X 语言环境的适当时间表示形式。
%y 没有世纪的年份作为十进制数字[00,99]。
%Y 以世纪作为十进制数字的年份。
%Z 时区名称(如果不存在时区,则没有字符)。
%% Literals'%'字符。

Notes:

这是一个示例,其格式与 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)*文档。

在某些平台上,可选的字段宽度和精度规范可以按以下 Sequences 立即位于指令的初始'%'后面;这也不是便携式的。字段宽度通常为 2,但%j为 3.

For example:

>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y")   
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是否为 true。因此,它是特定于平台的,除了可以识别已知的 UTC 和 GMT(并被认为是非夏令时区)。

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

Index Attribute Values
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 范围[0,61];参见strftime()说明中的 (2)
6 tm_wday 范围[0,6],星期一为 0
7 tm_yday range [1, 366]
8 tm_isdst 0,1 或-1;见下文

2.2 版中的新Function。

请注意,与 C 结构不同,月份值是[1,12]的范围,而不是[0,11]。将按照上面的2000 年(Y2K)问题所述处理年份值。

在对mktime()的呼叫中,如果实行夏令时,则tm_isdst可以设置为 1,否则不设置为 0.值-1 表示这是未知的,通常会导致填写正确的状态。

将长度不正确的 Tuples 传递给期望struct_time或具有错误类型的元素的函数时,将引发TypeError

2.3 版的新Function。

Availability: Unix.

Note

尽管在许多情况下,更改 TZ环境变量可能会影响localtime()之类的函数的输出而不调用tzset(),但是不应依赖此行为。

TZ环境变量不应包含空格。

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

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

其中的组件是:

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)上,使用系统的 zoneinfo(* 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')

See also

Footnotes

首页