2015-05-09 3 views
0

У меня есть функция, которая возвращает список городов + ихняя UTC смещаетPytz правильного смещения часовых поясов с дневным светом

NOW = datetime.datetime.utcnow() 
ZERO = datetime.timedelta(0) 

result_list = {} 

allowed_city = ['Europe/London', 'Europe/Amsterdam', 'Europe/Helsinki', 'Europe/Moscow', 
'Asia/Yekaterinburg', 'Asia/Novosibirsk', 'Asia/Shanghai', 'Asia/Tokyo'] 

for tname in allowed_city: 
    tzone = pytz.timezone(tname) 
    std_date = None 
    try: 
     for utcdate, info in zip(
       tzone._utc_transition_times, tzone._transition_info): 
      utcoffset, dstoffset, tzname = info 
      if dstoffset == ZERO: 
       std_date = utcdate 
      if utcdate > NOW: 
       break 
    except AttributeError: 
     std_date = NOW 
    std_date = tzone.localize(std_date) 

    key = std_date.strftime('%z') 

    result_list[tname] = "%s UTC %s" % (key, tname) 

и упорядочена по смещениям:

collections.OrderedDict(sorted(result_list.items(), key=lambda x: x[1])) 

И получить следующий список:

+0000 UTC Europe/London 
+0200 UTC Europe/Amsterdam 
... 
+0900 UTC Asia/Shanghai 
+1000 UTC Asia/Tokyo 

Но, к примеру, Шанхай UTC/GMT +8 часов. Это что-то с дневным светом или где проблема? Как я могу вернуть правильный список часовых поясов в зависимости от дневного света?

ответ

2

Неправильно пропускать время в UTC до tzone.localize(), если только tzone - UTC. Вместо этого используйте tzone.fromutc(std_date).