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

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

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

Ответ 1

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

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))

Ответ 2

Вот так:

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)

Ответ 3

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

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

Например, отличный модуль feedparser вернет "опубликованное" поле и может вернуть объект time.struct_time в поле "published_parsed":

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 Борода! Информация о часовом поясе!

В этом случае ленивый человек может захотеть использовать отличный модуль 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 или того, что, по вашему мнению, является удивительным.