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

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

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

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

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

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


当前回答

如果你只需要一个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

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

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

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

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

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

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

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

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

import datetime
import pytz

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

输出(浮点):1333238400.0