【问题标题】:Converting epoch time with milliseconds to datetime以毫秒为单位的纪元时间转换为日期时间
【发布时间】:2014-03-14 07:03:57
【问题描述】:

我使用 ruby​​ 脚本将 iso 时间戳转换为纪元,我正在解析的文件具有以下时间戳结构:

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'
>>> 

我想知道这与我的格式化方式有关吗?

【问题讨论】:

    标签: python ruby datetime epoch


    【解决方案1】:

    这些是毫秒,只需将它们除以 1000,因为 gmtime 预计秒...

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

    【讨论】:

    • 我明白了,但我会失去几毫秒,对吧..?
    • 是的...我认为您可以通过timestamp/1000.0 保留它们,这会将它们作为小数传递...(尽管我不确定您是否可以检索它们)
    • 是否有与 gmtime 等效的以微秒或毫秒为输入的方法?
    • seconds == milliseconds/1000 ...如果你把它放在一个函数中,你将有一个接受毫秒的gmtime ...你只需除以10^6的微秒
    【解决方案2】:

    使用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'
    

    【讨论】:

    • 是的,我会建议这个......但是很好的答案(+1 用于保留显示中的毫秒数:))
    • @JoranBeasley 你的答案也很好:) 谢谢大家。
    • 请注意@falsetru 第一个答案除以浮点1000.0 从而保持日期时间的毫秒数。
    • 谢谢。正是我想要的
    • 注意:fromtimestamp 需要一个整数或浮点数。如果你传递一个小数;它的行为取决于你的 python 版本。一些 python 版本(转换为 int,但会丢弃您的输入可能提供的任何毫秒数。
    【解决方案3】:

    我是个钟摆迷……所以……

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

    输出:

    DateTime(2019, 12, 20, 10, 55, 10, tzinfo=Timezone('America/Toronto'))

    对于为 Gmail API 寻找 internalDate 的所有搜索...以上对我有用,并且比 Date 标头更准确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-27
      • 2017-05-28
      • 2021-03-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2020-01-26
      相关资源
      最近更新 更多