Как получить секунды, начиная с эпохи, из времени + даты вывода gmtime ()?

162

Как вы делаете обратное gmtime(), где вы положили время + дату и получить количество секунд?

У меня есть строки вроде 'Jul 9, 2009 @ 20:02:58 UTC', и я хочу вернуть количество секунд между эпохой и 9 июля 2009 года.

Я пытался, time.strftimeно я не знаю, как правильно его использовать, или это правильная команда для использования.

calccrypto
источник

Ответы:

123

Если вы попали сюда из-за того, что поисковая система сказала вам, как получить метку времени Unix, прекратите читать этот ответ. Прокрутите вниз один.

Если вы хотите повернуть вспять time.gmtime(), вы хотите calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Вы можете превратить вашу строку в кортеж времени time.strptime(), который возвращает кортеж времени, который вы можете передать calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Больше информации о модуле календаря здесь

nmichaels
источник
16
Если вы ищете текущее время эпохи Unix, пожалуйста, обратитесь к комментарию @ DanJ или ответу naren, этот ответ неверный!
Косия
641

Используйте модуль времени :

epoch_time = int(time.time())
Naren
источник
14
@DanJ: это количество прошедших секунд с начала эпохи (фиксированный момент времени), и оно одинаково в любом часовом поясе. Хотя, если мы проигнорируем момент времени вокруг високосных секунд; его легко конвертировать в UTC, если timeиспользуется эпоха Unix (1970).
JFS
43
Обратите внимание, что это не то, о чем просил ОП, а то, что я хотел. Итак +1.
fearless_fool
6
это ответ на вопрос, который задают в заголовке: «получать время с эпохи». +1
АлехандроВД
@JFSebastian это дает эпоху секунд. Как я могу получить разрешение до миллисекунд, используя тот же ответ выше?
Марлон Абейкун
2
чтобы расширить мой комментарий выше : time.time()значение НЕ зависит от местного часового пояса (если мы исключаем «правильные» часовые пояса и т. п.), например, если он возвращает время POSIX (как это происходит в большинстве систем), то это число секунд СИ с момента Эпоха (1970-01-01UTC) не считая високосных секунд. Это значение можно преобразовать в UTC (исключая високосные секунды), но это не UTC . @MarlonAbeykoon: мне нравится этот ответ
JFS
10

Обратите внимание , что time.gmtimeкарты временной метки 0для 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) дает вам временную метку, сдвинутую на величину, зависящую от вашей локали, которая в общем случае может не быть 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

Обратный time.gmtimeIS calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0
unutbu
источник
Это дает лучшее объяснение и пример для time.mktime (которое учитывает текущий часовой пояс), спасибо
Jkm
@Jkm: НЕ использовать mktime()с gmtime(). mktime()принимает ваше местное время, но gmtime()возвращает время UTC - ваш местный часовой пояс может и, скорее всего, будет другим. «отметка времени относительно вашей локали» не имеет смысла: отметка времени POSIX не зависит от вашей локали (местного часового пояса) - она ​​одинакова во всем мире. «секунды с начала эпохи» в большинстве случаев являются метками времени POSIX (даже в Windows) - такие вещи, как «правильные» часовые пояса, использующие шкалу времени TAI, не распространены. См . Возвращает ли Python time.time () локальную или UTC временную метку?
Jfs
@JF Себастьян Ты прав. На самом деле я получил несколько вопросов о mktime()недавно. Для некоторых веб-серверов python (например, Tornado), поскольку процесс продолжает работать, даже если я изменяю языковой стандарт системы, mktime()вызываемый API веб-сервера по-прежнему использует старый часовой пояс для создания объекта времени. Я должен переключиться gmtime()и вручную применить смещение gmt.
Jkm
5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Это должно отличаться от int(time.time()), но это безопасно использовать что-то вродеx % (60*60*24)

datetime - Основные типы даты и времени:

В отличие от модуля времени, модуль даты и времени не поддерживает високосные секунды.

user3226167
источник
3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
Falmarri
источник
Я не могу получить доступ к strptime по какой-то причине. Я импортировал
дату и время
1
@calccrypto вы должны либо from datetime import datetimeсделать, либоdatetime.datetime.strptime
pathikrit