Преобразование даты и времени Python и utc без учета часового пояса/летнего времени

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

  • У меня есть отметка времени UNIX в UTC, скажем, например, 1425508527. Из этого я хочу получить год, месяц, день и т.д., учитывая смещение по UTC. НАПРИМЕР. какой год/месяц/день/время (UTC -6 часов)? Ответ 4 марта 2015 года в 16:35:27. Без предоставления смещения (или смещения нуля) ответ должен быть 4 марта 2015 года в 22:35:27.

  • Теперь у меня есть дата в каком-то месте, а также смещение UTC. Например, 4 марта 2015 года в 16:35:27 и смещение (UTC -6 часов). Временная метка UTC UNIX, которую я должен получить, должна быть 1425508527.

Я могу почти сделать 2. (используя библиотеку datetime python) следующим образом:

import datetime.datetime as datetime
import time
import dateutil.tz as tz

utc_offset = 6
time.mktime(datetime(2015,3,4,16,35,27,
                     tzinfo=tz.tzoffset(None, utc_offset*60*60)).utctimetuple())
# => 1425486927

Проблема с вышеизложенным заключается в том, что utc_offset должен быть присвоен неверный знак. Согласно этой карте, utc_offset должен быть установлен на -6. Номер 1. Мне не повезло. Мне не нужно/нужно иметь дело с информацией о часовом поясе, например, летнее время. Как реализовать это в Python?

Ответ 1

Если ваша система использует Unix time, которая не учитывает секунды прыжка, тогда преобразование может быть выполнено следующим образом:

Часть 1: временная метка и смещение к локальной дате

import datetime as DT
import calendar

timestamp = 1425508527
offset = -6

date = DT.datetime(1970,1,1) + DT.timedelta(seconds=timestamp)
print(date)
# 2015-03-04 22:35:27

localdate = date + DT.timedelta(hours=offset)
print(localdate)
# 2015-03-04 16:35:27

Часть 2: локальная дата и смещение к отметке времени

utcdate = localdate - DT.timedelta(hours=offset)
assert date == utcdate

timetuple = utcdate.utctimetuple()
timestamp2 = calendar.timegm(timetuple)
print(timestamp2)
# 1425508527
assert timestamp == timestamp2