将带毫秒的epoch时间转换为日期时间

121

我使用了一个 Ruby 脚本,将 ISO 时间戳转换为 Unix 时间戳。我要解析的文件具有以下时间戳结构:

2009-03-08T00:27:31.807

因为我想保留毫秒,所以我使用以下 Ruby 代码将其转换为纪元时间:

irb(main):010:0> DateTime.parse('2009-03-08T00:27:31.807').strftime("%Q")
=> "1236472051807"

但是在Python中我尝试了以下代码:

import time 
time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807))
但是我没有获得原始的时间日期。
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807))
'41152-03-29 02:50:07'
>>> 

我在想这是否与我的格式设置有关?

3个回答

206
使用datetime.datetime.fromtimestamp函数:
>>> import datetime
>>> s = 1236472051807 / 1000.0
>>> datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S.%f')
'2009-03-08 09:27:31.807000'

%f指令仅被 datetime.datetime.strftime 支持,而不被time.strftime支持。

更新:可以使用%str.format作为替代方案:

>>> import time
>>> s, ms = divmod(1236472051807, 1000)  # (1236472051, 807)
>>> '%s.%03d' % (time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(s)), ms)
'2009-03-08 00:27:31.807'
>>> '{}.{:03d}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(s)), ms)
'2009-03-08 00:27:31.807'

3
是的,我本来想建议这个...但是算了,好答案(+1 保留毫秒在显示中 :))。 - Joran Beasley
非常好的回答,@JoranBeasley 你的也很棒 :) 谢谢大家。 - add-semi-colons
1
请注意,@falsetru 的首个答案将日期时间除以浮点数 1000.0,从而保留毫秒。 - Lorenzo Belli
谢谢。这正是我正在寻找的。 - anish
注意:fromtimestamp 函数接受 int 或者 float 类型的参数。如果你传递一个 Decimal 类型的参数,它的行为会根据你所使用的 Python 版本而有所不同。一些 Python 版本(<= 3.5?)会将其转换成 float 并按照预期工作,而 Python 3.8 会发出警告并将其转换成 int,忽略掉输入可能提供的任何毫秒数。 - Aaron

24

这些是毫秒,只需要将它们除以1000,因为gmtime函数需要秒作为参数...

time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807/1000.0))

4
我明白了,但这样会损失毫秒级的时间对吧? - add-semi-colons
1
是的...我认为你可以通过timestamp/1000.0来保留它们,这将以小数形式传递它们...(尽管我不确定是否可以检索它们)。 - Joran Beasley
有没有类似于gmtime的函数可以将微秒或毫秒作为输入? - Rutger Hofste
1
秒数等于毫秒数除以1000 ... 如果你把这个放在一个函数里,你就会有一个接受毫秒的gmtime函数 ... 微秒只需除以10^6即可。 - Joran Beasley

3

我是一个钟摆迷...所以...

import pendulum
pendulum.from_timestamp(1236472051807/1000.0,tz='America/Toronto')

输出:

DateTime(2019年12月20日,10:55:10,时区=时区('America/Toronto'))

对于所有搜索Gmail API的internalDate的人...上面是我使用的工作方式,比Date头更准确。


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