Преобразование python datetime в epoch с помощью strftime
У меня есть время в UTC, из которого я хочу количество секунд с начала эпохи.
Я использую strftime, чтобы преобразовать его в количество секунд. Возьмем в качестве примера 1 апреля 2012 года.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1 апреля 2012 UTC от эпохи 1333238400, но это выше возвращает 1333234800, который отличается на 1 час.
таким образом, похоже, что strftime учитывает мое системное время и применяет сдвиг часового пояса где-то. Я думал, что datetime был чисто наивно?
Как я могу обойти это? По возможности избегая импорта других библиотек, если они не являются стандартными. (У меня есть проблемы переносимости).
6 ответов:
Python фактически не поддерживает %s в качестве аргумента для strftime (если вы проверяете на http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior его нет в списке), единственная причина, по которой он работает, заключается в том, что Python передает информацию в strftime вашей системы, которая использует ваш локальный часовой пояс.
Если вы хотите конвертировать python datetime в секунды с эпохи, вы должны сделать это явно:
>>> datetime.datetime(2012,04,01,0,0).strftime('%s') '1333234800' >>> (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
У меня были серьезные проблемы с часовыми поясами и тому подобное. То, как Python обрабатывает все это, довольно запутанно (для меня). Кажется, что все работает нормально с помощью модуля календаря (см. ссылки 1,2,3 и 4).
>>> import datetime >>> import calendar >>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0) >>> calendar.timegm(aprilFirst.timetuple()) 1333238400
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 time, эта строка работает:
created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds()) >>> created_timestamp 1522942073Lи
datetimeработает в python2 и python3
Comments