Python datetime转换为微秒时间戳

5

我已经找到了很多方法,但是似乎没有简单而且好的方法来完成这个任务。我想要将Python的datetime对象转换为类似于time.time()返回的微秒(秒.微秒)。

最好的方法是什么?使用mktime()会完全剥离微秒,你可以构建一个timedelta,但这似乎并不正确。你也可以使用float(strftime("%s.%f"))(正确地四舍五入秒),但那似乎是一种超级hack。

什么是正确的方法?

3个回答

8
time.mktime(dt.timetuple()) + dt.microsecond / 1000000.0 

如果你不想使用strftimefloat,那么这个函数很有用。

它返回与dt = datetime.datetime.now()time.time()相同的结果。


如果日期时间对象的时区和您的本地时区可能不同,您应该使用calendar.gmtime(dt.utctimetuple())。 - Ryan Ye
我觉得你指的是calendar.timegm,它给出的答案和Mark的版本一样 -- 这意味着对于非UTC的datetime对象来说是不正确的。对于我来说,自纪元以来的时间与UTC中的某个人相同,而不是根据我的UTC偏移量而有所不同。 - agf
无论您所在的时区如何,它始终是正确的,因为dt.utctimetuple返回UTC中datetime对象的时间元组。而calendar.timegm采用UTC时间元组。 - Ryan Ye
你试过了吗?time.time()calendar.timegm(datetime.datetime.now().utctimetuple())对于非UTC时区不会给出相同的自纪元以来的时间,尽管自纪元以来已经过去了相同的时间,无论你谈论哪个时区,因为自纪元以来是UTC,而time.time()返回UTC时间。 - agf
我明白了。我在我的网站上使用calendar.timegm。它工作得很完美,因为我的datetime对象带有tzinfo。而且似乎由datetime.datetime.now()返回的datetime对象不包含tzinfo,因此utctimetuple不会返回正确的结果(缺少tzinfo,utctimetuple返回与timetuple相同的结果)。 - Ryan Ye
听起来你的版本适用于带时区信息的对象或UTC,Mark 的版本适用于UTC,我的版本适用于本地时区对象。如果你将你的版本发布为答案,我会给它点赞。 - agf

2
def microtime(dt):
    unixtime = dt - datetime.datetime(1970, 1, 1)
    return unixtime.days*24*60*60 + unixtime.seconds + unixtime.microseconds/1000000.0

这个与 time.time()datetime.datetime.now() 不同。看起来你假设 dt 是 UTC,所以你会受到时区 UTC 偏移的影响。 - agf
@agf,time.time()是什么?我在文档中找不到它:http://docs.python.org/library/datetime.html - Mark Ransom
不是 datetime.time,而是 time.time() -- http://docs.python.org/library/time.html#time.time - agf
@agf:所以,“应该有一个,最好只有一个显而易见的方法来做到这一点”都是扯淡。在此之前我从未听说过time。你说得对,我的解决方案假设你传递的是UTC日期时间。 - Mark Ransom
同意,datetime / time / calendar 是一团糟。 - agf
1
我同意这是一团糟。当我写PyFeed时,我编写了自己的函数来处理它。http://home.avvanta.com/~steveha/pyfeed.html - steveha

-1

导入时间模块;

microtime=int(time.time()*1000);

打印微秒时间;


你的语句后面为什么要加分号? - ltd9938

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接