Ответ 1
Вы правы, что это поведение связано с летним временем. Самый простой способ избежать этого - обеспечить, чтобы вы использовали часовой пояс без летнего времени, UTC имеет наибольший смысл здесь.
datetime.datetime.utcfromtimestamp()
и calendar.timegm()
справиться с UTC и являются точными инверсиями.
import calendar, datetime
# Convert a unix time u to a datetime object d, and vice versa
def dt(u): return datetime.datetime.utcfromtimestamp(u)
def ut(d): return calendar.timegm(d.timetuple())
Вот несколько объяснений, почему datetime.datetime.fromtimestamp()
имеет проблему с летним временем, из документов:
Верните локальную дату и время, соответствующие метке времени POSIX, например, возвращается
time.time()
. Если необязательный аргумент tz равен None или не указано, метка времени преобразуется в локальную дату платформ и время, а возвращаемый объект datetime наивен.
Важная часть здесь заключается в том, что вы получаете наивный объект datetime.datetime
, что означает, что информация о временной зоне (или летней экономии) отсутствует как часть объекта. Это означает, что несколько различных временных меток могут отображаться в одном и том же объекте datetime.datetime
при использовании fromtimestamp()
, если вам приходится выбирать время, которое падает во время летнего времени, откат:
>>> datetime.datetime.fromtimestamp(1004260000)
datetime.datetime(2001, 10, 28, 1, 6, 40)
>>> datetime.datetime.fromtimestamp(1004256400)
datetime.datetime(2001, 10, 28, 1, 6, 40)