В Python, как вы конвертируете секунды с начала эпохи в объект `datetime`?


249

timeМодуль может быть инициализирован с помощью секунд с начала эпохи:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

Есть ли элегантный способ инициализации datetime.datetimeобъекта таким же образом?


3
для противоположной операции перейдите по ссылке: convert-a-datetime-object-to-секунды
Тревор Бойд Смит

Ответы:


405

datetime.datetime.fromtimestamp будет делать, если вы знаете часовой пояс, вы могли бы производить тот же вывод, что и с time.gmtime

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

или

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

43
причудливо, datetime.utcfromtimestampсоздает наивную временную метку. Мне пришлось import pytzи использовать, datetime.fromtimestamp(1423524051, pytz.utc)чтобы создать осведомленную дату и время.
Мэтт

6
как последующих по указанному выше, с Python> = 3.2 вы не должны импортировать pytzбиблиотеку , если вы хотите только UTC метку времени - вам нужно только , from datetime import datetime, timezoneа затем вызвать его следующим образом : datetime.fromtimestamp(1423524051, timezone.utc). Он много раз сохранял дополнительную библиотеку, когда мне нужен только часовой пояс UTC pytz.
phouse512

38

Секунды с эпохи datetimeдо strftime:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

Это должно быть datetime.fromtimestamp (1579366345) .strftime ('% Y-% m-% d% H:% M:% S')
vml19

27

Из документов рекомендуемый способ получения объекта datetime с указанием часового пояса в секундах с начала эпохи:

Python 3 :

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2 , используя pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

Будет полезна ссылка на документацию в ваших субтитрах («Python 3», «Python 2») - и я также рекомендую изменить их порядок.
Адам Матан

Обновлено. Оставляя порядок тот же, так как это соответствует документации Python.
Meistro

вам не нужно pytzпросто получить utcобъект tzinfo. Это легко создать самому
JFS

9

Обратите внимание, что datetime.datetime. метка времени (timestamp) и. Сбой utcfromtimestamp (timestamp) в Windows для дат до 1 января 1970 года, в то время как отрицательные метки времени unix, похоже, работают на платформах на основе unix. Документы говорят это:

« Это может вызвать ValueError, если отметка времени выходит за пределы диапазона значений, поддерживаемых функцией gmtime () платформы C. Обычно это ограничивается годами с 1970 по 2038 годы ».

Смотрите также Issue1646728


: о) да, еще около 23 лет, чтобы это исправить
user3666197

5
Вы можете использовать utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp), чтобы обойти это.
Jfs
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.