在 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()
非常感谢任何帮助。
【问题讨论】:
相关:Convertingdatetime.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.time?