Преобразование 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 был чисто наивно?

Как я могу обойти это? По возможности избегая импорта других библиотек, если они не являются стандартными. (У меня есть проблемы переносимости).

232   6  

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()

time.mktime(now.timetuple())
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

    Ничего не найдено.

Добавить ответ:
Отменить.