Как мы можем найти возможные имена часовых поясов, соответствующие аббревиатуре часового пояса?

Учитывая аббревиатуру часового пояса, есть ли способ получить список возможных< /em> часовые пояса?

Например, IST может означать одно из следующего:

  • Азия/Калькутта (Индия)
  • Азия/Тель-Авив (Израиль)
  • Европа/Дублин (Ирландия)

Я искал способ получить ['Asia/Kolkata', 'Asia/Tel_Aviv', 'Europe/Dublin'] в качестве вывода, когда 'IST' задается в качестве ввода.

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

Вдохновленный этим ответом, я сделал

from datetime import datetime as dt                                                                                                      
import zoneinfo                                                                                                                 
s = zoneinfo.available_timezones()                                                                                                              
d = dict()                                                                                                                               
for tz in s:                                                                                                                             
    t = z.ZoneInfo(tz).tzname(dt.utcnow())                                                                                                                                                                                                                          
    if t not in d:                                                                                                                       
        d[t] = [tz]                                                                                                                      
    else:                                                                                                                                
        d[t].append(tz)                                                                                                                  

Но это дает «PDT» как

 'PDT': ['America/Ensenada',                                                                                                             
         'America/Santa_Isabel',                                                                                                         
         'Mexico/BajaNorte',                                                                                                             
         'US/Pacific-New',                                                                                                               
         'US/Pacific',                                                                                                                   
         'America/Vancouver',                                                                                                            
         'PST8PDT',                                                                                                                      
         'America/Tijuana',                                                                                                              
         'America/Los_Angeles',

и "PST" как раз

 'PST': ['Asia/Manila'], 

Но разве «Америка/Лос-Анджелес» в какой-то момент не попадет под «PST» (не сейчас, а позже).

Я явно что-то упустил, но не мог понять, что это такое..

                                                                                                            Can there be a way to get the list of possible timezones from a time zone abbreviation?

person J...S    schedule 21.06.2021    source источник
comment
для данного географического часового пояса в течение многих лет могут применяться разные смещения UTC из-за того, что летнее время активно или неактивно. Таким образом, использование datetime.now() (кстати, не нужно использовать utcnow) дает вы только часть полной картины.   -  person MrFuppes    schedule 21.06.2021


Ответы (1)


расширяя связанный ответ, в своего рода наивном подходе вы можете создать свою справочную таблицу для определенного года, например

from collections import defaultdict
from datetime import datetime, timedelta
import zoneinfo

year = 2021
checkdays = [datetime(year, 1, 1) + timedelta(i) for i in range(0, 365, 5)]

abbreviationmap = defaultdict(set)

for d in checkdays:
    for z in zoneinfo.available_timezones():
        abbreviationmap[zoneinfo.ZoneInfo(z).tzname(d)].add(z)
        
print(sorted(abbreviationmap['PDT']))
# ['America/Ensenada', 'America/Los_Angeles', 'America/Santa_Isabel', 
#  'America/Tijuana', 'America/Vancouver', 'Canada/Pacific', 'Mexico/BajaNorte', 
#  'PST8PDT', 'US/Pacific']
person MrFuppes    schedule 21.06.2021