Я разбираю находящуюся на национальную службу погоды, питающуюся в веб-приложении. Я хотел бы очистить оповещения, когда они поражают их время истечения. Я также хотел бы отобразить время истечения срока действия в местном формате времени для географической области, к которой они относятся.
Оповещения охватывают все США, поэтому, я думаю, что лучший подход для хранения и сравнения времен в Timestams UTC. Время истечения прибытия в кормах как строка, как это: 2011-09-09T22: 12: 00-04: 00
.
Я использую пакет PackageutiLs PackageutiLS , чтобы проанализировать строку в манере часовой зоны:
>>> 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
, используя TATETIME.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
Трудность, которую я испытывающую попытку преобразовать свой хранилище Timestamp UTC обратно в исходный локальный формат. У меня есть часы смещения, хранящиеся из оригинального преобразования и строки, которую я проанализировал, чтобы сохранить метку TimeZone:
>>> print offset_hours
-4
>>> print timezone
EDT
Я хотел бы преобразовать временную компанию UTC обратно в локально отформатированное время, но преобразование его обратно в
, похоже, не работает:
>>> 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
Может кто-нибудь помочь мне найти мою ошибку? Я не уверен, это проблема сбережения дневного света? Я наткнулся на некоторые вещи, которые ведут мне, чтобы поверить, что это может попытаться локализовать мои даты и времена, но в этот момент я довольно ошеломлен. Я надеялся сделать все эти расчеты / сравнения в словезоне-агностическую способ.