Преобразование 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

Ответ 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