在 Python 中,如何将 `datetime` 对象转换为秒?

Posted

技术标签:

【中文标题】在 Python 中,如何将 `datetime` 对象转换为秒?【英文标题】:In Python, how do you convert a `datetime` object to seconds? 【发布时间】:2011-12-12 18:19:28 【问题描述】:

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

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

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

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

t.toordinal()

非常感谢任何帮助。

【问题讨论】:

相关:Converting datetime.date to UTC timestamp in Python 我可能会从 epoch 开始将两者都转换为 S 并从那里开始:int(t.timestamp()) 相反的操作去这里:convert-seconds-since-epoch-to-a-datetime-object 【参考方案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。

参考文献:

datetime.date.timetuple time.mktime datetime.datetime.fromtimestamp time module 中的介绍解释了 POSIX 时间、1970 纪元、UTC、TZ、DST ...

【讨论】:

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 非常棒 - 双星号在我的答案中,但 *** 消耗了它,试图纠正只是使文本更加大胆。【参考方案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,这是预期的结果。

以上是关于在 Python 中,如何将 `datetime` 对象转换为秒?的主要内容,如果未能解决你的问题,请参考以下文章

python 如何将字符串转化为datetime.date

如何将增量添加到 python datetime.time?

Python:从 `datetime.datetime` 转换为 `time.time`

python模块datetime将字符串转换为日期

如何在python中获取时区感知午夜日期时间? [复制]

python中如何把datetime.datetime转换成datetime.time?