You are here:  Home » Python » 时间访问和转换 – 通用操作系统服务(Python教程)(参考资料)

 

time– 时间访问和转换


此模块提供各种与时间相关的功能。有关相关功能,另请参阅datetimecalendar modules.

虽然此模块始终可用,但并非所有平台上都提供所有功能。此模块中定义的大多数函数调用具有相同名称的平台C库函数。参考平台文档有时可能会有所帮助,因为这些功能的这些功能在不同的平台之间有所不同.

有些术语和惯例的解释是按顺序的.

 

  • epoch是时间开始的点,并且是平台依赖的。对于Unix,时间是1970年1月1日00:00:00(UTC)。要找出给定平台上的纪元,请查看time.gmtime(0).
  • 术语seconds since the epoch指的是自纪元以来经过的秒数总和,通常不包括间隔秒。在allPOSIX兼容平台上,闰秒不包括在这个总数中.
  • 此模块中的功能可能无法处理将来的纪元之前的日期和时间。未来的截止点由Clibrary决定;对于32位系统,它通常在2038年.

 

  • 年2000(Y2K)发布:Python依赖于平台的C库,它通常没有2000年的问题,因为所有日期和时间在内部表示为自纪元以来的秒数。函数strptime()在给出%y格式代码时可以解析2位数年份。当2位数年份被分析时,它们根据POSIX和ISO C标准进行转换:值69-99映射到1969-1999,值0-68映射到2000-2068.
  • UTC是协调的世界时(以前称为格林威治标准时间,或GMT)。缩写UTC不是一个错误,而是英国和法国之间的妥协.
  • 夏令时是夏令时,是在一年中的一部分时间(通常)一小时内调整时区。DST规则是神奇的(由当地法律确定)并且可以逐年变化。C库有一个包含localrules的表(通常是从系统文件中读取以获得灵活性),并且在这方面是True Wisdom的唯一来源.

  • 各种实时函数的精度可能会更低比表达其价值或论据的单位所建议的那样。例如。在大多数Unix系统上,时钟“滴答”只有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_time成员时,tm_gmtoff类型被扩展为提供tm_zonestruct tm属性.

    版本3.6: struct_time属性tm_gmtofftm_zone现在可在所有平台上使用.

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

    使用
    秒,因为纪元 struct_time inUTC gmtime()
    秒以来的时间 struct_time本地时间 localtime()
    struct_time inUTC 秒以来的时间 calendar.timegm()
    struct_time本地时间 秒从纪元 mktime()

 

功能

time.asctime [t]
转换元组或struct_timegmtime()localtime()返回的时间表示为以下形式的字符串:"Sun Jun 20 23:21:05 1993"。如果没有提供t,则使用localtime()返回的当前时间。asctime().

注意

与同名的C函数不同,asctime()不添加atrailing newline .

time.clock ()

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

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

自版本3.3以后删除:此函数的行为取决于平台:使用perf_counter()process_time()相反,根据你的要求,有一个明确定义的行为.

time.pthread_getcpuclockid (thread_id)
返回特定于线程的CPU时钟的clk_id对于指定的thread_id.

使用threading.get_ident()ident的属性threading.Thread对象得到适合的值thread_id.

警告

传递无效或过期的thread_id可能导致未定义的行为,例如分段错误.

可用性:Unix(请参阅pthread_getcpuclockid(3)的手册页以获取更多信息).

版本3.7.

time.clock_getres (clk_id)
返回指定时钟的分辨率(精度)clk_id。参考时钟ID常数获取clk_id.

可用性:Unix .

3.3版本中的新功能

time.clock_gettimeclk_id→漂浮
返回指定时钟的时间clk_id。参考时钟ID常数获取clk_id.

可用性:Unix .

3.3版本中的新功能

time.clock_gettime_nsclk_id→int
相近 clock_gettime()返回时间为纳秒.

可用性:Unix .

新版本3.7.

