time
时间访问和转换
该模块提供各种与时间有关的功能。有关相关功能,另请参阅datetime
和calendar
模块。
尽管此模块始终可用,但并非所有平台上都提供了所有功能。本模块中定义的大多数函数调用具有相同名称的平台C库函数。查阅平台文档有时可能会有帮助,因为这些功能的语义在不同平台之间有所不同。
为了解释一些术语和惯例。
- 该
时期
是时间开始点在哪里。当年的1月1日,0时,“时代以来的时间”为零。对于Unix来说,这个时代是1970年。要了解这个时代是什么,请看看gmtime(0)
。
- 本模块中的功能不处理时代之前或未来的日期和时间。未来的截止点由C库确定; 对于Unix,它通常在2038年。
2000年(Y2K)问题
:Python取决于平台的C库,它通常没有20
0
0
年问题,因为所有日期和时间都在内部表示为从时代开始的秒数。接受astruct_time
(见下文)的函数通常需要4位数的年份。为了向后兼容,如果模块变量accept2dyear
是非零整数,则支持2位数年份; 这个变量被初始化为1
除非环境变量PYTHONY2K
被设置为非空字符串,在这种情况下,它被初始化为0
。因此,你可以设置PYTHONY2K
转换为环境中的非空字符串,以便全年输入需要4位数的年份。当接受2位数年份时,它们根据POSIX或X / Open标准进行转换:将值69-99映射到1
969-1
999,将值0
-68映射到20
0
0
-20
68。值1
0
0
-1
899始终是非法的。
- UTC的协调世界时(以前称为格林威治标准时间,或GMT)。UTC的缩写不是一个错误,而是英法之间的妥协。
- 夏令时是夏令时,是在一年中部分时间(通常)一小时调整时区的时间。DST规则是魔术(由当地法律决定),并且可能每年都会发生变化。C库有一个包含本地规则的表(通常从系统文件中读取灵活性),并且是这方面真正智慧的唯一来源。
- 各种实时函数的精度可能会低于表达其值或参数的单位所建议的精度。例如,在大多数Unix系统中,时钟“滴答”只有每秒50或100次。
- 在另一方面,精度
time()
和sleep()
比其的Unix等效物更好:次被表示为浮点数,time()
返回可用最准确的时间(使用的Unixgettimeofday()
如果有的话),以及sleep()
将接受具有非零分数的时间(Unix的select()
使用在可能的情况下执行此操作)。
- 如通过返回的时间值
gmtime()
,localtime()
和strptime()
,并通过接受asctime()
,mktime()
并且strftime()
,可被认为是为9点的整数的序列。的返回值gmtime()
,localtime()
以及strptime()
还提供属性的各个字段的名称。
请参阅struct_time
这些对象的描述。
版本2.2中已更改:时间值序列已从元组更改为a struct_time
,并添加了字段的属性名称。
- 使用以下功能在时间表示之间进行转换:
- 与该
strptime()
函数一起使用时,%p
如果该%I
指令用于解析小时,则该指令仅影响输出小时字段。
- 范围确实是
0
到61
; 这占了闰秒和(非常罕见的)双闰秒。
- 当与使用
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])
根据格式解析表示时间的字符串。返回值是struct_time
由gmtime()
or 返回的localtime()
。
该格式
参数使用相同的指令那些由使用strftime(
它默认为"%a %b %d %H:%M:%S %Y"匹配
返回的格式
ctime()。如
果字符串不能
根据格式
进行
分析,或者在解析后有多余的数据,ValueError则会
引发。当无法推断出更精确的值时,用于填写缺失数据的默认值为(1900, 1, 1, 0, 0, 0, 0, 1, -1)。
例如:
>>> 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
为真。因此,除了识别始终知道的UTC和GMT(并且被认为是非夏时制时区)之外,它是平台特定的。
仅支持文档中指定的指令。由于strftime()
每个平台都可以实现,因此有时可以提供比列出的指令更多的指令。但是strptime()
独立于任何平台,因此不一定支持所有没有记录为支持的指令。
class time.struct_time
类型的时间序列值的返回通过gmtime()
,localtime()
和strptime()
。它是具有命名元组
接口的对象:值可以通过索引和属性名称来访问。以下值存在:
指数 | 属性 | 值 |
---|---|---|
0 | tm_year | (例如,1993年) |
1 | tm_mon | 范围1,12 |
2 | tm_mday | 范围1,31 |
3 | tm_hour | 范围0,23 |
4 | tm_min | 范围0,59 |
5 | tm_sec | 范围0,61; 请参阅(2)中的strftime()描述 |
6 | tm_wday | 范围0,6,星期一为0 |
7 | tm_yday | 范围1,366 |
8 | tm_isdst的 | 0,1或-1; 见下文 |
2.2版本中的新功能。
请注意,与C结构不同,月份值的范围为1,12,而不是0,11。年份值将按照上述2000年(Y2K)问题中的描述进行处理。
在调用中mktime()
,tm_isdst
夏令时有效时可以设置为1,否则为0。值为-1表示这是未知的,并且通常会导致正确的状态被填充。
当长度不正确的元组被传递给期望a的函数struct_time
或具有错误类型的元素时,TypeError
会引发。
time.time()
自纪元起以秒为单位返回浮点数的时间。请注意,即使时间总是以浮点数形式返回,但并非所有系统的时间精度都比1秒高。虽然此函数通常返回非递减值,但如果系统时钟已在两次调用之间回退,则它可以返回比先前调用更低的值。
time.timezone
本地(非DST)时区的偏移量,以UTC为单位的秒数(西欧大部分地区为负值,美国为正值,英国为零)。
time.tzname
两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。如果没有定义DST时区,则不应使用第二个字符串。
time.tzset()
重置库例程使用的时间转换规则。环境变量TZ
指定了这是如何完成的。它还将设置变量tzname
(来自TZ
环境变量),timezone
(UTC altzone
以西的非DST秒),(UTC以西的DST秒)和daylight
(如果此时区没有任何夏令时规则,则为0),或者设置为非零当夏令时适用时,有一段时间,过去,现在或未来)。
2.3版本的新功能。
可用性:Unix。
注意
尽管在很多情况下,更改TZ
环境变量可能会影响函数的输出,例如localtime()
不调用tzset()
,但不应该依赖此行为。
该TZ
环境变量应该包含没有空格。
TZ
环境变量的标准格式是(为清楚起见,添加了空格):
std offset [dst [offset [,start[/time], end[/time]]]]
组件是:
std and dst
三个或更多的字母数字提供时区缩写。这些将传播到time.tzname offset
偏移量的形式为:± hh[:mm[:ss]]
。这表示该值增加了当地时间到达UTC。如果前面有' - ',则时区在Prime Meridian的东边; 否则,它是西方的。如果在dst之后没有偏移,则夏季时间假定为比标准时间提前一个小时。start[/time], end[/time]
指示何时更改和返回DST。开始日期和结束日期的格式为以下之一:
Jn朱利安日n(1 <= n <= 365)。闰日不计算在内,所以在所有年份中,2月28日是59天,3月1日是60天n。零基Julian日(0 <= n <= 365)。对闰日进行计数,可以参考2月29日。Mm.n.d第d天(0 <= d <= 6)或当年第m月的第n周(1 <= n <= 5,1 = 米 <= 12,其中每周5种手段“的最后d一天月米 ”,其可以在任一第四或第五周发生)。1周是其中的第一个星期d “日天发生。第零天是星期天。
timeoffset
除了不允许使用前导符号(' - '或'+')以外,格式相同。如果没有给出时间,默认是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')
也可以看看
Module
datetime
面向日期和时间的面向对象的接口。 Module
locale
国际化服务。区域设置会影响许多格式说明的解释strftime()
和strptime()
。 Module
calendar
一般日历相关功能。timegm()
是gmtime()
这个模块的反面。
脚注
1 | 现在不推荐使用%Z,但所有ANSI C库都不支持使用扩展为首选小时/分钟偏移量的%z转义符。此外,严格阅读最初的1982年RFC 822标准需要两位数的年份(%y而不是%Y),但实践在2000年之前移到了4位数年。之后,RFC 822变得过时了, 4位数的年份首先由RFC 1123推荐,然后由RFC 2822授权。 |
---|