У меня есть время в UTC, с которого я хочу количество секунд с начала эпохи.
Я использую strftime, чтобы преобразовать его в количество секунд. Принимая 1 апреля 2012 года в качестве примера.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1 апреля 2012 года UTC от эпохи - 1333238400, но это выше возвращает 1333234800, который отличается на 1 час.
Похоже, что strftime учитывает мое системное время и где-то применяет сдвиг часовых поясов. Я думал, что свидание было чисто наивным?
Как я могу обойти это? По возможности избегать импорта других библиотек, кроме стандартных. (У меня есть проблемы с переносимостью).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Ответы:
Если вы хотите преобразовать дату и время Python в секунды с начала эпохи, вы можете сделать это явно:
В Python 3.3+ вы можете использовать
timestamp()
вместо:Почему вы не должны использовать
datetime.strftime('%s')
Python на самом деле не поддерживает% s в качестве аргумента для strftime (если вы проверите по адресу http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, его нет в списке), единственный причина в том, что он работает, потому что Python передает информацию в strftime вашей системы, которая использует ваш местный часовой пояс.
источник
.strftime("%s")
: он не поддерживается, он не переносим, он может молча выдавать неправильный результат для осведомленного объекта даты и времени, он терпит неудачу, если ввод находится в формате UTC (как в вопросе), но локальный часовой пояс не является UTCAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. Это отбрасывает часть микросекунд.У меня были серьезные проблемы с часовыми поясами и тому подобное. То, как Python обрабатывает все, что случается, довольно запутанно (для меня). С модулем календаря все работает нормально (см. Ссылки 1 , 2 , 3 и 4 ).
источник
aprilFirst
в этом примере был экземпляр «в курсе» и использовался часовой пояс, отличный от часового пояса системы, результат был бы неправильным (часовой пояс теряется приtimetuple()
вызове). Чтобы получить правильный ответ для «осведомленной» даты и времени, которую вы можете использоватьawaredt.timestamp()
в недавнем Python 3. Для Python 2 это сложнее; Одним из способов является использованиеarrow
библиотеки.arrow.get(awaredt).timestamp
поймет это правильно.datetime
объект, поэтому я предположил, что «у меня есть время в UTC» означало, что у OP был незнакомыйdatetime
объект, который, как предполагалось, был в UTC, для которого он хотел чтобы получитьepoch
(еслиdatetime
случилось, что TZ-осведомленный, это, действительно, могло бы изменить вещи). Кроме того, имейте в виду, что этому ответу уже почти 8 лет, и с тех пор произошло много событий (например,arrow
был выпущен в 2013 году)источник
time.time()
(mktime()
может произойти сбой во время перехода на летнее время, пока онtime.time()
продолжает работать). И это не отвечает на вопрос, если местный часовой пояс не UTC (ввод в вопросе в UTC). Даже если ввод будет представлять местное время, онmktime()
может также потерпеть неудачу для прошлых / будущих дат, если он не использует базу данных tz и если местный часовой пояс может иметь различные смещения utc в течение многих лет, например, Европа / Москва в 2010-2015 гг. - - вместо этого используйте время UTC (как в вопросе) или объекты datetime с учетом часового пояса..now()
) в метку времени эпохи (возвращенногоmktime()
) . Если вы читаете это; Вы понимаете, почему ввод UTC (используемый в вопросе) (намного) предпочтительнее, чем наивный объект даты и времени, представляющий местное время(Извините, это не позволило бы мне прокомментировать существующий ответ)
источник
если вам просто нужна временная метка в Unix / Epoch Time, эта строка работает:
и зависит только от
datetime
работ в python2 и python3источник
Это работает в Python 2 и 3:
Просто следуйте официальным документам ... https://docs.python.org/2/library/time.html#module-time
источник
Для явного решения, не зависящего от часового пояса, используйте библиотеку pytz.
Выход (float): 1333238400.0
источник
В Python 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
источник