it-swarm.com.ru

Преобразование даты и времени Python в Epoch с помощью strftime

У меня есть время в UTC, с которого я хочу количество секунд с начала эпохи.

Я использую strftime, чтобы преобразовать его в количество секунд. Принимая 1 апреля 2012 года в качестве примера.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

1 апреля 2012 года UTC от Epoch - 1333238400, но это выше возвращает 1333234800, который отличается на 1 час. 

Похоже, что strftime учитывает мое системное время и где-то применяет сдвиг часовых поясов. Я думал свидание было чисто наивным?

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

144
Noel

Если вы хотите преобразовать дату и время Python в секунды после Epoch, вы можете сделать это явно:

>>> (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'
284
jleahy

У меня были серьезные проблемы с часовыми поясами и тому подобное. То, как Python обрабатывает все, что случается, довольно запутанно (для меня). Кажется, что все работает нормально, используя модуль календаря (см. Ссылки 1 , 2 , 3 и 4 ).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
86
BorrajaX
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
31
srossross
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(Извините, я не смогу прокомментировать существующий ответ)

14
Charles Plager

Это работает в Python 2 и 3:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

Просто следуйте официальным документам ... https://docs.python.org/2/library/time.html#module-time

2
Luis Pollo

если вам просто нужна временная метка в Unix/Epoch time, эта строка работает:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

и зависит только от datetimeworks в python2 и python3

2
Marc Maxmeister

В Python 3.7

Возврат даты и времени, соответствующих строке date_string в одном из форматов испускается date.isoformat () и datetime.isoformat (). В частности, эта функция поддерживает строки в формате (ах) ГГГГ-ММ-ДД [* ЧЧ [: ММ [: СС [.fff [ффф]]]] [+ ЧЧ: ММ [: СС [.ffffff]]]], где * может соответствовать любому отдельному символу.

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

0
SuperNova

Для явного решения, не зависящего от часового пояса, используйте библиотеку pytz.

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

Результат (float): 1333238400.0

0
Moobie