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

Nat*_*ppi 210 python python-2.7

为这个简单的问题道歉...我是Python的新手...我已经四处寻找,似乎没有任何工作.

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

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Run Code Online (Sandbox Code Playgroud)

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

t.toordinal()
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢.

Mar*_*som 220

对于1970年1月1日的特殊日期,有多种选择.

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

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0
Run Code Online (Sandbox Code Playgroud)

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

如评论中所述,如果你有一个tzinfo附加到你的datetime那个,你也需要一个在开始日期或减法将失败; 对于上面的例子,tzinfo=pytz.utc如果使用Python 2或tzinfo=timezone.utc使用Python 3 ,我会添加.

  • 考虑使用:``datetime.datetime.utcfromtimestamp(0)``我用它来轻松获得'纪元'.请注意,所有系统上的纪元并不总是相同的. (8认同)
  • 这里的时区要非常小心。我在 UTC+2,这意味着 `time.time()` 和 `datetime.now() - datetime(1970, 1, 1)` 的输出相差 7200 秒。而是使用`(t - datetime.datetime.fromtimestamp(0)).total_seconds()`。如果您想在本地时区转换日期时间,请不要*使用 `utcfromtimestamp(0)`。 (3认同)
  • @Charybdis,尝试`datetime.datetime(1970,1,1,tzinfo = pytz.utc)`。 (2认同)
  • @DA:[Python不支持非POSIX时代](http://bugs.python.org/issue22356).python工作的所有系统使用相同的Epoch:1970-01-01 00:00:00 UTC (2认同)

Mar*_*ers 126

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

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
Run Code Online (Sandbox Code Playgroud)

  • 使用time.mktime时要小心,因为它表示当地时间,而且与平台有关 (22认同)
  • 确实要小心.这让我感到非常沮丧 (7认同)

And*_*bis 102

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

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()
Run Code Online (Sandbox Code Playgroud)

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

  • 升级的时候我猜;) (10认同)
  • 我假设,downvote是由于问题上的python-2.7标签(这只是猜测). (4认同)
  • 谁投了反对票,你能解释一下为什么吗? (3认同)
  • 这应该是接受的答案/接受的答案应该相应更新. (3认同)

dan*_*an3 25

int (t.strftime("%s")) 也有效

  • 在 Python 2.7 中为我工作,使用“import datetime;” t = datetime.datetime(2011, 10, 21, 0, 0)`(由OP指定)。但实际上,我怀疑 %s 是最近添加的时间格式。 (2认同)

Rob*_*ujo 25

也许偏离主题:从datetime获取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)
Run Code Online (Sandbox Code Playgroud)

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

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h
Run Code Online (Sandbox Code Playgroud)

因此,应该考虑使用UTC版本的函数将UTC标准化.

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

参考文献:


Mic*_*ael 13

来自python文档:

timedelta.total_seconds()
Run Code Online (Sandbox Code Playgroud)

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

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
Run Code Online (Sandbox Code Playgroud)

计算启用真正的除法.

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

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