269

我有一个 UTC 时间,我想要从纪元开始的秒数。

我正在使用 strftime 将其转换为秒数。以 2012 年 4 月 1 日为例。

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

2012 年 4 月 1 日 UTC 从纪元开始是 1333238400 ,但上面的返回 1333234800 相差 1 小时。

所以看起来 strftime 正在考虑我的系统时间并在某处应用时区转换。我认为 datetime 纯粹是幼稚的?

我怎样才能解决这个问题?如果可能避免导入其他库,除非是标准的。(我有便携性问题)。

4

8 回答 8

513

如果您想将 python 日期时间转换为自纪元以来的秒数,您可以显式执行此操作:

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

在 Python 3.3+ 中,您可以timestamp()改用:

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

为什么你不应该使用datetime.strftime('%s')

Python 实际上并不支持 %s 作为 strftime 的参数(如果您在http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior检查它不在列表中),唯一的它工作的原因是因为 Python 正在将信息传递给您系统的 strftime,它使用您的本地时区。

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
于 2012-07-31T15:10:58.887 回答
109

我对时区等有严重的问题。Python 处理所有这些的方式碰巧很令人困惑(对我来说)。使用日历模块似乎一切正常(请参阅链接1234)。

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
于 2012-07-31T15:04:33.757 回答
37
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
于 2013-06-20T01:31:43.507 回答
16
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(对不起,它不会让我对现有答案发表评论)

于 2013-09-23T19:20:00.273 回答
7

如果您只需要 unix /epoch 时间的时间戳,则这一行有效:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

并且仅依赖datetime 于 python2 和 python3 中的作品

于 2018-04-05T19:27:43.190 回答
4

对于明确的独立于时区的解决方案,请使用 pytz 库。

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

输出(浮点数):1333238400.0

于 2019-03-21T07:06:21.063 回答
3

这适用于 Python 2 和 3:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

只需遵循官方文档... https://docs.python.org/2/library/time.html#module-time

于 2017-09-09T00:49:44.333 回答
0

在 Python 3.7 中

以 date.isoformat() 和 datetime.isoformat() 发出的格式之一返回与 date_string 对应的日期时间。具体来说,此函数支持格式为 YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]] 的字符串, 其中 * 可以匹配任何单个字符。

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

于 2018-11-25T13:51:53.703 回答