00后星盘夏令时需要打勾吗(星盘为什么夏令时比没有夏令时准)
该time模块提供对几种不同类型时钟的访问,每种时钟都可用于不同目的。标准系统调用time()报告系统“挂钟”时间。该 monotonic()时钟可以用来衡量一个长期运行的进程经过的时间,因为它保证永远不会被向后移动,即使系统时间被改变。对于性能测试, perf_counter()提供对具有最高可用分辨率的时钟的访问,以使短时间测量更准确。CPU时间可通过clock(),并 process_time()返回组合的处理器时间和系统时间。
注意
这些实现公开了C库函数来操作日期和时间。由于它们与底层C实现相关联,因此某些细节(例如,纪元的开始和支持的最大日期值)是特定于平台的。有关完整的详细信息,请参阅库文档。
比较时钟
时钟的实现细节因平台而异。使用 get_clock_info()访问了解,目前实现的基本信息,包括时钟的分辨率。
time_get_clock_info.py
import textwrapimport timeavailable_clocks = [ ('clock', time.clock), ('monotonic', time.monotonic), ('perf_counter', time.perf_counter), ('process_time', time.process_time), ('time', time.time),]for clock_name, func in available_clocks: print(textwrap.dedent(''' {name}: adjustable : {info.adjustable} implementation: {info.implementation} monotonic : {info.monotonic} resolution : {info.resolution} current : {current} ''').format( name=clock_name, info=time.get_clock_info(clock_name), current=func()) )
Mac OS X的此输出显示单调和perf_counter时钟使用相同的底层系统调用实现。
$ python3 time_get_clock_info.pyclock: adjustable : False implementation: clock() monotonic : True resolution : 1e-06 current : 0.046796monotonic: adjustable : False implementation: mach_absolute_time() monotonic : True resolution : 1e-09 current : 716028.526210432perf_counter: adjustable : False implementation: mach_absolute_time() monotonic : True resolution : 1e-09 current : 716028.526241605process_time: adjustable : False implementation: getrusage(RUSAGE_SELF) monotonic : True resolution : 1e-06 current : 0.046946999999999996time: adjustable : True implementation: gettimeofday() monotonic : False resolution : 1e-06 current : 1521404584.966362
挂钟时间
该time模块的核心功能之一是time(),它将“epoch”开始后的秒数作为浮点值返回。
time_time.py
import timeprint('The time is:', time.time())
时代是时间测量的开始,对于Unix系统来说,它是1970年1月1日的0:00。虽然值总是浮点数,但实际精度与平台有关。
$ python3 time_time.pyThe time is: 1521404585.0243158
浮点表示在存储或比较日期时很有用,但对生成人类可读表示没有用。对于记录或打印时间ctime()可能更有用。
time_ctime.py
import timeprint('The time is :', time.ctime())later = time.time() + 15print('15 secs from now :', time.ctime(later))
print()此示例中的第二个调用显示如何使用 ctime()格式化当前时间以外的时间值。
$ python3 time_ctime.pyThe time is : Sun Mar 18 16:23:05 201815 secs from now : Sun Mar 18 16:23:20 2018
单调时钟
由于time()查看系统时钟,并且用户或系统服务可以更改系统时钟以在多台计算机之间同步时钟,因此time()重复调用可能会生成前后转换的值。当尝试测量持续时间或以其他方式使用这些时间进行计算时,这可能导致意外行为。通过使用避免这些情况monotonic(),它总是返回前进的值。
time_monotonic.py
import timestart = time.monotonic()time.sleep(0.1)end = time.monotonic()print('start : {:>9.2f}'.format(start))print('end : {:>9.2f}'.format(end))print('span : {:>9.2f}'.format(end - start))
未定义单调时钟的起始点,因此返回值仅对使用其他时钟值进行计算有用。在该示例中,使用以下来测量睡眠的持续时间 monotonic()。
$ python3 time_monotonic.pystart : 716028.72end : 716028.82span : 0.10
处理器时钟时间
而time()返回一个挂钟时间,clock()返回处理器时钟时间。返回的值clock()反映了程序运行时使用的实际时间。
time_clock.py
import hashlibimport time# Data to use to calculate md5 checksumsdata = open(__file__, 'rb').read()for i in range(5): h = hashlib.sha1() print(time.ctime(), ': {:0.3f} {:0.3f}'.format( time.time(), time.clock())) for i in range(300000): h.update(data) cksum = h.digest()
在此示例中,格式化ctime()与浮点值一起打印time(),并且clock()对于循环中的每次迭代打印。
注意
如果要在系统上运行该示例,则可能必须向内部循环添加更多循环,或者使用更大量的数据来实际查看时间差异。
$ python3 time_clock.pySun Mar 18 16:23:05 2018 : 1521404585.328 0.051Sun Mar 18 16:23:05 2018 : 1521404585.632 0.349Sun Mar 18 16:23:05 2018 : 1521404585.935 0.648Sun Mar 18 16:23:06 2018 : 1521404586.234 0.943Sun Mar 18 16:23:06 2018 : 1521404586.539 1.244
通常,如果程序没有执行任何操作,则处理器时钟不会打勾。
time_clock_sleep.py
import timetemplate = '{} - {:0.2f} - {:0.2f}'print(template.format( time.ctime(), time.time(), time.clock()))for i in range(3, 0, -1): print('Sleeping', i) time.sleep(i) print(template.format( time.ctime(), time.time(), time.clock()) )
在这个例子中,循环通过在每次迭代后进入休眠状态来完成很少的工作。time()即使应用程序处于睡眠状态,该值也会增加,但clock()值不会。
$ python3 -u time_clock_sleep.pySun Mar 18 16:23:06 2018 - 1521404586.89 - 0.04Sleeping 3Sun Mar 18 16:23:09 2018 - 1521404589.90 - 0.04Sleeping 2Sun Mar 18 16:23:11 2018 - 1521404591.90 - 0.04Sleeping 1Sun Mar 18 16:23:12 2018 - 1521404592.90 - 0.04
sleep()从当前线程调用yield控制并要求它等待系统将其唤醒。如果一个程序只有一个线程,这有效地阻止了应用程序,它不起作用。
性能计数器
重要的是具有用于测量性能的高分辨率单调时钟。确定最佳时钟数据源需要Python提供的特定于平台的知识 perf_counter()。
time_perf_counter.py
import hashlibimport time# Data to use to calculate md5 checksumsdata = open(__file__, 'rb').read()loop_start = time.perf_counter()for i in range(5): iter_start = time.perf_counter() h = hashlib.sha1() for i in range(300000): h.update(data) cksum = h.digest() now = time.perf_counter() loop_elapsed = now - loop_start iter_elapsed = now - iter_start print(time.ctime(), ': {:0.3f} {:0.3f}'.format( iter_elapsed, loop_elapsed))
与此同时monotonic(),perf_counter()时间段未定义,并且值旨在用于比较和计算值,而不是绝对时间。
$ python3 time_perf_counter.pySun Mar 18 16:23:13 2018 : 0.378 0.378Sun Mar 18 16:23:13 2018 : 0.376 0.754Sun Mar 18 16:23:14 2018 : 0.372 1.126Sun Mar 18 16:23:14 2018 : 0.376 1.502Sun Mar 18 16:23:14 2018 : 0.376 1.879
时间成分
将时间存储为经过的秒数在某些情况下很有用,但有时程序需要访问日期(年,月等)的各个字段。该time模块定义 struct_time了保存日期和时间值,其中组件已分解,因此易于访问。有几个函数可以使用struct_time值而不是浮点数。
time_struct.py
import timedef show_struct(s): print(' tm_year :', s.tm_year) print(' tm_mon :', s.tm_mon) print(' tm_mday :', s.tm_mday) print(' tm_hour :', s.tm_hour) print(' tm_min :', s.tm_min) print(' tm_sec :', s.tm_sec) print(' tm_wday :', s.tm_wday) print(' tm_yday :', s.tm_yday) print(' tm_isdst:', s.tm_isdst)print('gmtime:')show_struct(time.gmtime())print('nlocaltime:')show_struct(time.localtime())print('nmktime:', time.mktime(time.localtime()))
该gmtime()函数以UTC格式返回当前时间。localtime()返回当前时区,并应用当前时区。mktime()采用a struct_time并将其转换为浮点表示。
$ python3 time_struct.pygmtime: tm_year : 2018 tm_mon : 3 tm_mday : 18 tm_hour : 20 tm_min : 23 tm_sec : 14 tm_wday : 6 tm_yday : 77 tm_isdst: 0localtime: tm_year : 2018 tm_mon : 3 tm_mday : 18 tm_hour : 16 tm_min : 23 tm_sec : 14 tm_wday : 6 tm_yday : 77 tm_isdst: 1mktime: 1521404594.0
使用时区
确定当前时间的功能取决于是通过程序还是使用为系统设置的默认时区设置时区。更改时区不会改变实际时间,只会改变它的表示方式。
要更改时区,请设置环境变量TZ,然后调用tzset()。时区可以指定很多细节,直到夏令时的开始和停止时间。但是,通常更容易使用时区名称,并让底层库导出其他信息。
此示例程序将时区更改为几个不同的值,并显示更改如何影响时间模块中的其他设置。
time_timezone.py
import timeimport osdef show_zone_info(): print(' TZ :', os.environ.get('TZ', '(not set)')) print(' tzname:', time.tzname) print(' Zone : {} ({})'.format( time.timezone, (time.timezone / 3600))) print(' DST :', time.daylight) print(' Time :', time.ctime()) print()print('Default :')show_zone_info()ZONES = [ 'GMT', 'Europe/Amsterdam',]for zone in ZONES: os.environ['TZ'] = zone time.tzset() print(zone, ':') show_zone_info()
用于准备示例的系统的默认时区是US / Eastern。示例中的其他区域更改tzname,日光标志和时区偏移值。
$ python3 time_timezone.pyDefault : TZ : (not set) tzname: ('EST', 'EDT') Zone : 18000 (5.0) DST : 1 Time : Sun Mar 18 16:23:14 2018GMT : TZ : GMT tzname: ('GMT', 'GMT') Zone : 0 (0.0) DST : 0 Time : Sun Mar 18 20:23:14 2018Europe/Amsterdam : TZ : Europe/Amsterdam tzname: ('CET', 'CEST') Zone : -3600 (-1.0) DST : 1 Time : Sun Mar 18 21:23:14 2018
解析和格式化时间
这两个函数strptime()和strftime()转换之间struct_time和字符串表示时间值。有一长串格式化说明可用于支持不同样式的输入和输出。完整列表记录在time模块的库文档中。
此示例将当前时间从字符串转换为 struct_time实例并返回字符串。
time_strptime.py
import timedef show_struct(s): print(' tm_year :', s.tm_year) print(' tm_mon :', s.tm_mon) print(' tm_mday :', s.tm_mday) print(' tm_hour :', s.tm_hour) print(' tm_min :', s.tm_min) print(' tm_sec :', s.tm_sec) print(' tm_wday :', s.tm_wday) print(' tm_yday :', s.tm_yday) print(' tm_isdst:', s.tm_isdst)now = time.ctime(1483391847.433716)print('Now:', now)parsed = time.strptime(now)print('nParsed:')show_struct(parsed)print('nFormatted:', time.strftime("%a %b %d %H:%M:%S %Y", parsed))
输出字符串与输入完全不同,因为月份的日期前缀为零。
$ python3 time_strptime.pyNow: Mon Jan 2 16:17:27 2017Parsed: tm_year : 2017 tm_mon : 1 tm_mday : 2 tm_hour : 16 tm_min : 17 tm_sec : 27 tm_wday : 0 tm_yday : 2 tm_isdst: -1Formatted: Mon Jan 02 16:17:27 2017
如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。