Как преобразовать объект time.struct_time в объект datetime?

Как конвертировать time.struct_timeобъект Python в datetime.datetimeобъект?

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

8.11.2009 20:23:23
3 ОТВЕТА
РЕШЕНИЕ

Используйте time.mktime (), чтобы преобразовать кортеж времени (в местном времени) в секунды с начала эпохи, затем используйте datetime.fromtimestamp (), чтобы получить объект datetime.

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))
382
31.03.2019 23:49:35
Обратите внимание: до 1900 года это не получится. Вы, современные люди, никогда не помните этого ограничения!
mlissner 18.02.2012 07:40:18
это потеряет tm_isdstданные? Я думаю , что это так, в результате чего DATETIME объект остается наивным до такой степени , чтобы вернуться Noneна , .dst()даже если struct.tm_isdstэто 1.
n611x007 8.05.2014 14:43:07
Это обычно будет работать. Однако произойдет сбой, если кортеж времени превышает значения, которые принимает mktime, например, для значения (1970, 1, 1, 0, 0, 0, 0, 1, -1). Я столкнулся с этим после синтаксического анализа заголовка даты HTTP-запроса, который вернул этот кортеж.
user3820547 9.07.2014 14:20:13
@richvdh: стандарт C определяет, что mktime()следует tm_isdstучитывать, и Python time.mktime()вызывает mktime()функцию C на CPython. mktime()может выбрать неправильное местное время, когда оно неоднозначно (например, во время перехода в конце DST («откат»)), если struct.tm_isdstесть -1или если mktime()на данной платформе игнорирует ввод tm_isdst . Кроме того, если в прошлом местный часовой пояс имел различное смещение utc в прошлом, и C mktime()не использует историческую базу данных tz, которая может предоставить старые значения смещения utc, то mktime()может также вернуть неправильное (например, на час) значение.
jfs 16.01.2015 17:25:17
@naxa: если mktime()не игнорировать tm_isdstна данной платформе (это делает на моей), то fromtimestamp()определенно теряет информацию: возвращаемый наивный datetime объект, представляющий локальное время, может быть неоднозначным (timestamp -> local time является детерминированным (если мы игнорируем високосные секунды), но local time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also, fromtimestamp () `может выбрать неправильное смещение utc, если оно не использует историческую базу данных tz.
jfs 16.01.2015 17:34:05

Нравится:

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)
123
8.11.2009 20:40:03
Не забудьте импортировать время,
jhwist 8.11.2009 21:00:40
@jhwist - некоторые вещи можно доверять людям, чтобы они сами это
orip 8.11.2009 21:10:29
@rodling *и **синтаксис позволяет расширять объект типа listy или dicty для разделения аргументов - это одна из моих любимых частей Python. См. Docs.python.org/2/tutorial/… для получения дополнительной информации
OrganicPanda 17.01.2013 16:02:52
Просто помните, что это даст вам ValueError, если struct_time имеет дополнительную секунду, например:t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
berdario 20.01.2014 00:17:43
@berdario: вернуть значения, совместимые с datetime: datetime(*t[:5]+(min(t[5], 59),))например, принять "2015-06-30 16:59:60 PDT".
jfs 16.01.2015 17:49:46

Это не прямой ответ на ваш вопрос (на который уже довольно неплохо ответили). Однако, несколько раз укусив меня за фундамент, я не могу не подчеркнуть, что вам следует внимательно присмотреться к тому, что предоставляет ваш объект time.struct_time, по сравнению с другими временными полями.

Предполагая, что у вас есть как объект time.struct_time, так и некоторая другая строка даты / времени, сравните их и убедитесь, что вы не теряете данные и случайно создаете наивный объект datetime, если вы можете сделать иначе.

Например, превосходный модуль feedparser возвратит «опубликованное» поле и может вернуть объект time.struct_time в свое поле «ключ_публикованного»:

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)

Теперь обратите внимание, что вы на самом деле получаете с «опубликованным» полем.

Mon, 09 Sep 2013 19:57:42 -0400

По Stallman Борода «s! Информация о часовом поясе!

В этом случае ленивый человек может захотеть использовать отличный модуль dateutil для хранения информации о часовом поясе:

from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()

что дает нам:

published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00

Затем можно использовать объект datetime с учетом часового пояса, чтобы нормализовать все время по UTC или как вы думаете, это здорово.

37
15.11.2015 09:02:30
Все *_parsedполя из feedparsed уже нормализованы к UTC, что можно проверить в документации разбора даты, так что это избыточно.
itorres 24.06.2016 22:44:32
@itorres: Если я понимаю, этот ответ не о нормализации к UTC, а о хранении информации о часовом поясе в datetimeобъекте, который теряется при feedparserразборе необработанных строковых дат.
davidag 26.08.2019 15:17:22