__init__.py 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543
  1. '''
  2. datetime.tzinfo timezone definitions generated from the
  3. Olson timezone database:
  4. ftp://elsie.nci.nih.gov/pub/tz*.tar.gz
  5. See the datetime section of the Python Library Reference for information
  6. on how to use these modules.
  7. '''
  8. # The IANA (nee Olson) database is updated several times a year.
  9. OLSON_VERSION = '2017c'
  10. VERSION = '2017.3' # Switching to pip compatible version numbering.
  11. __version__ = VERSION
  12. OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling
  13. __all__ = [
  14. 'timezone', 'utc', 'country_timezones', 'country_names',
  15. 'AmbiguousTimeError', 'InvalidTimeError',
  16. 'NonExistentTimeError', 'UnknownTimeZoneError',
  17. 'all_timezones', 'all_timezones_set',
  18. 'common_timezones', 'common_timezones_set',
  19. ]
  20. import sys, datetime, os.path, gettext
  21. from pytz.exceptions import AmbiguousTimeError
  22. from pytz.exceptions import InvalidTimeError
  23. from pytz.exceptions import NonExistentTimeError
  24. from pytz.exceptions import UnknownTimeZoneError
  25. from pytz.lazy import LazyDict, LazyList, LazySet
  26. from pytz.tzinfo import unpickler
  27. from pytz.tzfile import build_tzinfo, _byte_string
  28. try:
  29. unicode
  30. except NameError: # Python 3.x
  31. # Python 3.x doesn't have unicode(), making writing code
  32. # for Python 2.3 and Python 3.x a pain.
  33. unicode = str
  34. def ascii(s):
  35. r"""
  36. >>> ascii('Hello')
  37. 'Hello'
  38. >>> ascii('\N{TRADE MARK SIGN}') #doctest: +IGNORE_EXCEPTION_DETAIL
  39. Traceback (most recent call last):
  40. ...
  41. UnicodeEncodeError: ...
  42. """
  43. if type(s) == bytes:
  44. s = s.decode('ASCII')
  45. else:
  46. s.encode('ASCII') # Raise an exception if not ASCII
  47. return s # But the string - not a byte string.
  48. else: # Python 2.x
  49. def ascii(s):
  50. r"""
  51. >>> ascii('Hello')
  52. 'Hello'
  53. >>> ascii(u'Hello')
  54. 'Hello'
  55. >>> ascii(u'\N{TRADE MARK SIGN}') #doctest: +IGNORE_EXCEPTION_DETAIL
  56. Traceback (most recent call last):
  57. ...
  58. UnicodeEncodeError: ...
  59. """
  60. return s.encode('ASCII')
  61. def open_resource(name):
  62. """Open a resource from the zoneinfo subdir for reading.
  63. Uses the pkg_resources module if available and no standard file
  64. found at the calculated location.
  65. It is possible to specify different location for zoneinfo
  66. subdir by using the PYTZ_TZDATADIR environment variable.
  67. """
  68. name_parts = name.lstrip('/').split('/')
  69. for part in name_parts:
  70. if part == os.path.pardir or os.path.sep in part:
  71. raise ValueError('Bad path segment: %r' % part)
  72. zoneinfo_dir = os.environ.get('PYTZ_TZDATADIR', None)
  73. if zoneinfo_dir != None:
  74. filename = os.path.join(zoneinfo_dir, *name_parts)
  75. else:
  76. filename = os.path.join(os.path.dirname(__file__),
  77. 'zoneinfo', *name_parts)
  78. if not os.path.exists(filename):
  79. # http://bugs.launchpad.net/bugs/383171 - we avoid using this
  80. # unless absolutely necessary to help when a broken version of
  81. # pkg_resources is installed.
  82. try:
  83. from pkg_resources import resource_stream
  84. except ImportError:
  85. resource_stream = None
  86. if resource_stream is not None:
  87. return resource_stream(__name__, 'zoneinfo/' + name)
  88. return open(filename, 'rb')
  89. def resource_exists(name):
  90. """Return true if the given resource exists"""
  91. try:
  92. open_resource(name).close()
  93. return True
  94. except IOError:
  95. return False
  96. # Enable this when we get some translations?
  97. # We want an i18n API that is useful to programs using Python's gettext
  98. # module, as well as the Zope3 i18n package. Perhaps we should just provide
  99. # the POT file and translations, and leave it up to callers to make use
  100. # of them.
  101. #
  102. # t = gettext.translation(
  103. # 'pytz', os.path.join(os.path.dirname(__file__), 'locales'),
  104. # fallback=True
  105. # )
  106. # def _(timezone_name):
  107. # """Translate a timezone name using the current locale, returning Unicode"""
  108. # return t.ugettext(timezone_name)
  109. _tzinfo_cache = {}
  110. def timezone(zone):
  111. r''' Return a datetime.tzinfo implementation for the given timezone
  112. >>> from datetime import datetime, timedelta
  113. >>> utc = timezone('UTC')
  114. >>> eastern = timezone('US/Eastern')
  115. >>> eastern.zone
  116. 'US/Eastern'
  117. >>> timezone(unicode('US/Eastern')) is eastern
  118. True
  119. >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
  120. >>> loc_dt = utc_dt.astimezone(eastern)
  121. >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
  122. >>> loc_dt.strftime(fmt)
  123. '2002-10-27 01:00:00 EST (-0500)'
  124. >>> (loc_dt - timedelta(minutes=10)).strftime(fmt)
  125. '2002-10-27 00:50:00 EST (-0500)'
  126. >>> eastern.normalize(loc_dt - timedelta(minutes=10)).strftime(fmt)
  127. '2002-10-27 01:50:00 EDT (-0400)'
  128. >>> (loc_dt + timedelta(minutes=10)).strftime(fmt)
  129. '2002-10-27 01:10:00 EST (-0500)'
  130. Raises UnknownTimeZoneError if passed an unknown zone.
  131. >>> try:
  132. ... timezone('Asia/Shangri-La')
  133. ... except UnknownTimeZoneError:
  134. ... print('Unknown')
  135. Unknown
  136. >>> try:
  137. ... timezone(unicode('\N{TRADE MARK SIGN}'))
  138. ... except UnknownTimeZoneError:
  139. ... print('Unknown')
  140. Unknown
  141. '''
  142. if zone.upper() == 'UTC':
  143. return utc
  144. try:
  145. zone = ascii(zone)
  146. except UnicodeEncodeError:
  147. # All valid timezones are ASCII
  148. raise UnknownTimeZoneError(zone)
  149. zone = _unmunge_zone(zone)
  150. if zone not in _tzinfo_cache:
  151. if zone in all_timezones_set:
  152. fp = open_resource(zone)
  153. try:
  154. _tzinfo_cache[zone] = build_tzinfo(zone, fp)
  155. finally:
  156. fp.close()
  157. else:
  158. raise UnknownTimeZoneError(zone)
  159. return _tzinfo_cache[zone]
  160. def _unmunge_zone(zone):
  161. """Undo the time zone name munging done by older versions of pytz."""
  162. return zone.replace('_plus_', '+').replace('_minus_', '-')
  163. ZERO = datetime.timedelta(0)
  164. HOUR = datetime.timedelta(hours=1)
  165. class UTC(datetime.tzinfo):
  166. """UTC
  167. Optimized UTC implementation. It unpickles using the single module global
  168. instance defined beneath this class declaration.
  169. """
  170. zone = "UTC"
  171. _utcoffset = ZERO
  172. _dst = ZERO
  173. _tzname = zone
  174. def fromutc(self, dt):
  175. if dt.tzinfo is None:
  176. return self.localize(dt)
  177. return super(utc.__class__, self).fromutc(dt)
  178. def utcoffset(self, dt):
  179. return ZERO
  180. def tzname(self, dt):
  181. return "UTC"
  182. def dst(self, dt):
  183. return ZERO
  184. def __reduce__(self):
  185. return _UTC, ()
  186. def localize(self, dt, is_dst=False):
  187. '''Convert naive time to local time'''
  188. if dt.tzinfo is not None:
  189. raise ValueError('Not naive datetime (tzinfo is already set)')
  190. return dt.replace(tzinfo=self)
  191. def normalize(self, dt, is_dst=False):
  192. '''Correct the timezone information on the given datetime'''
  193. if dt.tzinfo is self:
  194. return dt
  195. if dt.tzinfo is None:
  196. raise ValueError('Naive time - no tzinfo set')
  197. return dt.astimezone(self)
  198. def __repr__(self):
  199. return "<UTC>"
  200. def __str__(self):
  201. return "UTC"
  202. UTC = utc = UTC() # UTC is a singleton
  203. def _UTC():
  204. """Factory function for utc unpickling.
  205. Makes sure that unpickling a utc instance always returns the same
  206. module global.
  207. These examples belong in the UTC class above, but it is obscured; or in
  208. the README.txt, but we are not depending on Python 2.4 so integrating
  209. the README.txt examples with the unit tests is not trivial.
  210. >>> import datetime, pickle
  211. >>> dt = datetime.datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
  212. >>> naive = dt.replace(tzinfo=None)
  213. >>> p = pickle.dumps(dt, 1)
  214. >>> naive_p = pickle.dumps(naive, 1)
  215. >>> len(p) - len(naive_p)
  216. 17
  217. >>> new = pickle.loads(p)
  218. >>> new == dt
  219. True
  220. >>> new is dt
  221. False
  222. >>> new.tzinfo is dt.tzinfo
  223. True
  224. >>> utc is UTC is timezone('UTC')
  225. True
  226. >>> utc is timezone('GMT')
  227. False
  228. """
  229. return utc
  230. _UTC.__safe_for_unpickling__ = True
  231. def _p(*args):
  232. """Factory function for unpickling pytz tzinfo instances.
  233. Just a wrapper around tzinfo.unpickler to save a few bytes in each pickle
  234. by shortening the path.
  235. """
  236. return unpickler(*args)
  237. _p.__safe_for_unpickling__ = True
  238. class _CountryTimezoneDict(LazyDict):
  239. """Map ISO 3166 country code to a list of timezone names commonly used
  240. in that country.
  241. iso3166_code is the two letter code used to identify the country.
  242. >>> def print_list(list_of_strings):
  243. ... 'We use a helper so doctests work under Python 2.3 -> 3.x'
  244. ... for s in list_of_strings:
  245. ... print(s)
  246. >>> print_list(country_timezones['nz'])
  247. Pacific/Auckland
  248. Pacific/Chatham
  249. >>> print_list(country_timezones['ch'])
  250. Europe/Zurich
  251. >>> print_list(country_timezones['CH'])
  252. Europe/Zurich
  253. >>> print_list(country_timezones[unicode('ch')])
  254. Europe/Zurich
  255. >>> print_list(country_timezones['XXX'])
  256. Traceback (most recent call last):
  257. ...
  258. KeyError: 'XXX'
  259. Previously, this information was exposed as a function rather than a
  260. dictionary. This is still supported::
  261. >>> print_list(country_timezones('nz'))
  262. Pacific/Auckland
  263. Pacific/Chatham
  264. """
  265. def __call__(self, iso3166_code):
  266. """Backwards compatibility."""
  267. return self[iso3166_code]
  268. def _fill(self):
  269. data = {}
  270. zone_tab = open_resource('zone.tab')
  271. try:
  272. for line in zone_tab:
  273. line = line.decode('UTF-8')
  274. if line.startswith('#'):
  275. continue
  276. code, coordinates, zone = line.split(None, 4)[:3]
  277. if zone not in all_timezones_set:
  278. continue
  279. try:
  280. data[code].append(zone)
  281. except KeyError:
  282. data[code] = [zone]
  283. self.data = data
  284. finally:
  285. zone_tab.close()
  286. country_timezones = _CountryTimezoneDict()
  287. class _CountryNameDict(LazyDict):
  288. '''Dictionary proving ISO3166 code -> English name.
  289. >>> print(country_names['au'])
  290. Australia
  291. '''
  292. def _fill(self):
  293. data = {}
  294. zone_tab = open_resource('iso3166.tab')
  295. try:
  296. for line in zone_tab.readlines():
  297. line = line.decode('UTF-8')
  298. if line.startswith('#'):
  299. continue
  300. code, name = line.split(None, 1)
  301. data[code] = name.strip()
  302. self.data = data
  303. finally:
  304. zone_tab.close()
  305. country_names = _CountryNameDict()
  306. # Time-zone info based solely on fixed offsets
  307. class _FixedOffset(datetime.tzinfo):
  308. zone = None # to match the standard pytz API
  309. def __init__(self, minutes):
  310. if abs(minutes) >= 1440:
  311. raise ValueError("absolute offset is too large", minutes)
  312. self._minutes = minutes
  313. self._offset = datetime.timedelta(minutes=minutes)
  314. def utcoffset(self, dt):
  315. return self._offset
  316. def __reduce__(self):
  317. return FixedOffset, (self._minutes, )
  318. def dst(self, dt):
  319. return ZERO
  320. def tzname(self, dt):
  321. return None
  322. def __repr__(self):
  323. return 'pytz.FixedOffset(%d)' % self._minutes
  324. def localize(self, dt, is_dst=False):
  325. '''Convert naive time to local time'''
  326. if dt.tzinfo is not None:
  327. raise ValueError('Not naive datetime (tzinfo is already set)')
  328. return dt.replace(tzinfo=self)
  329. def normalize(self, dt, is_dst=False):
  330. '''Correct the timezone information on the given datetime'''
  331. if dt.tzinfo is self:
  332. return dt
  333. if dt.tzinfo is None:
  334. raise ValueError('Naive time - no tzinfo set')
  335. return dt.astimezone(self)
  336. def FixedOffset(offset, _tzinfos = {}):
  337. """return a fixed-offset timezone based off a number of minutes.
  338. >>> one = FixedOffset(-330)
  339. >>> one
  340. pytz.FixedOffset(-330)
  341. >>> one.utcoffset(datetime.datetime.now())
  342. datetime.timedelta(-1, 66600)
  343. >>> one.dst(datetime.datetime.now())
  344. datetime.timedelta(0)
  345. >>> two = FixedOffset(1380)
  346. >>> two
  347. pytz.FixedOffset(1380)
  348. >>> two.utcoffset(datetime.datetime.now())
  349. datetime.timedelta(0, 82800)
  350. >>> two.dst(datetime.datetime.now())
  351. datetime.timedelta(0)
  352. The datetime.timedelta must be between the range of -1 and 1 day,
  353. non-inclusive.
  354. >>> FixedOffset(1440)
  355. Traceback (most recent call last):
  356. ...
  357. ValueError: ('absolute offset is too large', 1440)
  358. >>> FixedOffset(-1440)
  359. Traceback (most recent call last):
  360. ...
  361. ValueError: ('absolute offset is too large', -1440)
  362. An offset of 0 is special-cased to return UTC.
  363. >>> FixedOffset(0) is UTC
  364. True
  365. There should always be only one instance of a FixedOffset per timedelta.
  366. This should be true for multiple creation calls.
  367. >>> FixedOffset(-330) is one
  368. True
  369. >>> FixedOffset(1380) is two
  370. True
  371. It should also be true for pickling.
  372. >>> import pickle
  373. >>> pickle.loads(pickle.dumps(one)) is one
  374. True
  375. >>> pickle.loads(pickle.dumps(two)) is two
  376. True
  377. """
  378. if offset == 0:
  379. return UTC
  380. info = _tzinfos.get(offset)
  381. if info is None:
  382. # We haven't seen this one before. we need to save it.
  383. # Use setdefault to avoid a race condition and make sure we have
  384. # only one
  385. info = _tzinfos.setdefault(offset, _FixedOffset(offset))
  386. return info
  387. FixedOffset.__safe_for_unpickling__ = True
  388. def _test():
  389. import doctest, os, sys
  390. sys.path.insert(0, os.pardir)
  391. import pytz
  392. return doctest.testmod(pytz)
  393. if __name__ == '__main__':
  394. _test()
  395. all_timezones = \
  396. ['Africa/Abidjan',
  397. 'Africa/Accra',
  398. 'Africa/Addis_Ababa',
  399. 'Africa/Algiers',
  400. 'Africa/Asmara',
  401. 'Africa/Asmera',
  402. 'Africa/Bamako',
  403. 'Africa/Bangui',
  404. 'Africa/Banjul',
  405. 'Africa/Bissau',
  406. 'Africa/Blantyre',
  407. 'Africa/Brazzaville',
  408. 'Africa/Bujumbura',
  409. 'Africa/Cairo',
  410. 'Africa/Casablanca',
  411. 'Africa/Ceuta',
  412. 'Africa/Conakry',
  413. 'Africa/Dakar',
  414. 'Africa/Dar_es_Salaam',
  415. 'Africa/Djibouti',
  416. 'Africa/Douala',
  417. 'Africa/El_Aaiun',
  418. 'Africa/Freetown',
  419. 'Africa/Gaborone',
  420. 'Africa/Harare',
  421. 'Africa/Johannesburg',
  422. 'Africa/Juba',
  423. 'Africa/Kampala',
  424. 'Africa/Khartoum',
  425. 'Africa/Kigali',
  426. 'Africa/Kinshasa',
  427. 'Africa/Lagos',
  428. 'Africa/Libreville',
  429. 'Africa/Lome',
  430. 'Africa/Luanda',
  431. 'Africa/Lubumbashi',
  432. 'Africa/Lusaka',
  433. 'Africa/Malabo',
  434. 'Africa/Maputo',
  435. 'Africa/Maseru',
  436. 'Africa/Mbabane',
  437. 'Africa/Mogadishu',
  438. 'Africa/Monrovia',
  439. 'Africa/Nairobi',
  440. 'Africa/Ndjamena',
  441. 'Africa/Niamey',
  442. 'Africa/Nouakchott',
  443. 'Africa/Ouagadougou',
  444. 'Africa/Porto-Novo',
  445. 'Africa/Sao_Tome',
  446. 'Africa/Timbuktu',
  447. 'Africa/Tripoli',
  448. 'Africa/Tunis',
  449. 'Africa/Windhoek',
  450. 'America/Adak',
  451. 'America/Anchorage',
  452. 'America/Anguilla',
  453. 'America/Antigua',
  454. 'America/Araguaina',
  455. 'America/Argentina/Buenos_Aires',
  456. 'America/Argentina/Catamarca',
  457. 'America/Argentina/ComodRivadavia',
  458. 'America/Argentina/Cordoba',
  459. 'America/Argentina/Jujuy',
  460. 'America/Argentina/La_Rioja',
  461. 'America/Argentina/Mendoza',
  462. 'America/Argentina/Rio_Gallegos',
  463. 'America/Argentina/Salta',
  464. 'America/Argentina/San_Juan',
  465. 'America/Argentina/San_Luis',
  466. 'America/Argentina/Tucuman',
  467. 'America/Argentina/Ushuaia',
  468. 'America/Aruba',
  469. 'America/Asuncion',
  470. 'America/Atikokan',
  471. 'America/Atka',
  472. 'America/Bahia',
  473. 'America/Bahia_Banderas',
  474. 'America/Barbados',
  475. 'America/Belem',
  476. 'America/Belize',
  477. 'America/Blanc-Sablon',
  478. 'America/Boa_Vista',
  479. 'America/Bogota',
  480. 'America/Boise',
  481. 'America/Buenos_Aires',
  482. 'America/Cambridge_Bay',
  483. 'America/Campo_Grande',
  484. 'America/Cancun',
  485. 'America/Caracas',
  486. 'America/Catamarca',
  487. 'America/Cayenne',
  488. 'America/Cayman',
  489. 'America/Chicago',
  490. 'America/Chihuahua',
  491. 'America/Coral_Harbour',
  492. 'America/Cordoba',
  493. 'America/Costa_Rica',
  494. 'America/Creston',
  495. 'America/Cuiaba',
  496. 'America/Curacao',
  497. 'America/Danmarkshavn',
  498. 'America/Dawson',
  499. 'America/Dawson_Creek',
  500. 'America/Denver',
  501. 'America/Detroit',
  502. 'America/Dominica',
  503. 'America/Edmonton',
  504. 'America/Eirunepe',
  505. 'America/El_Salvador',
  506. 'America/Ensenada',
  507. 'America/Fort_Nelson',
  508. 'America/Fort_Wayne',
  509. 'America/Fortaleza',
  510. 'America/Glace_Bay',
  511. 'America/Godthab',
  512. 'America/Goose_Bay',
  513. 'America/Grand_Turk',
  514. 'America/Grenada',
  515. 'America/Guadeloupe',
  516. 'America/Guatemala',
  517. 'America/Guayaquil',
  518. 'America/Guyana',
  519. 'America/Halifax',
  520. 'America/Havana',
  521. 'America/Hermosillo',
  522. 'America/Indiana/Indianapolis',
  523. 'America/Indiana/Knox',
  524. 'America/Indiana/Marengo',
  525. 'America/Indiana/Petersburg',
  526. 'America/Indiana/Tell_City',
  527. 'America/Indiana/Vevay',
  528. 'America/Indiana/Vincennes',
  529. 'America/Indiana/Winamac',
  530. 'America/Indianapolis',
  531. 'America/Inuvik',
  532. 'America/Iqaluit',
  533. 'America/Jamaica',
  534. 'America/Jujuy',
  535. 'America/Juneau',
  536. 'America/Kentucky/Louisville',
  537. 'America/Kentucky/Monticello',
  538. 'America/Knox_IN',
  539. 'America/Kralendijk',
  540. 'America/La_Paz',
  541. 'America/Lima',
  542. 'America/Los_Angeles',
  543. 'America/Louisville',
  544. 'America/Lower_Princes',
  545. 'America/Maceio',
  546. 'America/Managua',
  547. 'America/Manaus',
  548. 'America/Marigot',
  549. 'America/Martinique',
  550. 'America/Matamoros',
  551. 'America/Mazatlan',
  552. 'America/Mendoza',
  553. 'America/Menominee',
  554. 'America/Merida',
  555. 'America/Metlakatla',
  556. 'America/Mexico_City',
  557. 'America/Miquelon',
  558. 'America/Moncton',
  559. 'America/Monterrey',
  560. 'America/Montevideo',
  561. 'America/Montreal',
  562. 'America/Montserrat',
  563. 'America/Nassau',
  564. 'America/New_York',
  565. 'America/Nipigon',
  566. 'America/Nome',
  567. 'America/Noronha',
  568. 'America/North_Dakota/Beulah',
  569. 'America/North_Dakota/Center',
  570. 'America/North_Dakota/New_Salem',
  571. 'America/Ojinaga',
  572. 'America/Panama',
  573. 'America/Pangnirtung',
  574. 'America/Paramaribo',
  575. 'America/Phoenix',
  576. 'America/Port-au-Prince',
  577. 'America/Port_of_Spain',
  578. 'America/Porto_Acre',
  579. 'America/Porto_Velho',
  580. 'America/Puerto_Rico',
  581. 'America/Punta_Arenas',
  582. 'America/Rainy_River',
  583. 'America/Rankin_Inlet',
  584. 'America/Recife',
  585. 'America/Regina',
  586. 'America/Resolute',
  587. 'America/Rio_Branco',
  588. 'America/Rosario',
  589. 'America/Santa_Isabel',
  590. 'America/Santarem',
  591. 'America/Santiago',
  592. 'America/Santo_Domingo',
  593. 'America/Sao_Paulo',
  594. 'America/Scoresbysund',
  595. 'America/Shiprock',
  596. 'America/Sitka',
  597. 'America/St_Barthelemy',
  598. 'America/St_Johns',
  599. 'America/St_Kitts',
  600. 'America/St_Lucia',
  601. 'America/St_Thomas',
  602. 'America/St_Vincent',
  603. 'America/Swift_Current',
  604. 'America/Tegucigalpa',
  605. 'America/Thule',
  606. 'America/Thunder_Bay',
  607. 'America/Tijuana',
  608. 'America/Toronto',
  609. 'America/Tortola',
  610. 'America/Vancouver',
  611. 'America/Virgin',
  612. 'America/Whitehorse',
  613. 'America/Winnipeg',
  614. 'America/Yakutat',
  615. 'America/Yellowknife',
  616. 'Antarctica/Casey',
  617. 'Antarctica/Davis',
  618. 'Antarctica/DumontDUrville',
  619. 'Antarctica/Macquarie',
  620. 'Antarctica/Mawson',
  621. 'Antarctica/McMurdo',
  622. 'Antarctica/Palmer',
  623. 'Antarctica/Rothera',
  624. 'Antarctica/South_Pole',
  625. 'Antarctica/Syowa',
  626. 'Antarctica/Troll',
  627. 'Antarctica/Vostok',
  628. 'Arctic/Longyearbyen',
  629. 'Asia/Aden',
  630. 'Asia/Almaty',
  631. 'Asia/Amman',
  632. 'Asia/Anadyr',
  633. 'Asia/Aqtau',
  634. 'Asia/Aqtobe',
  635. 'Asia/Ashgabat',
  636. 'Asia/Ashkhabad',
  637. 'Asia/Atyrau',
  638. 'Asia/Baghdad',
  639. 'Asia/Bahrain',
  640. 'Asia/Baku',
  641. 'Asia/Bangkok',
  642. 'Asia/Barnaul',
  643. 'Asia/Beirut',
  644. 'Asia/Bishkek',
  645. 'Asia/Brunei',
  646. 'Asia/Calcutta',
  647. 'Asia/Chita',
  648. 'Asia/Choibalsan',
  649. 'Asia/Chongqing',
  650. 'Asia/Chungking',
  651. 'Asia/Colombo',
  652. 'Asia/Dacca',
  653. 'Asia/Damascus',
  654. 'Asia/Dhaka',
  655. 'Asia/Dili',
  656. 'Asia/Dubai',
  657. 'Asia/Dushanbe',
  658. 'Asia/Famagusta',
  659. 'Asia/Gaza',
  660. 'Asia/Harbin',
  661. 'Asia/Hebron',
  662. 'Asia/Ho_Chi_Minh',
  663. 'Asia/Hong_Kong',
  664. 'Asia/Hovd',
  665. 'Asia/Irkutsk',
  666. 'Asia/Istanbul',
  667. 'Asia/Jakarta',
  668. 'Asia/Jayapura',
  669. 'Asia/Jerusalem',
  670. 'Asia/Kabul',
  671. 'Asia/Kamchatka',
  672. 'Asia/Karachi',
  673. 'Asia/Kashgar',
  674. 'Asia/Kathmandu',
  675. 'Asia/Katmandu',
  676. 'Asia/Khandyga',
  677. 'Asia/Kolkata',
  678. 'Asia/Krasnoyarsk',
  679. 'Asia/Kuala_Lumpur',
  680. 'Asia/Kuching',
  681. 'Asia/Kuwait',
  682. 'Asia/Macao',
  683. 'Asia/Macau',
  684. 'Asia/Magadan',
  685. 'Asia/Makassar',
  686. 'Asia/Manila',
  687. 'Asia/Muscat',
  688. 'Asia/Nicosia',
  689. 'Asia/Novokuznetsk',
  690. 'Asia/Novosibirsk',
  691. 'Asia/Omsk',
  692. 'Asia/Oral',
  693. 'Asia/Phnom_Penh',
  694. 'Asia/Pontianak',
  695. 'Asia/Pyongyang',
  696. 'Asia/Qatar',
  697. 'Asia/Qyzylorda',
  698. 'Asia/Rangoon',
  699. 'Asia/Riyadh',
  700. 'Asia/Saigon',
  701. 'Asia/Sakhalin',
  702. 'Asia/Samarkand',
  703. 'Asia/Seoul',
  704. 'Asia/Shanghai',
  705. 'Asia/Singapore',
  706. 'Asia/Srednekolymsk',
  707. 'Asia/Taipei',
  708. 'Asia/Tashkent',
  709. 'Asia/Tbilisi',
  710. 'Asia/Tehran',
  711. 'Asia/Tel_Aviv',
  712. 'Asia/Thimbu',
  713. 'Asia/Thimphu',
  714. 'Asia/Tokyo',
  715. 'Asia/Tomsk',
  716. 'Asia/Ujung_Pandang',
  717. 'Asia/Ulaanbaatar',
  718. 'Asia/Ulan_Bator',
  719. 'Asia/Urumqi',
  720. 'Asia/Ust-Nera',
  721. 'Asia/Vientiane',
  722. 'Asia/Vladivostok',
  723. 'Asia/Yakutsk',
  724. 'Asia/Yangon',
  725. 'Asia/Yekaterinburg',
  726. 'Asia/Yerevan',
  727. 'Atlantic/Azores',
  728. 'Atlantic/Bermuda',
  729. 'Atlantic/Canary',
  730. 'Atlantic/Cape_Verde',
  731. 'Atlantic/Faeroe',
  732. 'Atlantic/Faroe',
  733. 'Atlantic/Jan_Mayen',
  734. 'Atlantic/Madeira',
  735. 'Atlantic/Reykjavik',
  736. 'Atlantic/South_Georgia',
  737. 'Atlantic/St_Helena',
  738. 'Atlantic/Stanley',
  739. 'Australia/ACT',
  740. 'Australia/Adelaide',
  741. 'Australia/Brisbane',
  742. 'Australia/Broken_Hill',
  743. 'Australia/Canberra',
  744. 'Australia/Currie',
  745. 'Australia/Darwin',
  746. 'Australia/Eucla',
  747. 'Australia/Hobart',
  748. 'Australia/LHI',
  749. 'Australia/Lindeman',
  750. 'Australia/Lord_Howe',
  751. 'Australia/Melbourne',
  752. 'Australia/NSW',
  753. 'Australia/North',
  754. 'Australia/Perth',
  755. 'Australia/Queensland',
  756. 'Australia/South',
  757. 'Australia/Sydney',
  758. 'Australia/Tasmania',
  759. 'Australia/Victoria',
  760. 'Australia/West',
  761. 'Australia/Yancowinna',
  762. 'Brazil/Acre',
  763. 'Brazil/DeNoronha',
  764. 'Brazil/East',
  765. 'Brazil/West',
  766. 'CET',
  767. 'CST6CDT',
  768. 'Canada/Atlantic',
  769. 'Canada/Central',
  770. 'Canada/Eastern',
  771. 'Canada/Mountain',
  772. 'Canada/Newfoundland',
  773. 'Canada/Pacific',
  774. 'Canada/Saskatchewan',
  775. 'Canada/Yukon',
  776. 'Chile/Continental',
  777. 'Chile/EasterIsland',
  778. 'Cuba',
  779. 'EET',
  780. 'EST',
  781. 'EST5EDT',
  782. 'Egypt',
  783. 'Eire',
  784. 'Etc/GMT',
  785. 'Etc/GMT+0',
  786. 'Etc/GMT+1',
  787. 'Etc/GMT+10',
  788. 'Etc/GMT+11',
  789. 'Etc/GMT+12',
  790. 'Etc/GMT+2',
  791. 'Etc/GMT+3',
  792. 'Etc/GMT+4',
  793. 'Etc/GMT+5',
  794. 'Etc/GMT+6',
  795. 'Etc/GMT+7',
  796. 'Etc/GMT+8',
  797. 'Etc/GMT+9',
  798. 'Etc/GMT-0',
  799. 'Etc/GMT-1',
  800. 'Etc/GMT-10',
  801. 'Etc/GMT-11',
  802. 'Etc/GMT-12',
  803. 'Etc/GMT-13',
  804. 'Etc/GMT-14',
  805. 'Etc/GMT-2',
  806. 'Etc/GMT-3',
  807. 'Etc/GMT-4',
  808. 'Etc/GMT-5',
  809. 'Etc/GMT-6',
  810. 'Etc/GMT-7',
  811. 'Etc/GMT-8',
  812. 'Etc/GMT-9',
  813. 'Etc/GMT0',
  814. 'Etc/Greenwich',
  815. 'Etc/UCT',
  816. 'Etc/UTC',
  817. 'Etc/Universal',
  818. 'Etc/Zulu',
  819. 'Europe/Amsterdam',
  820. 'Europe/Andorra',
  821. 'Europe/Astrakhan',
  822. 'Europe/Athens',
  823. 'Europe/Belfast',
  824. 'Europe/Belgrade',
  825. 'Europe/Berlin',
  826. 'Europe/Bratislava',
  827. 'Europe/Brussels',
  828. 'Europe/Bucharest',
  829. 'Europe/Budapest',
  830. 'Europe/Busingen',
  831. 'Europe/Chisinau',
  832. 'Europe/Copenhagen',
  833. 'Europe/Dublin',
  834. 'Europe/Gibraltar',
  835. 'Europe/Guernsey',
  836. 'Europe/Helsinki',
  837. 'Europe/Isle_of_Man',
  838. 'Europe/Istanbul',
  839. 'Europe/Jersey',
  840. 'Europe/Kaliningrad',
  841. 'Europe/Kiev',
  842. 'Europe/Kirov',
  843. 'Europe/Lisbon',
  844. 'Europe/Ljubljana',
  845. 'Europe/London',
  846. 'Europe/Luxembourg',
  847. 'Europe/Madrid',
  848. 'Europe/Malta',
  849. 'Europe/Mariehamn',
  850. 'Europe/Minsk',
  851. 'Europe/Monaco',
  852. 'Europe/Moscow',
  853. 'Europe/Nicosia',
  854. 'Europe/Oslo',
  855. 'Europe/Paris',
  856. 'Europe/Podgorica',
  857. 'Europe/Prague',
  858. 'Europe/Riga',
  859. 'Europe/Rome',
  860. 'Europe/Samara',
  861. 'Europe/San_Marino',
  862. 'Europe/Sarajevo',
  863. 'Europe/Saratov',
  864. 'Europe/Simferopol',
  865. 'Europe/Skopje',
  866. 'Europe/Sofia',
  867. 'Europe/Stockholm',
  868. 'Europe/Tallinn',
  869. 'Europe/Tirane',
  870. 'Europe/Tiraspol',
  871. 'Europe/Ulyanovsk',
  872. 'Europe/Uzhgorod',
  873. 'Europe/Vaduz',
  874. 'Europe/Vatican',
  875. 'Europe/Vienna',
  876. 'Europe/Vilnius',
  877. 'Europe/Volgograd',
  878. 'Europe/Warsaw',
  879. 'Europe/Zagreb',
  880. 'Europe/Zaporozhye',
  881. 'Europe/Zurich',
  882. 'GB',
  883. 'GB-Eire',
  884. 'GMT',
  885. 'GMT+0',
  886. 'GMT-0',
  887. 'GMT0',
  888. 'Greenwich',
  889. 'HST',
  890. 'Hongkong',
  891. 'Iceland',
  892. 'Indian/Antananarivo',
  893. 'Indian/Chagos',
  894. 'Indian/Christmas',
  895. 'Indian/Cocos',
  896. 'Indian/Comoro',
  897. 'Indian/Kerguelen',
  898. 'Indian/Mahe',
  899. 'Indian/Maldives',
  900. 'Indian/Mauritius',
  901. 'Indian/Mayotte',
  902. 'Indian/Reunion',
  903. 'Iran',
  904. 'Israel',
  905. 'Jamaica',
  906. 'Japan',
  907. 'Kwajalein',
  908. 'Libya',
  909. 'MET',
  910. 'MST',
  911. 'MST7MDT',
  912. 'Mexico/BajaNorte',
  913. 'Mexico/BajaSur',
  914. 'Mexico/General',
  915. 'NZ',
  916. 'NZ-CHAT',
  917. 'Navajo',
  918. 'PRC',
  919. 'PST8PDT',
  920. 'Pacific/Apia',
  921. 'Pacific/Auckland',
  922. 'Pacific/Bougainville',
  923. 'Pacific/Chatham',
  924. 'Pacific/Chuuk',
  925. 'Pacific/Easter',
  926. 'Pacific/Efate',
  927. 'Pacific/Enderbury',
  928. 'Pacific/Fakaofo',
  929. 'Pacific/Fiji',
  930. 'Pacific/Funafuti',
  931. 'Pacific/Galapagos',
  932. 'Pacific/Gambier',
  933. 'Pacific/Guadalcanal',
  934. 'Pacific/Guam',
  935. 'Pacific/Honolulu',
  936. 'Pacific/Johnston',
  937. 'Pacific/Kiritimati',
  938. 'Pacific/Kosrae',
  939. 'Pacific/Kwajalein',
  940. 'Pacific/Majuro',
  941. 'Pacific/Marquesas',
  942. 'Pacific/Midway',
  943. 'Pacific/Nauru',
  944. 'Pacific/Niue',
  945. 'Pacific/Norfolk',
  946. 'Pacific/Noumea',
  947. 'Pacific/Pago_Pago',
  948. 'Pacific/Palau',
  949. 'Pacific/Pitcairn',
  950. 'Pacific/Pohnpei',
  951. 'Pacific/Ponape',
  952. 'Pacific/Port_Moresby',
  953. 'Pacific/Rarotonga',
  954. 'Pacific/Saipan',
  955. 'Pacific/Samoa',
  956. 'Pacific/Tahiti',
  957. 'Pacific/Tarawa',
  958. 'Pacific/Tongatapu',
  959. 'Pacific/Truk',
  960. 'Pacific/Wake',
  961. 'Pacific/Wallis',
  962. 'Pacific/Yap',
  963. 'Poland',
  964. 'Portugal',
  965. 'ROC',
  966. 'ROK',
  967. 'Singapore',
  968. 'Turkey',
  969. 'UCT',
  970. 'US/Alaska',
  971. 'US/Aleutian',
  972. 'US/Arizona',
  973. 'US/Central',
  974. 'US/East-Indiana',
  975. 'US/Eastern',
  976. 'US/Hawaii',
  977. 'US/Indiana-Starke',
  978. 'US/Michigan',
  979. 'US/Mountain',
  980. 'US/Pacific',
  981. 'US/Pacific-New',
  982. 'US/Samoa',
  983. 'UTC',
  984. 'Universal',
  985. 'W-SU',
  986. 'WET',
  987. 'Zulu']
  988. all_timezones = LazyList(
  989. tz for tz in all_timezones if resource_exists(tz))
  990. all_timezones_set = LazySet(all_timezones)
  991. common_timezones = \
  992. ['Africa/Abidjan',
  993. 'Africa/Accra',
  994. 'Africa/Addis_Ababa',
  995. 'Africa/Algiers',
  996. 'Africa/Asmara',
  997. 'Africa/Bamako',
  998. 'Africa/Bangui',
  999. 'Africa/Banjul',
  1000. 'Africa/Bissau',
  1001. 'Africa/Blantyre',
  1002. 'Africa/Brazzaville',
  1003. 'Africa/Bujumbura',
  1004. 'Africa/Cairo',
  1005. 'Africa/Casablanca',
  1006. 'Africa/Ceuta',
  1007. 'Africa/Conakry',
  1008. 'Africa/Dakar',
  1009. 'Africa/Dar_es_Salaam',
  1010. 'Africa/Djibouti',
  1011. 'Africa/Douala',
  1012. 'Africa/El_Aaiun',
  1013. 'Africa/Freetown',
  1014. 'Africa/Gaborone',
  1015. 'Africa/Harare',
  1016. 'Africa/Johannesburg',
  1017. 'Africa/Juba',
  1018. 'Africa/Kampala',
  1019. 'Africa/Khartoum',
  1020. 'Africa/Kigali',
  1021. 'Africa/Kinshasa',
  1022. 'Africa/Lagos',
  1023. 'Africa/Libreville',
  1024. 'Africa/Lome',
  1025. 'Africa/Luanda',
  1026. 'Africa/Lubumbashi',
  1027. 'Africa/Lusaka',
  1028. 'Africa/Malabo',
  1029. 'Africa/Maputo',
  1030. 'Africa/Maseru',
  1031. 'Africa/Mbabane',
  1032. 'Africa/Mogadishu',
  1033. 'Africa/Monrovia',
  1034. 'Africa/Nairobi',
  1035. 'Africa/Ndjamena',
  1036. 'Africa/Niamey',
  1037. 'Africa/Nouakchott',
  1038. 'Africa/Ouagadougou',
  1039. 'Africa/Porto-Novo',
  1040. 'Africa/Sao_Tome',
  1041. 'Africa/Tripoli',
  1042. 'Africa/Tunis',
  1043. 'Africa/Windhoek',
  1044. 'America/Adak',
  1045. 'America/Anchorage',
  1046. 'America/Anguilla',
  1047. 'America/Antigua',
  1048. 'America/Araguaina',
  1049. 'America/Argentina/Buenos_Aires',
  1050. 'America/Argentina/Catamarca',
  1051. 'America/Argentina/Cordoba',
  1052. 'America/Argentina/Jujuy',
  1053. 'America/Argentina/La_Rioja',
  1054. 'America/Argentina/Mendoza',
  1055. 'America/Argentina/Rio_Gallegos',
  1056. 'America/Argentina/Salta',
  1057. 'America/Argentina/San_Juan',
  1058. 'America/Argentina/San_Luis',
  1059. 'America/Argentina/Tucuman',
  1060. 'America/Argentina/Ushuaia',
  1061. 'America/Aruba',
  1062. 'America/Asuncion',
  1063. 'America/Atikokan',
  1064. 'America/Bahia',
  1065. 'America/Bahia_Banderas',
  1066. 'America/Barbados',
  1067. 'America/Belem',
  1068. 'America/Belize',
  1069. 'America/Blanc-Sablon',
  1070. 'America/Boa_Vista',
  1071. 'America/Bogota',
  1072. 'America/Boise',
  1073. 'America/Cambridge_Bay',
  1074. 'America/Campo_Grande',
  1075. 'America/Cancun',
  1076. 'America/Caracas',
  1077. 'America/Cayenne',
  1078. 'America/Cayman',
  1079. 'America/Chicago',
  1080. 'America/Chihuahua',
  1081. 'America/Costa_Rica',
  1082. 'America/Creston',
  1083. 'America/Cuiaba',
  1084. 'America/Curacao',
  1085. 'America/Danmarkshavn',
  1086. 'America/Dawson',
  1087. 'America/Dawson_Creek',
  1088. 'America/Denver',
  1089. 'America/Detroit',
  1090. 'America/Dominica',
  1091. 'America/Edmonton',
  1092. 'America/Eirunepe',
  1093. 'America/El_Salvador',
  1094. 'America/Fort_Nelson',
  1095. 'America/Fortaleza',
  1096. 'America/Glace_Bay',
  1097. 'America/Godthab',
  1098. 'America/Goose_Bay',
  1099. 'America/Grand_Turk',
  1100. 'America/Grenada',
  1101. 'America/Guadeloupe',
  1102. 'America/Guatemala',
  1103. 'America/Guayaquil',
  1104. 'America/Guyana',
  1105. 'America/Halifax',
  1106. 'America/Havana',
  1107. 'America/Hermosillo',
  1108. 'America/Indiana/Indianapolis',
  1109. 'America/Indiana/Knox',
  1110. 'America/Indiana/Marengo',
  1111. 'America/Indiana/Petersburg',
  1112. 'America/Indiana/Tell_City',
  1113. 'America/Indiana/Vevay',
  1114. 'America/Indiana/Vincennes',
  1115. 'America/Indiana/Winamac',
  1116. 'America/Inuvik',
  1117. 'America/Iqaluit',
  1118. 'America/Jamaica',
  1119. 'America/Juneau',
  1120. 'America/Kentucky/Louisville',
  1121. 'America/Kentucky/Monticello',
  1122. 'America/Kralendijk',
  1123. 'America/La_Paz',
  1124. 'America/Lima',
  1125. 'America/Los_Angeles',
  1126. 'America/Lower_Princes',
  1127. 'America/Maceio',
  1128. 'America/Managua',
  1129. 'America/Manaus',
  1130. 'America/Marigot',
  1131. 'America/Martinique',
  1132. 'America/Matamoros',
  1133. 'America/Mazatlan',
  1134. 'America/Menominee',
  1135. 'America/Merida',
  1136. 'America/Metlakatla',
  1137. 'America/Mexico_City',
  1138. 'America/Miquelon',
  1139. 'America/Moncton',
  1140. 'America/Monterrey',
  1141. 'America/Montevideo',
  1142. 'America/Montserrat',
  1143. 'America/Nassau',
  1144. 'America/New_York',
  1145. 'America/Nipigon',
  1146. 'America/Nome',
  1147. 'America/Noronha',
  1148. 'America/North_Dakota/Beulah',
  1149. 'America/North_Dakota/Center',
  1150. 'America/North_Dakota/New_Salem',
  1151. 'America/Ojinaga',
  1152. 'America/Panama',
  1153. 'America/Pangnirtung',
  1154. 'America/Paramaribo',
  1155. 'America/Phoenix',
  1156. 'America/Port-au-Prince',
  1157. 'America/Port_of_Spain',
  1158. 'America/Porto_Velho',
  1159. 'America/Puerto_Rico',
  1160. 'America/Punta_Arenas',
  1161. 'America/Rainy_River',
  1162. 'America/Rankin_Inlet',
  1163. 'America/Recife',
  1164. 'America/Regina',
  1165. 'America/Resolute',
  1166. 'America/Rio_Branco',
  1167. 'America/Santarem',
  1168. 'America/Santiago',
  1169. 'America/Santo_Domingo',
  1170. 'America/Sao_Paulo',
  1171. 'America/Scoresbysund',
  1172. 'America/Sitka',
  1173. 'America/St_Barthelemy',
  1174. 'America/St_Johns',
  1175. 'America/St_Kitts',
  1176. 'America/St_Lucia',
  1177. 'America/St_Thomas',
  1178. 'America/St_Vincent',
  1179. 'America/Swift_Current',
  1180. 'America/Tegucigalpa',
  1181. 'America/Thule',
  1182. 'America/Thunder_Bay',
  1183. 'America/Tijuana',
  1184. 'America/Toronto',
  1185. 'America/Tortola',
  1186. 'America/Vancouver',
  1187. 'America/Whitehorse',
  1188. 'America/Winnipeg',
  1189. 'America/Yakutat',
  1190. 'America/Yellowknife',
  1191. 'Antarctica/Casey',
  1192. 'Antarctica/Davis',
  1193. 'Antarctica/DumontDUrville',
  1194. 'Antarctica/Macquarie',
  1195. 'Antarctica/Mawson',
  1196. 'Antarctica/McMurdo',
  1197. 'Antarctica/Palmer',
  1198. 'Antarctica/Rothera',
  1199. 'Antarctica/Syowa',
  1200. 'Antarctica/Troll',
  1201. 'Antarctica/Vostok',
  1202. 'Arctic/Longyearbyen',
  1203. 'Asia/Aden',
  1204. 'Asia/Almaty',
  1205. 'Asia/Amman',
  1206. 'Asia/Anadyr',
  1207. 'Asia/Aqtau',
  1208. 'Asia/Aqtobe',
  1209. 'Asia/Ashgabat',
  1210. 'Asia/Atyrau',
  1211. 'Asia/Baghdad',
  1212. 'Asia/Bahrain',
  1213. 'Asia/Baku',
  1214. 'Asia/Bangkok',
  1215. 'Asia/Barnaul',
  1216. 'Asia/Beirut',
  1217. 'Asia/Bishkek',
  1218. 'Asia/Brunei',
  1219. 'Asia/Chita',
  1220. 'Asia/Choibalsan',
  1221. 'Asia/Colombo',
  1222. 'Asia/Damascus',
  1223. 'Asia/Dhaka',
  1224. 'Asia/Dili',
  1225. 'Asia/Dubai',
  1226. 'Asia/Dushanbe',
  1227. 'Asia/Famagusta',
  1228. 'Asia/Gaza',
  1229. 'Asia/Hebron',
  1230. 'Asia/Ho_Chi_Minh',
  1231. 'Asia/Hong_Kong',
  1232. 'Asia/Hovd',
  1233. 'Asia/Irkutsk',
  1234. 'Asia/Jakarta',
  1235. 'Asia/Jayapura',
  1236. 'Asia/Jerusalem',
  1237. 'Asia/Kabul',
  1238. 'Asia/Kamchatka',
  1239. 'Asia/Karachi',
  1240. 'Asia/Kathmandu',
  1241. 'Asia/Khandyga',
  1242. 'Asia/Kolkata',
  1243. 'Asia/Krasnoyarsk',
  1244. 'Asia/Kuala_Lumpur',
  1245. 'Asia/Kuching',
  1246. 'Asia/Kuwait',
  1247. 'Asia/Macau',
  1248. 'Asia/Magadan',
  1249. 'Asia/Makassar',
  1250. 'Asia/Manila',
  1251. 'Asia/Muscat',
  1252. 'Asia/Nicosia',
  1253. 'Asia/Novokuznetsk',
  1254. 'Asia/Novosibirsk',
  1255. 'Asia/Omsk',
  1256. 'Asia/Oral',
  1257. 'Asia/Phnom_Penh',
  1258. 'Asia/Pontianak',
  1259. 'Asia/Pyongyang',
  1260. 'Asia/Qatar',
  1261. 'Asia/Qyzylorda',
  1262. 'Asia/Riyadh',
  1263. 'Asia/Sakhalin',
  1264. 'Asia/Samarkand',
  1265. 'Asia/Seoul',
  1266. 'Asia/Shanghai',
  1267. 'Asia/Singapore',
  1268. 'Asia/Srednekolymsk',
  1269. 'Asia/Taipei',
  1270. 'Asia/Tashkent',
  1271. 'Asia/Tbilisi',
  1272. 'Asia/Tehran',
  1273. 'Asia/Thimphu',
  1274. 'Asia/Tokyo',
  1275. 'Asia/Tomsk',
  1276. 'Asia/Ulaanbaatar',
  1277. 'Asia/Urumqi',
  1278. 'Asia/Ust-Nera',
  1279. 'Asia/Vientiane',
  1280. 'Asia/Vladivostok',
  1281. 'Asia/Yakutsk',
  1282. 'Asia/Yangon',
  1283. 'Asia/Yekaterinburg',
  1284. 'Asia/Yerevan',
  1285. 'Atlantic/Azores',
  1286. 'Atlantic/Bermuda',
  1287. 'Atlantic/Canary',
  1288. 'Atlantic/Cape_Verde',
  1289. 'Atlantic/Faroe',
  1290. 'Atlantic/Madeira',
  1291. 'Atlantic/Reykjavik',
  1292. 'Atlantic/South_Georgia',
  1293. 'Atlantic/St_Helena',
  1294. 'Atlantic/Stanley',
  1295. 'Australia/Adelaide',
  1296. 'Australia/Brisbane',
  1297. 'Australia/Broken_Hill',
  1298. 'Australia/Currie',
  1299. 'Australia/Darwin',
  1300. 'Australia/Eucla',
  1301. 'Australia/Hobart',
  1302. 'Australia/Lindeman',
  1303. 'Australia/Lord_Howe',
  1304. 'Australia/Melbourne',
  1305. 'Australia/Perth',
  1306. 'Australia/Sydney',
  1307. 'Canada/Atlantic',
  1308. 'Canada/Central',
  1309. 'Canada/Eastern',
  1310. 'Canada/Mountain',
  1311. 'Canada/Newfoundland',
  1312. 'Canada/Pacific',
  1313. 'Europe/Amsterdam',
  1314. 'Europe/Andorra',
  1315. 'Europe/Astrakhan',
  1316. 'Europe/Athens',
  1317. 'Europe/Belgrade',
  1318. 'Europe/Berlin',
  1319. 'Europe/Bratislava',
  1320. 'Europe/Brussels',
  1321. 'Europe/Bucharest',
  1322. 'Europe/Budapest',
  1323. 'Europe/Busingen',
  1324. 'Europe/Chisinau',
  1325. 'Europe/Copenhagen',
  1326. 'Europe/Dublin',
  1327. 'Europe/Gibraltar',
  1328. 'Europe/Guernsey',
  1329. 'Europe/Helsinki',
  1330. 'Europe/Isle_of_Man',
  1331. 'Europe/Istanbul',
  1332. 'Europe/Jersey',
  1333. 'Europe/Kaliningrad',
  1334. 'Europe/Kiev',
  1335. 'Europe/Kirov',
  1336. 'Europe/Lisbon',
  1337. 'Europe/Ljubljana',
  1338. 'Europe/London',
  1339. 'Europe/Luxembourg',
  1340. 'Europe/Madrid',
  1341. 'Europe/Malta',
  1342. 'Europe/Mariehamn',
  1343. 'Europe/Minsk',
  1344. 'Europe/Monaco',
  1345. 'Europe/Moscow',
  1346. 'Europe/Oslo',
  1347. 'Europe/Paris',
  1348. 'Europe/Podgorica',
  1349. 'Europe/Prague',
  1350. 'Europe/Riga',
  1351. 'Europe/Rome',
  1352. 'Europe/Samara',
  1353. 'Europe/San_Marino',
  1354. 'Europe/Sarajevo',
  1355. 'Europe/Saratov',
  1356. 'Europe/Simferopol',
  1357. 'Europe/Skopje',
  1358. 'Europe/Sofia',
  1359. 'Europe/Stockholm',
  1360. 'Europe/Tallinn',
  1361. 'Europe/Tirane',
  1362. 'Europe/Ulyanovsk',
  1363. 'Europe/Uzhgorod',
  1364. 'Europe/Vaduz',
  1365. 'Europe/Vatican',
  1366. 'Europe/Vienna',
  1367. 'Europe/Vilnius',
  1368. 'Europe/Volgograd',
  1369. 'Europe/Warsaw',
  1370. 'Europe/Zagreb',
  1371. 'Europe/Zaporozhye',
  1372. 'Europe/Zurich',
  1373. 'GMT',
  1374. 'Indian/Antananarivo',
  1375. 'Indian/Chagos',
  1376. 'Indian/Christmas',
  1377. 'Indian/Cocos',
  1378. 'Indian/Comoro',
  1379. 'Indian/Kerguelen',
  1380. 'Indian/Mahe',
  1381. 'Indian/Maldives',
  1382. 'Indian/Mauritius',
  1383. 'Indian/Mayotte',
  1384. 'Indian/Reunion',
  1385. 'Pacific/Apia',
  1386. 'Pacific/Auckland',
  1387. 'Pacific/Bougainville',
  1388. 'Pacific/Chatham',
  1389. 'Pacific/Chuuk',
  1390. 'Pacific/Easter',
  1391. 'Pacific/Efate',
  1392. 'Pacific/Enderbury',
  1393. 'Pacific/Fakaofo',
  1394. 'Pacific/Fiji',
  1395. 'Pacific/Funafuti',
  1396. 'Pacific/Galapagos',
  1397. 'Pacific/Gambier',
  1398. 'Pacific/Guadalcanal',
  1399. 'Pacific/Guam',
  1400. 'Pacific/Honolulu',
  1401. 'Pacific/Kiritimati',
  1402. 'Pacific/Kosrae',
  1403. 'Pacific/Kwajalein',
  1404. 'Pacific/Majuro',
  1405. 'Pacific/Marquesas',
  1406. 'Pacific/Midway',
  1407. 'Pacific/Nauru',
  1408. 'Pacific/Niue',
  1409. 'Pacific/Norfolk',
  1410. 'Pacific/Noumea',
  1411. 'Pacific/Pago_Pago',
  1412. 'Pacific/Palau',
  1413. 'Pacific/Pitcairn',
  1414. 'Pacific/Pohnpei',
  1415. 'Pacific/Port_Moresby',
  1416. 'Pacific/Rarotonga',
  1417. 'Pacific/Saipan',
  1418. 'Pacific/Tahiti',
  1419. 'Pacific/Tarawa',
  1420. 'Pacific/Tongatapu',
  1421. 'Pacific/Wake',
  1422. 'Pacific/Wallis',
  1423. 'US/Alaska',
  1424. 'US/Arizona',
  1425. 'US/Central',
  1426. 'US/Eastern',
  1427. 'US/Hawaii',
  1428. 'US/Mountain',
  1429. 'US/Pacific',
  1430. 'UTC']
  1431. common_timezones = LazyList(
  1432. tz for tz in common_timezones if tz in all_timezones)
  1433. common_timezones_set = LazySet(common_timezones)