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

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

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

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

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

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


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

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

如果你想将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'

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

time.mktime(now.timetuple())

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

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

(对不起,它不让我评论现有的答案)


这适用于Python 2和3:

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

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


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

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

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


Python 3.7

返回一种格式的date_string对应的datetime 由date.isoformat()和datetime.isoformat()触发。具体地说, 此函数支持以下格式的字符串: YYYY-MM-DD (* HH: MM [: SS (.fff [fff]]]] (+ HH: MM: SS(。Ffffff]]]],其中* . 可以匹配任何单个字符。

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


对于显式的与时区无关的解决方案,请使用pytz库。

import datetime
import pytz

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

输出(浮点):1333238400.0