Я анализирую ленту оповещений Национальной службы погоды в веб-приложении. Я хотел бы удалить оповещения, когда они истекают. Я также хотел бы отобразить срок действия в формате местного времени для географической области, к которой они относятся.
Предупреждения охватывают всю территорию США, поэтому я думаю, что лучший способ - хранить и сравнивать время в метках времени UTC. Время истечения поступает в ленту в виде строки, подобной этой: 2011-09-09T22:12:00-04:00
.
Я использую пакет Labix dateutils для анализа строки с учетом часового пояса:
>>> from dateutil.parser import parse
>>> d = parse("2011-09-18T15:52:00-04:00")
>>> d
datetime.datetime(2011, 9, 18, 15, 52, tzinfo=tzoffset(None, -14400))
Я также могу зафиксировать смещение UTC в часах:
>>> offset_hours = (d.utcoffset().days * 86400 + d.utcoffset().seconds) / 3600
>>> offset_hours
-4
Используя методы datetime.utctimetuple()
и time.mktime()
, я могу преобразовать проанализированную дату в метку времени UTC:
>>> import time
>>> expiration_utc_ts = time.mktime(d.utctimetuple())
>>> expiration_utc_ts
1316393520.0
На данный момент, я чувствую себя довольно хорошо, что я могу преобразовать необработанные строки во временную метку, представляющую время истечения в UTC. Я могу сравнить текущее время как метку времени UTC с истечением срока действия и определить, нужно ли его очищать:
>>> now_utc_ts = time.mktime(time.gmtime())
>>> now_utc_ts
1316398744.0
>>> now_utc_ts >= expiration_tc_ts
True
Трудность, с которой я столкнулся, заключается в попытке преобразовать мою сохраненную временную метку UTC обратно в исходный локализованный формат. У меня есть часы смещения, сохраненные из исходного преобразования, и строка, которую я проанализировал для хранения метки часового пояса:
>>> print offset_hours
-4
>>> print timezone
EDT
Я бы хотел преобразовать временную метку UTC обратно в локально отформатированное время, но преобразование ее обратно в datetime
, похоже, не работает:
>>> import datetime
>>> datetime.datetime.fromtimestamp(expiration_utc_ts) + datetime.timedelta(hours=offset_hours)
datetime.datetime(2011, 9, 18, 16, 52) # The hour is 16 but it should be 15
Похоже, он выключен на час. Я не уверен, где ошибка была введена? Я собрал другой тест и получил похожие результаты:
>>> # Running this at 21:29pm EDT
>>> utc_now = datetime.datetime.utcnow()
>>> utc_now_ts = time.mktime(right_now.utctimetuple())
>>> datetime.datetime.fromtimestamp(utc_now_ts)
datetime.datetime(2011, 9, 18, 22, 29, 47) # Off by 1 hour
Может ли кто-нибудь помочь мне найти мою ошибку? Я не уверен, что это проблема летнего времени? Я столкнулся с некоторыми вещами, которые заставляют меня поверить, что это может быть попытка локализовать мои даты и время, но на данный момент я довольно озадачен. Я надеялся провести все эти вычисления / сравнения в зависимости от часового пояса.