В 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)
SilentGhost
источник
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'
Seganku
источник
Это должно быть 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)
Meistro
источник
Будет полезна ссылка на документацию в ваших субтитрах («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

cbare
источник
: о) да, еще около 23 лет, чтобы это исправить
user3666197
5
Вы можете использовать utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp), чтобы обойти это.
Jfs