Преобразование Строка даты даты верхозонов в UTC и обратно в Python

Я разбираю находящуюся на национальную службу погоды, питающуюся в веб-приложении. Я хотел бы очистить оповещения, когда они поражают их время истечения. Я также хотел бы отобразить время истечения срока действия в местном формате времени для географической области, к которой они относятся.

Оповещения охватывают все США, поэтому, я думаю, что лучший подход для хранения и сравнения времен в 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

Может кто-нибудь помочь мне найти мою ошибку? Я не уверен, это проблема сбережения дневного света? Я наткнулся на некоторые вещи, которые ведут мне, чтобы поверить, что это может попытаться локализовать мои даты и времена, но в этот момент я довольно ошеломлен. Я надеялся сделать все эти расчеты / сравнения в словезоне-агностическую способ.

9
задан Scott 19 September 2011 в 01:39
поделиться