为什么Python';s datetime.utcnow()是否始终在微秒内返回相同的值?

为什么Python';s datetime.utcnow()是否始终在微秒内返回相同的值?,python,datetime,python-3.x,python-3.4,python-datetime,Python,Datetime,Python 3.x,Python 3.4,Python Datetime,我正在使用Python的datetime.datetime.utcnow()方法,我注意到微秒值总是相同的 >>> import datetime >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 16, 23, 20, 46, 42286) >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 16, 23,

我正在使用Python的datetime.datetime.utcnow()方法,我注意到微秒值总是相同的

>>> import datetime
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 16, 23, 20, 46, 42286)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 16, 23, 20, 55, 505286)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 16, 23, 21, 1, 552286)
请注意微秒值始终是286。为什么会这样?我能做些什么来解决这个问题

更多信息:
time.time()
也总是有286us。毫秒值很好。我认为这实际上是根本原因,因为我相信datetime.datetime.utcnow()调用time.time()


下面是一个简短的脚本,它表明这不仅仅是运气:

import datetime, random, time

for wait_time in [random.random() for _ in range(10)]:
    time.sleep(wait_time)
    print("Waited {}, result {}".format(wait_time, datetime.datetime.utcnow()))
结果:

Waited 0.6074311218736113, result 2015-11-16 23:35:24.603286
Waited 0.960317012489652, result 2015-11-16 23:35:25.563286
Waited 0.13555474339177553, result 2015-11-16 23:35:25.698286
Waited 0.6179213307667111, result 2015-11-16 23:35:26.315286
Waited 0.2872301475401443, result 2015-11-16 23:35:26.602286
Waited 0.42578113509089066, result 2015-11-16 23:35:27.027286
Waited 0.647233264729425, result 2015-11-16 23:35:27.674286
Waited 0.38930513172405146, result 2015-11-16 23:35:28.063286
Waited 0.6500370260649043, result 2015-11-16 23:35:28.713286
Waited 0.9807308512288959, result 2015-11-16 23:35:29.693286
谢谢


系统信息:
  • win32上的Python 3.4.3(v3.4.3:9b73f1c3e601,2015年2月24日,22:44:40)[MSC v.1600 64位(AMD64)]
  • Windows 7专业版,Service Pack 1。64位
  • 英特尔酷睿i5-2400@3.10GHz
来自时间的结果。获取时钟信息()
最终编辑: 所以,第二天早上我又回到这里(计算机开了一夜),我再次启动了python解释器,现在一切都好了

搞什么鬼,老兄

>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 17, 17, 19, 17, 626982)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 17, 17, 19, 18, 234043)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 17, 17, 19, 19, 106130)
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 11, 17, 17, 20, 7, 707990)

我仍然感兴趣的是,为什么会/可能会发生这种情况,所以如果有人有任何额外的信息,那就太好了。遗憾的是,我不知道我是否能够复制它…

免责声明:这不是答案


我看到了完全不同的微秒,所以我做了这个实验:

ms = 0
for _ in range(10000):
    ms_ = datetime.datetime.utcnow().microsecond % 10000
    if ms != ms_:
        diff = (ms_ - ms) % 1000
        ms = ms_
        print ms, diff
它显示了微秒的变化(我只是再显示一个数字,这样增长就可以看到):

如您所见,在我的windows计算机上,增量是相当一致的。它不是像OP的机器上那样的1000,所以这就是为什么我(我们?)观察到不同的微秒。delta可能与某个系统时钟同步,我猜,在OP的机器上,它每毫秒就会重新触发一次

我想听听别人的意见。请随意评论


注:这是一台T4500,运行频率为2.30GHz。

有一个老笑话,讲的是两个人在自然历史博物馆里想知道恐龙化石有多大。一个警卫无意中听到他们说,“哦,它已经有五亿零七年的历史了。”。其中一个人说,“这是一个惊人的数字,它是如何确定的?”警卫说,“嗯,在我的定向过程中,有人告诉我它有五亿年的历史,那是七年前的事了。”

这是两次以不同精度相加的结果。假设我在12:03:06开始一个时钟,那个时钟的分辨率只有分钟。如果我将时钟上的时间添加到开始时间,我将得到一系列时间,如12:03:06、12:04:06、12:05:06等等

Windows将毫秒分辨率的单调时钟和任意开始时间与微秒分辨率的时钟读数为零的时间相加


一种常见的技术就是将时间循环到您所依赖的分辨率,这当然不能高于时钟的保证分辨率。我相信这个时钟的保证分辨率是10毫秒。

好时机?我无法复制,每次给我打电话看起来都不一样<代码>日期时间。日期时间(年、月、日[、小时[、分钟[、秒[、微秒[、tzinfo][3][]])。年、月、日和小时是相同的。我猜你的系统时钟不会输出那么高的精度。。。我们说的是纳秒,而不是微秒。很可能计算机上的系统时钟没有必要的精度来处理那些微秒的数字。我不知道为什么最后3位数不是000。不,按随机数等待总是得到相同的286us值。再加上连续发生30次的几率是无穷小的。我只是碰巧在原始帖子中展示了其中的3个。你的处理器是什么?现在我正在考虑时钟速度。。。你的是什么?@KarolyHorvath你问我们是否可以复制你看到的,而现在,我不能。当我运行你的代码时,我总是得到diff=0:
1286202286203286042860等等。
我的计算机上经常得到diff=7和8machine@dthor:你当然可以,而且你确实。。。三角洲是一样的,对你来说是1000。@KarolyHorvath哈哈,是的,你是对的。我没想过。这对所有windows版本都是真的吗?那么你如何解释我的结果呢?我怀疑出于某种原因,他的TSC无法使用。也许他的CPU没有固定的TSC频率。我不确定。(i5-2400的文档说是的。可能是坏掉的BIOS?可能是奇怪的电源管理设置?禁用HPET?在BIOS中HPET没有设置为64位模式?)这是一个完全不同的芯片。你有一个一致的增量吗?@DavidSchwartz我理解你在第二段中的意思,但我的问题是:为什么我总是从286us开始我的1ms时钟?以您的示例为例,我希望下一次启动时钟的时间为12:08:27、12:09:27、12:10:27等@d而不是系统启动时启动的时钟。
ms = 0
for _ in range(10000):
    ms_ = datetime.datetime.utcnow().microsecond % 10000
    if ms != ms_:
        diff = (ms_ - ms) % 1000
        ms = ms_
        print ms, diff
8007 7    # garbage
8984 977
9960 976
937 977
1914 977
2890 976
3867 977
4843 976
5820 977
6796 976
7773 977
8750 977
9726 976
703 977
1679 976
2656 977
3632 976
4609 977
5585 976