使用strftime将python datetime转换为epoch

Convert python datetime to epoch with strftime

我有一个以UTC为单位的时间,从这个时间开始我要用从epoch开始的秒数。

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

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

2012年4月1日,来自epoch的UTC是1333238400,但上面返回的是1333234800,这与1小时不同。

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

我怎么能避开那个?如果可能,避免导入其他库,除非标准。(我有可移植性问题)。


如果要将Python日期时间转换为自epoch以来的秒数,可以显式执行此操作:

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

在python 3.3+中,您可以使用timestamp()

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

为什么不使用EDOCX1[1]

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

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


我对时区等有严重的问题。python处理所有这些事情的方式(对我来说)非常混乱。使用日历模块似乎一切正常(请参阅链接1、2、3和4)。

1
2
3
4
5
>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400


1
2
3
4
5
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())


1
2
3
4
5
6
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时间中使用时间戳,那么这一行可以工作:

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

而且只取决于datetime。在python2和python3中工作


这在python 2和3中有效:

1
2
3
4
>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

只是按照官方文件……https://docs.python.org/2/library/time.html模块时间


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

1
2
3
4
import datetime
import pytz

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

输出(浮动):1333238400.0


在python 3.7中

Return a datetime corresponding to a date_string in one of the formats
emitted by date.isoformat() and datetime.isoformat(). Specifically,
this function supports strings in the format(s)
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]], where *
can match any single character.

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