Вземете всички налични часови зони

В момента работя върху приложение, което трябва да поддържа множество часови зони.

За това използвам библиотеката dateutil. Сега имам нужда от начин да представя на потребителя списък с всички налични часови зони, поддържани от библиотеката dateutil.

Също така, препоръчително ли е да съхранявате tz като низове в базата данни като "Европа/Берлин"?


person Vincent    schedule 16.03.2013    source източник
comment
pytz.all_timezones дава списък с имена на часови зони, които могат да се използват с pytz. Понякога преобразуването на часови зони с dateutil и pytz може да доведе до различни резултати.   -  person jfs    schedule 17.03.2013
comment
Може да помислите за инструмент за избор на часова зона, базиран на карта, вместо списък. Ето един за JavaScript. Ако не пишете уеб приложение, сигурен съм, че някъде има родна контрола на Python, която е подобна, но не знам за такава.   -  person Matt Johnson-Pint    schedule 13.04.2013


Отговори (2)


dateutil ще използва информацията за часовата зона на ОС, но също така носи собствен компресиран файл с информация за часовата зона.

Можете да изброите наличните имена от кода на помощната програма, който зарежда тези данни:

from dateutil.zoneinfo import get_zonefile_instance
zonenames = list(get_zonefile_instance().zones)

Ще трябва да сортирате и филтрирате малко този списък; в този списък има както съкратени (3 букви) кодове на часови зони, така и записи за "регион/град".

Съхраняването на тези имена в база данни е добре.

Имайте предвид, че това зарежда всички данни в паметта; ако това не е желателно, трябва сами да заредите tar файла:

import os
import tarfile
import dateutil.zoneinfo

zi_path = os.path.abspath(os.path.dirname(dateutil.zoneinfo.__file__))
zonesfile = tarfile.TarFile.open(
    os.path.join(zi_path, dateutil.zoneinfo.ZONEFILENAME))
zonenames = [zn.name for zn in zonesfile.getmembers()
             if not zn.isdir() and zn.name != dateutil.zoneinfo.METADATA_FN]
person Martijn Pieters    schedule 16.03.2013
comment
За dateutil 2.6.0 файлът TAR има различно име на файл: dateutil-zoneinfo.tar.gz. - person Kurt Peek; 27.02.2017
comment
@KurtPeek: благодаря; кодът вече включва по-лесен за достъп помощен код за директно зареждане на тези данни, като се избягва необходимостта от твърдо кодиране на името на файла. - person Martijn Pieters; 27.02.2017

За dateutil:

from dateutil.zoneinfo import getzoneinfofile_stream, ZoneInfoFile
ZoneInfoFile(getzoneinfofile_stream()).zones.keys()
>>> ['Asia/Ujung_Pandang',
     'America/Porto_Velho',
     'America/La_Paz',
     'America/Caracas',
     'Europe/Malta',
     'Etc/GMT-13',
     'Atlantic/Bermuda',
     ...]

pytz е малко по-лесно

import pytz
pytz.all_timezones
>>> ['Africa/Abidjan',
     'Africa/Accra',
     'Africa/Addis_Ababa',
     'Africa/Algiers',
     'Africa/Asmara',
     'Africa/Asmera',
     'Africa/Bamako',
     'Africa/Bangui',
     'Africa/Banjul',
     'Africa/Bissau',
     'Africa/Blantyre',
     'Africa/Brazzaville',
     ...]

Имайте предвид, че dateutil предпочита да използва операционната система, за да определи информацията за часовата зона. pytz използва свои собствени зонови файлове. Въпреки че вероятно има предимства за всеки, pytz осигурява повече последователност, ако не искате да управлявате часови зони на системно ниво.

person Stephen Fuhry    schedule 21.09.2016