【问题标题】:In Python, how do you convert a `datetime` object to seconds?在 Python 中,如何将 `datetime` 对象转换为秒?
【发布时间】:2023-03-27 02:36:01
【问题描述】:

为这个简单的问题道歉...我是 Python 新手...我四处搜索,似乎没有任何效果。

我有一堆 datetime 对象,我想为每个对象计算自过去固定时间以来的秒数(例如自 1970 年 1 月 1 日以来)。

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

这似乎只是区分不同日期的日期:

t.toordinal()

非常感谢任何帮助。

【问题讨论】:

标签: python python-2.7


【解决方案1】:
import datetime
import math


def getSeconds(inputDate):
    time = datetime.date.today().strftime('%m/%d/%Y')
    date_time = datetime.datetime.strptime(time, '%m/%d/%Y')
    msg = inputDate
    props = msg.split(".")
    a_timedelta = datetime.timedelta
    if(len(props)==3):
        a_timedelta = date_time - datetime.datetime(int(props[0]),int(props[1]),int(props[2]))
    else:
        print("Invalid date format")
        return
    seconds = math.trunc(a_timedelta.total_seconds())
    print(seconds)
    return seconds

示例 getSeconds("2022.1.1")

【讨论】:

    【解决方案2】:

    Python 提供了对日期时间的操作来计算两个日期之间的差异。你的情况是:

    t - datetime.datetime(1970,1,1)
    

    返回的值是一个 timedelta 对象,您可以从中使用成员函数 total_seconds 获取以秒为单位的值。

    (t - datetime.datetime(1970,1,1)).total_seconds()
    

    【讨论】:

    • 虽然这可能是一个正确的答案,但请提供一些解释。
    【解决方案3】:

    在python 3.x中查找代码块处理时间的标准方法如下:

    import datetime
    
    t_start = datetime.datetime.now()
    
    # Here is the python3 code, you want 
    # to check the processing time of
    
    t_end = datetime.datetime.now()
    print("Time taken : ", (t_end - t_start).total_seconds()*1000, " ms")
    

    【讨论】:

      【解决方案4】:

      也许题外话:从日期时间获取 UNIX/POSIX 时间并将其转换回来:

      >>> import datetime, time
      >>> dt = datetime.datetime(2011, 10, 21, 0, 0)
      >>> s = time.mktime(dt.timetuple())
      >>> s
      1319148000.0
      
      # and back
      >>> datetime.datetime.fromtimestamp(s)
      datetime.datetime(2011, 10, 21, 0, 0)
      

      请注意,不同的时区会影响结果,例如我当前的 TZ/DST 返回:

      >>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
      -3600 # -1h
      

      因此应该考虑使用函数的 UTC 版本来规范化为 UTC。

      注意之前的结果可用于计算您当前时区的 UTC 偏移量。在本例中,这是 +1h,即 UTC+0100。

      参考文献:

      【讨论】:

      • mktime() may fail。一般来说,您需要pytz 将本地时间转换为UTC,以获得POSIX时间戳。
      • calendar.timegm() 似乎是 time.mktime() 的 utc 版本
      • 另请注意:mktime 比其他方法慢 10 倍。由于您不太可能在热门路径中执行此操作,因此这很重要。
      【解决方案5】:

      对于 1970 年 1 月 1 日这一特殊日期,有多种选择。

      对于任何其他开始日期,您需要以秒为单位获取两个日期之间的差异。减去两个日期得到一个 timedelta 对象,从 Python 2.7 开始,它有一个 total_seconds() 函数。

      >>> (t-datetime.datetime(1970,1,1)).total_seconds()
      1256083200.0
      

      开始日期通常以 UTC 格式指定,因此为了获得正确的结果,您输入此公式的 datetime 也应采用 UTC 格式。如果您的 datetime 尚未采用 UTC,则需要在使用之前对其进行转换,或者附加一个具有适当偏移量的 tzinfo 类。

      如 cmets 中所述,如果您的 datetime 附加了一个 tzinfo,那么您在开始日期也需要一个,否则减法将失败;对于上面的示例,如果使用 Python 2,我将添加 tzinfo=pytz.utc,如果使用 Python 3,我将添加 tzinfo=timezone.utc。

      【讨论】:

      • Python 现在警告我:“TypeError: can't minus offset-naive and offset-aware datetimes” 解决这个问题的最佳解决方案是什么?
      • @Charybdis,试试datetime.datetime(1970,1,1,tzinfo=pytz.utc)。
      • 考虑使用:datetime.datetime.utcfromtimestamp(0) 我已经用它来轻松获得“时代”。请注意,所有系统上的 epoch 并不总是相同。
      • 这里的时区要非常小心。我在 UTC+2,这意味着 time.time() 和 datetime.now() - datetime(1970, 1, 1) 的输出相差 7200 秒。而是使用(t - datetime.datetime.fromtimestamp(0)).total_seconds()。如果您想在本地时区转换日期时间,请不要使用utcfromtimestamp(0)。
      • @D.A.:Python does not support non-POSIX epochs。 python工作的所有系统都使用相同的Epoch:1970-01-01 00:00:00 UTC
      【解决方案6】:

      To convert a datetime object that represents time in UTC to POSIX timestamp:

      from datetime import timezone
      
      seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()
      

      将表示本地时区时间的日期时间对象转换为 POSIX 时间戳:

      import tzlocal # $ pip install tzlocal
      
      local_timezone = tzlocal.get_localzone()
      seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()
      

      请参阅How do I convert local time to UTC in Python? 如果 tz 数据库在给定平台上可用; a stdlib-only solution may work.

      如果您需要<3.3 Python 版本的解决方案,请点击链接。

      【讨论】:

        【解决方案7】:

        从 Python 3.3 开始,使用 datetime.timestamp() 方法变得非常简单。这当然只有在您需要 1970-01-01 UTC 的秒数时才有用。

        from datetime import datetime
        dt = datetime.today()  # Get timezone naive now
        seconds = dt.timestamp()
        

        返回值将是一个浮点数,表示偶数秒的几分之一。如果 datetime 是简单的时区(如上面的示例),则假定 datetime 对象表示本地时间,即它将是从您所在位置的当前时间到 1970-01-01 UTC 的秒数。

        【讨论】:

        • 谁投了反对票,你能解释一下原因吗?
        • 我认为,downvote 是由于问题上的 python-2.7 标记(这只是一个猜测)。
        • 这应该是接受的答案/接受的答案应该相应地更新。
        • 我猜是时候升级了 ;)
        • 可以从另一个开始日期计算这个距离吗? (我的意思是更改 1970-01-01 日期)
        【解决方案8】:

        我尝试了标准库的 calendar.timegm,效果很好:

        # convert a datetime to milliseconds since Epoch
        def datetime_to_utc_milliseconds(aDateTime):
            return int(calendar.timegm(aDateTime.timetuple())*1000)
        

        参考:https://docs.python.org/2/library/calendar.html#calendar.timegm

        【讨论】:

        • 它剥离了几分之一秒。它假定 aDateTime 是 UTC 时间
        【解决方案9】:

        int (t.strftime("%s")) 也可以使用

        【讨论】:

        • 在 Python 2.7 中为我工作,使用 import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)(由 OP 指定)。但实际上,我怀疑 %s 是最近添加的时间格式。
        • @dan3:错误。不支持%s(如果t 是表示本地时间的天真日期时间对象并且如果本地C 库可以访问tz 数据库,则它可能在某些平台上工作,否则结果可能是错误的)。不要使用它。
        • %s 没有在任何地方记录。我用真实的代码播下它,想知道这是什么,然后查看文档,没有 %s 这样的东西。大S只有几秒钟。
        【解决方案10】:

        来自 python 文档:

        timedelta.total_seconds()
        

        返回持续时间中包含的总秒数。相当于

        (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
        

        在启用真正除法的情况下计算。

        请注意,对于非常大的时间间隔(在大多数平台上大于 270 年),此方法将失去微秒精度。

        此功能是 2.7 版中的新功能。

        【讨论】:

        • 计算有一个小问题,它必须是 106 而不是 10*6 ... td.microseconds + (td.seconds + td.days * 24 * 3600) * 106) / 10**6
        • @sdu 非常棒 - 双星号在我的答案中,但 stackoverflow 消耗了它,试图纠正只是使文本更加大胆。
        【解决方案11】:

        获取 Unix 时间(自 1970 年 1 月 1 日以来的秒数):

        >>> import datetime, time
        >>> t = datetime.datetime(2011, 10, 21, 0, 0)
        >>> time.mktime(t.timetuple())
        1319148000.0
        

        【讨论】:

        • 在使用 time.mktime 时要小心,因为它是本地时间的表达,并且依赖于平台
        • 确实要小心。它让我大吃一惊
        • 它假定t 是当地时间。过去,本地时区的 UTC 偏移量可能有所不同,如果 mktime()(C 库)无法访问给定平台上的历史时区数据,则它可能会失败(pytz 是访问 tz 的可移植方式数据库)。此外,本地时间可能不明确,例如在 DST 转换期间 - 您需要其他信息来消除 e.g., if you know that consecutive date/time values should be increasing in a log file 的歧义
        • 在使用它的时间只有几分之一时要小心。 time.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple()) 产生1564819506.0,默默地减少毫秒,但datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()(Andrzej Pronobis 的回答)产生1564819506.912,这是预期的结果。
        猜你喜欢
        • 2011-04-11
        • 2019-11-01
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 2022-01-17
        相关资源
        最近更新 更多