time.clock_settime (clk_id, time: float
设置指定时钟的时间clk_id。目前,CLOCK_REALTIMEclk_id.

可用性:Unix .

3.3版本中的新功能

time.clock_settime_nsclk_id, time: int
相近 clock_settime()但设定时间为纳秒.

可用性:Unix .

新版本3.7.

time.ctime ( [secs])
转换一个自纪元以来以秒表示的时间到表示本地时间的字符串。如果没有提供secsNone,则使用time()返回的当前时间。ctime(secs)相当于asctime(localtime(secs))ctime().
time.get_clock_infoname
不使用区域设置信息获取指定时钟的信息作为命名空间对象。支持的时钟名称和相应的函数来读取它们的值:

  • "clock"time.clock()
  • "monotonic"time.monotonic()
  • "perf_counter"time.perf_counter()
  • "process_time"time.process_time()
  • "thread_time"time.thread_time()
  • "time"time.time()

结果有以下属性:

  • adjustableTrue如果时钟可以自动更改(例如通过NTP守护程序)或由系统管理员手动更改,False否则
  • implementation:用于获取时钟值的基础C函数的名称。参考时钟ID常数可能的值.
  • monotonicTrue如果时钟不能倒退,False否则
  • resolution:时钟分辨率(秒)(float

版本3.3.

time.gmtime( [secs]
将自纪元以来以秒表示的时间转换为struct_time inUTC,其中dst标志始终为零。如果没有提供secsNone,则由time()用来。一秒的分数被忽略。有关struct_time对象的说明,请参见上文。见calendar.timegm()对于这个函数的逆.
time.localtime ( [secs])
gmtime()但转换到当地时间。如果没有提供secsNone,则使用time()返回的当前时间。当DST适用于给定时间时,dstflag设置为1
time.mktime (t)
这是localtime()的反函数。它的参数是struct_time或完整的9元组(因为需要dst标志;如果不知道则使用-1作为dst标志),表示local时间,notUTC。它返回一个浮点数,与time()兼容。如果输入值不能表示为有效时间,则OverflowErrorValueError将被提出(这取决于Python或底层C库是否捕获到无效值)。它可以生成时间的最早日期是platform-dependpendent .
time.monotonic (→float
返回单调时钟的值(以小秒为单位),即不能倒退的时钟。时钟不受系统时钟更新的影响。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效.

新版本3.3.

在版本3.5中更改:此功能现在始终可用且始终在系统范围内.

time.monotonic_ns (→int
类似于monotonic(),但返回时间为纳秒.

新版本3.7.

time.perf_counter ( )→浮动

返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的aclock,以测量短持续时间。它包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点是未定义的,因此只有连续调用结果之间的差异才有效.

版本3.3.

time.perf_counter_ns (→int
类似于perf_counter(),但返回时间为纳秒.

新版本3.7.

time.process_time (→float

返回当前进程的系统和userCPU时间之和的值(以小数秒为单位)。它不包括睡眠期间经过的时间。根据定义,它在整个过程中。该值的参考点未定义,因此只有连续调用结果之间的差异才有效.

版本3.3.

time.process_time_ns (→int
类似于process_time()但返回时间为纳秒.

新版本3.7.

time.sleep (secs
暂停执行调用线程达到给定的秒数。参数可以是浮点数,表示更精确的休眠时间。实际的暂停时间可能会少于要求的时间,因为任何捕获的信号都会终止sleep()执行该信号的捕捉程序之后。此外,由于系统中其他活动的安排,暂停时间可能长于任意数量的请求.

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

 

time.strftimeformat [, t]
转换一个元组或struct_time代表gmtime()localtime()返回的时间为format参数指定的字符串。如果t未提供,使用localtime()返回的当前时间。format必须是一个字符串。如果ValueError中的任何一个区域超出允许的范围,则t被提升.

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

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

指令 含义 注释
%a Locale缩写的工作日名称.
%A Locale的完整工作日名称.
%b Locale的缩写月份名称.
%B Locale的完整月份名称.
%c Locale的合适日期和时间表示.
%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(星期日),6] .
%W 一年中的周数(星期一作为一周的第一天)作为十进制数[00,53]。在第一个星期一之前的新年中的所有天被认为是在第0周. (3)
%x Locale的适当日期表示
%X Locale的适当时间表示
%y 没有世纪作为十进制数[00,99] .
%Y 年份以世纪为十进制数.
%z 时区偏移表示与UTC + HHMM或-HHMM的UTC / GMT的正或负时差,其中H表示十进制数字,M表示十进制minutedigits [-23:59,+ 23:59] .
%Z 时区名称(如果没有时区,则没有字符).
%% 文字"%"字符。

笔记:

  1. 与一起使用时strptime()功能,%p如果%I指令用于解析小时,则指令仅影响输出小时字段.
  2. 范围确实是061;价值60是有效的intimestamps代表闰秒和值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)documentation.

在某些平台上,可选的字段宽度和精度规格可以立即跟随最初的"%"指令按以下顺序排列;这也不可移植。场地宽度通常为2,除了%j这里是3.

 

time.strptime (string [, format])
根据格式解析表示时间的字符串。返回值为struct_time,由gmtime()localtime().

返回format参数使用与strftime();它默认为"%a %b %d %H:%M:%S %Y",它匹配ctime()返回的格式。如果string无法根据format进行解析,或者解析后数据过多,则ValueErrorisraised。当无法推断出更准确的值时,用于填充任何缺失数据的默认值是​​(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()。它是一个 namedtuple 接口的对象:可以通过索引和属性名访问值。以下值存在:

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

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

在调用mktime(), tm_isdst当白天时间有效时可以设置为1,而当白天时间有效时可以设置为0。值为-1表示这是未知的,通常会导致填写正确的状态.

当长度不正确的元组传递给期望struct_time的函数时,或者有错误类型的元素,TypeError被抬起来

time.time (→漂浮
返回时间自纪元以来的秒数作为浮点数。时期的特定日期和间隔秒的处理取决于平台。在Windows和大多数Unix系统上,时期是1970年1月1日,00:00,00:00(UTC),闰秒不计入自秒以来的秒数时代。这通常被称为Unix时间。要找出给定平台上的纪元,请看gmtime(0).

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

返回的号码time()可以通过将其转换为gmtime()功能或在当地时间传递到localtime()功能。在这两种情况下都会返回一个struct_time对象,日历日期的组件可以作为属性来访问.

time.thread_time (→浮动

返回当前线程的系统和userCPU时间之和的值(以小数秒为单位)。它不包括睡眠期间经过的时间。根据定义,它是特定于线程的。该值的参考点是未定义的,因此只有同一线程中连续调用的结果之间的差异才有效.

Availability:Windows,Linux,Unix系统支持CLOCK_THREAD_CPUTIME_ID.

版本3.7.

time.thread_time_ns()→int
类似于thread_time()但返回时间为纳秒。

版本3.7.

time.time_ns()→int
类似于time()但返回时间作为一个整数的纳秒,从时代开始

新版本3.7.

time.tzset ()
重置图书馆例程使用的时间转换规则。环境变量TZ指定了如何完成。它还将设置变量tzname(来自TZ环境变量),timezone(非UTC时间的DST秒),altzone(DST秒西UTC)和daylight(如果此时区没有任何夏令时规则则为0;如果有夏令时时间适用的时间,过去,现在或将来,则为tononzero).

可用性:Unix。

注意

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

TZ环境变量不应该包含空格.

TZ环境变量的标准格式是(whitespaceadded for清晰度):

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

其中的组件是:

stddst
三个或更多的字母数字给出时区缩写。这些将传播到time.tzname
offset
偏移量的格式为:± hh[:mm[:ss]]。这表示该值增加了到达UTC的当地时间。如果前面有’ – ‘,则时区位于Prime Meridian以东;否则,它是西方的。如果没有跟随偏移,则假设夏令时比标准时间提前一小时.
start[/time], end[/time]

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

Jn
朱利安日n(1< = n< = 365)。闰日不算,所以2月28日是第59天,3月1日是第60天.
n
从零开始的朱利安日(0 \u003c= n< = 365)。闰日计算,可以参考2月29日.
Mm.n.d
d第一天(0 \u003c= d周\u003c/ 6)nm年度(1< = n< = 5,1< = m< = 12,其中第5周表示“最后d日内m”可能出现在第四周或第五周)。第1周是d‘这一天发生了。Day Zero是星期日.

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')

 

时钟ID常数

这些常量用作clock_getres()clock_gettime().

time.CLOCK_BOOTTIME
相同 CLOCK_MONOTONIC,除了它还包括系统暂停的任何时间.

这允许应用程序获得一个悬浮感知的单调时钟,而无需处理CLOCK_REALTIME,如果时间改变使用settimeofday()orsimilar.

可用性:Linux 2.6.39或更高版本.

新版本3.7.

time.CLOCK_HIGHRES
Solaris OS有CLOCK_HIGHRES计时器试图使用最佳硬件来源,并可能给出接近纳秒的分辨率.CLOCK_HIGHRES是不可调节的高分辨率时钟

可用性:Solaris .

3.3版本中的新功能

time.CLOCK_MONOTONIC
时钟不能设置,代表单调时间,因为一些未指定的起点.

可用性Unix .

3.3版本中的新功能

time.CLOCK_MONOTONIC_RAW
相近 CLOCK_MONOTONIC,但可以访问不受NTP调整的基于原始硬件的时间.

Availability:Linux 2.6.28及更新版本,macOS 10.12及更新版本

3.3版本中的新功能

time.CLOCK_PROCESS_CPUTIME_ID
来自CPU的高分辨率每进程定时器

Availability:Unix.

新版3.3.

time.CLOCK_PROF
高分辨率每个进程来自CPU的定时器.

Availability:FreeBSD,NetBSD 7或更高版本,OpenBSD。

新版本3.7.

time.CLOCK_THREAD_CPUTIME_ID
线程 – 特定CPU时间时钟.

可用性:Unix.

新版本3.3.

time.CLOCK_UPTIME
绝对值是系统运行和不悬浮的时间,提供准确的正常运行时间测量,绝对和间隔时间

可用性:FreeBSD,OpenBSD 5.5或更高版本.

新版本3.7.

以下常量是唯一可以发送到clock_settime().

time.CLOCK_REALTIME
系统范围实时时钟的参数。设置这个时钟需要适当的特权.

可用性:Unix.

新版3.3.

 

时区常数

time.altzone
本地DST时区,在UTC以西的几秒钟内,如果定义了一个。如果本地DST时区在UTC以东(如在西欧,包括英国),则为负。只有在daylight非零时才使用它。如果定义了DST时区,请参见下面的注释.
time.daylight
Nonzero。请参阅下面的注释.
time.timezone
本地(非DST)时区的偏移量,以UTC为单位以西的秒数(西欧为负值,美国为正值,英国为零)。请参阅下面的注释.
time.tzname
两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。如果未定义DST时区,则不应使用第二个字符串。见下面的说明.

注意

对于上述时区常数(altzone, daylight, timezonetzname),该值由模块加载时间或最后一次的时区规则确定tzset()被称为过去的时间可能不正确。建议使用tm_gmtofftm_zone结果来自 localtime()获取时区信息.

也可以看看

模块datetime
更多面向日期和时间的面向对象的界面.
模块locale
国际化服务。语言环境设置会影响strftime()strptime().
模块calendar
一般日历相关功能。timegm()是这个模块gmtime()的反转

Footnotes

[1] 使用%Z现在已被弃用,但是%z所有ANSI C库都不支持扩展为首选小时/分钟偏移量的转义。同样,1982年的原文阅读 RFC 822 标准要求2-digityear(%y而不是%Y),但练习在2000年之前就已移至4位数年。之后, RFC 822 变得过时了, @首先推荐了4位数的年份RFC 1123 然后由强制执行RFC 2822 .