Ubuntu和Windows获取系统时间的比较

记录利用Python获取系统时间戳的方法。

1 前言

做项目的过程中,发现用Python来获取电脑的系统时间总是有一些问题,经过查找资料发现应该是 Windows 和 Ubuntu 系统不一样,造成用同样的方法获取到的时间戳是不一样的。特地记录一下这个过程。

2 获取系统时间的方法

先来看一段简单的程序

1
2
3
4
5
6
import time
print(time.time())
for i range(5):
print('No.', i)
time.sleep(0.5)
print(time.time())

Ubuntu显示结果:
1646807738.1324077
1646807738.632916
1646807739.1335397
1646807739.63411
1646807740.1347759
1646807740.6354375

Windows显示结果:
1646807786.0287051
1646807786.5307221
1646807787.032723
1646807787.5337255
1646807788.0347238
1646807788.5367093

目前看起来二者都没有什么问题。将上述程序修改一下:

1
2
3
4
5
import time
print(time.time())
for i range(5):
# time.sleep(0.5)
print(time.time())

Ubuntu显示结果:
1646808031.1839275
1646808031.183945
1646808031.1839483
1646808031.183951
1646808031.1839535
1646808031.183956

Windows显示结果:
1646808010.2492912
1646808010.2492912
1646808010.2512927
1646808010.2512927
1646808010.2512927
1646808010.2512927

对比上述两个结果,可以看出,由于循环中仅执行打印当前时间戳的代码,运行很快,Ubuntu上可以看出每次的时间不一致,相邻的时间差大约为0.000003s=0.003ms,而Windows上的打印结果则显示多次输出的是一个值,说明 Windows 上用这样的获取时间戳方式无法获取到精确的时间。经过查阅资料后,Windows上的系统时间是精确到100ns。在Python3.8后,引入了一个 perf_counter() 的方法,这个函数返回性能计数器的值(以 秒 为单位)作为浮点数,即具有最高可用分辨率的时钟,以测量短持续时间。它确实包括睡眠期间经过的时间,并且是系统范围的。通常perf_counter()用在测试代码时间上,具有最高的可用分辨率。不过因为返回值的参考点未定义,因此我们测试代码的时候需要调用两次,做差值。
将上述代码修改为:

1
2
3
4
5
import time
start_time = time.time()
start_counter = time.perf_counter()
for i range(5):
print(start_time + time.perf_counter() - start_counter)

在Windows上运行的结果如下:
1646808530.6189997
1646808530.619183
1646808530.6207914
1646808530.6209636
1646808530.6211357

从上述运行结果可以看出,由于加入了加减法的运算,相邻的两个时间差在0.0001722s=0.1722ms。目前尚不清楚为什么在Windows环境下直接用 time.time() 为什么无法精确到微秒级,留个疑问在这里。

笔者的实际测试结果是,用这种时间获取一段时间,将获取到的时间戳(Core i3-4xxxU)直接plot出来,发现仍然会有很大的跳变,具体原因还有待进一步探究。

3 TwinCAT获取系统时间

TwinCAT上获取的系统时间是以1961年1月1日为起点的,而Python直接获取的Ubuntu/Windows系统时间是以1970年1月1日为起点的。另外,还需要注意的一点是,即使将TwinCAT获取的系统时间戳转换为1970年1月1日为起点的,与python获取到的系统时间戳仍然是不一致的,但是在一小段时间内(例如1秒内),两个时间戳的差值变化不大。

参考链接

  1. time 官方库介绍
------ 本文结束感谢您的阅读------
Donate a cup of cola?