Преобразование python datetime в эпоху с strftime
У меня есть время в UTC, из которого я хочу количество секунд с эпохи.
Я использую strftime, чтобы преобразовать его в число секунд. Принимая 1 апреля 2012 года в качестве примера.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1 апреля 2012 UTC от эпохи 1333238400, но это выше возвращает 1333234800, что отличается на 1 час.
Итак, похоже, что strftime учитывает мое системное время и где-то применяет сдвиг часового пояса. Я думал, что время было чисто наивным?
Как я могу обойти это? Если возможно, избегайте импорта других библиотек, кроме стандартных. (У меня есть проблемы с переносимостью).
Ответы
Ответ 1
Если вы хотите преобразовать дату и время Python в секунды с начала эпохи, вы можете сделать это явно:
>>> (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
Почему вы не должны использовать datetime.strftime('%s')
Python фактически не поддерживает% s в качестве аргумента для strftime (если вы проверите по адресу http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, которого нет в списке), единственный причина, по которой он работает, заключается в том, что Python передает информацию в вашу систему strftime, которая использует ваш локальный часовой пояс.
>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
Ответ 2
У меня были серьезные проблемы с Timezones и т.д. То, как Python обрабатывает все, что может показаться довольно запутанным (для меня). Кажется, что все работает нормально с помощью модуля календаря (см. Ссылки 1, 2, 3 и 4).
>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
Ответ 3
import time
from datetime import datetime
now = datetime.now()
time.mktime(now.timetuple())
Ответ 4
import time
from datetime import datetime
now = datetime.now()
# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6
(Извините, это не позволило мне прокомментировать существующий ответ)
Ответ 5
если вам нужна временная метка в unix/epoch time, эта одна строка работает:
created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L
и зависит только от работы datetime
в python2 и python3
Ответ 6
Это работает в Python 2 и 3:
>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998
Только после официальных документов...
https://docs.python.org/2/library/time.html#module-time
Ответ 7
Для явного решения, не зависящего от часового пояса, используйте библиотеку pytz.
import datetime
import pytz
pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()
Выход (float): 1333238400.0
Ответ 8
В Python 3.7
Возвращает datetime, соответствующий строке date_string в одном из форматов, испускаемых функциями date.isoformat() и datetime.isoformat(). В частности, эта функция поддерживает строки в формате (форматах) ГГГГ-ММ-ДД [* ЧЧ [: ММ [: СС [.fff [fff]]]] [+HH: ММ [: СС [.ffffff]]] ], где * может соответствовать любой отдельный символ.
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat