关于python:在datetime丢失的微秒数

Microseconds lost in datetime

我试图得到微秒,但最后三位数总是0,所以我想我只能得到毫秒。
这是操作系统问题吗? 我使用的是Python 2.7.10的Win7x64。
难道我做错了什么? 我怎么能得到微秒?

1
2
3
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2016, 8, 9, 4, 33, 28, 504000)

这不是重复的

在Python中使用%f和strftime()来获得微秒

因为这种方法最终给了我相同的零。


我相信这是Windows下Python 2.7实现的一个已知限制:

1
2
3
4
5
6
7
8
9
10
11
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2016, 8, 9, 10, 50, 59, 657000)
>>> datetime.datetime.now()
datetime.datetime(2016, 8, 9, 10, 51, 1, 561000)
>>> datetime.datetime.now()
datetime.datetime(2016, 8, 9, 10, 51, 2, 314000)
>>> datetime.datetime.now()
datetime.datetime(2016, 8, 9, 10, 51, 2, 906000)
>>> datetime.datetime.now()
datetime.datetime(2016, 8, 9, 10, 51, 9, 277000)

例如,请参见此处和此处。

在Python 2.7源代码中,函数Modules/datetimemodule.c/datetime_now()最终调用Modules/timemodule.c/floattime(),它具有以下注释:

1
2
3
4
5
6
7
8
/* There are three ways to get the time:
  (1) gettimeofday() -- resolution in microseconds
  (2) ftime() -- resolution in milliseconds
  (3) time() -- resolution in seconds
  In all cases the return value is a float in seconds.
  Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
  fail, so we fall back on ftime() or time().
  Note: clock resolution does not imply clock accuracy! */

所以Windows平台显然使用ftime()来获取当前时间,并且根据_ftime()的MSDN页面(毫无疑问最终会出现),没有微秒可用。 因此Python 2.7只给你毫秒并将微秒保留为零:

1
return (double)t.time + (double)t.millitm * (double)0.001;

Python 3.5似乎具有完整的微秒分辨率,因此您可能需要考虑切换到那个(就好像大量其他改进还不够)。