Как конвертировать time.struct_time
объект Python в datetime.datetime
объект?
У меня есть библиотека, которая предоставляет первую и вторую библиотеку, которая хочет вторую.
Как конвертировать time.struct_time
объект Python в datetime.datetime
объект?
У меня есть библиотека, которая предоставляет первую и вторую библиотеку, которая хочет вторую.
Ответы:
Используйте time.mktime (), чтобы преобразовать кортеж времени (по местному времени) в секунды с начала эпохи, затем используйте datetime.fromtimestamp (), чтобы получить объект datetime.
from datetime import datetime
from time import mktime
dt = datetime.fromtimestamp(mktime(struct))
tm_isdst
данные? Я думаю , что это так, в результате чего DATETIME объект остается наивным до такой степени , чтобы вернуться None
на , .dst()
даже если struct.tm_isdst
это 1
.
mktime()
следует tm_isdst
учитывать, и Python time.mktime()
вызывает mktime()
функцию C на CPython. mktime()
может выбрать неправильное местное время, когда оно неоднозначно (например, во время перехода в конце DST («откат»)), если struct.tm_isdst
есть -1
или если mktime()
на данной платформе игнорирует ввод tm_isdst
. Кроме того, если в прошлом местный часовой пояс имел различное смещение utc в прошлом, и C mktime()
не использует историческую базу данных tz, которая может предоставить старые значения смещения utc, то mktime()
может также вернуть неправильное (например, на час) значение.
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.
Как это:
>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)
*
и **
синтаксис позволяет вам расширить объект типа listy или dicty для разделения аргументов - это одна из моих любимых частей Python. См. Docs.python.org/2/tutorial/… для получения дополнительной информации
t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
datetime
: datetime(*t[:5]+(min(t[5], 59),))
например, принять "2015-06-30 16:59:60 PDT"
.
Это не прямой ответ на ваш вопрос (на который уже довольно неплохо ответили). Однако, несколько раз укусив меня за фундамент, я не могу не подчеркнуть, что вам следует внимательно присмотреться к тому, что предоставляет ваш объект 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 или что-то еще, что вы считаете удивительным.
*_parsed
поля из feedparsed уже нормализованы к UTC, что можно проверить в документации разбора даты, так что это избыточно.
datetime
объекте, который теряется при feedparser
разборе необработанных строковых дат.