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

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

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

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

Я в состоянии почти сделать 2. (используя библиотеку Python Datetime), как это:

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, которое не учитывает високосных секунд, то преобразование может быть выполнено следующим образом:

Часть 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
Другие вопросы по тегам