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

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

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

2012年4月1日的世界时是1333238400,但上面返回的是1333234800,相差1小时。

因此,看起来strftime正在考虑我的系统时间,并在某个地方应用时区移位。我还以为约会时间太天真了?

我怎么才能避开这个问题呢?如果可能,避免导入其他库,除非标准。(我担心携带不便)。


当前回答

这适用于Python 2和3:

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

只是按照官方文件… https://docs.python.org/2/library/time.html#module-time

其他回答

如果你想将python datetime转换为seconds since epoch,你可以显式地这样做:

>>> (datetime.datetime(2012,4,1,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,而strftime使用您的本地时区。

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

如果你只需要一个Unix /epoch的时间戳,这一行可以工作:

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

并且只依赖于datetime 适用于python2和python3

import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())

这适用于Python 2和3:

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

只是按照官方文件… https://docs.python.org/2/library/time.html#module-time

我在时区等方面有严重的问题。Python处理所有这些的方式(对我来说)非常令人困惑。使用日历模块似乎工作得很好(参见链接1、2、3和4)。

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400