pax_global_header00006660000000000000000000000064132102213510014500gustar00rootroot0000000000000052 comment=43422c31fbd69dee685b4335882b92fb826c2aa0 tzlocal-1.5.1/000077500000000000000000000000001321022135100131545ustar00rootroot00000000000000tzlocal-1.5.1/.gitignore000066400000000000000000000000431321022135100151410ustar00rootroot00000000000000*.pyc *.wpr *.wpu *.egg-info *.egg tzlocal-1.5.1/.travis.yml000066400000000000000000000032121321022135100152630ustar00rootroot00000000000000os: - linux - osx language: python python: - "2.7" - "3.5" - "3.6" - "nightly" # currently points to 3.7-dev # command to run tests install: # Nothing needed script: python setup.py test # osx Python installs must be run as generic language, because Python isn't # installed. Also, the queue for their macs is long so let's just test 3.6. matrix: include: - os: osx language: generic python: "3.6" exclude: - os: osx # Why travis can't include Python in the macOS builds is beyond me before_install: | if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update # Per the `pyenv homebrew recommendations `_. brew install openssl readline # See https://docs.travis-ci.com/user/osx-ci-environment/#A-note-on-upgrading-packages. # I didn't do this above because it works and I'm lazy. brew outdated pyenv || brew upgrade pyenv # virtualenv doesn't work without pyenv knowledge. venv in Python 3.3 # doesn't provide Pip by default. So, use `pyenv-virtualenv `_. brew install pyenv-virtualenv pyenv install $PYTHON # I would expect something like ``pyenv init; pyenv local $PYTHON`` or # ``pyenv shell $PYTHON`` would work, but ``pyenv init`` doesn't seem to # modify the Bash environment. ??? So, I hand-set the variables instead. export PYENV_VERSION=$PYTHON export PATH="/Users/travis/.pyenv/shims:${PATH}" pyenv-virtualenv venv source venv/bin/activate # A manual check that the correct version of Python is running. python --version fi tzlocal-1.5.1/CHANGES.txt000066400000000000000000000055161321022135100147740ustar00rootroot00000000000000Changes ======= 1.5.1 (2017-12-01) ------------------ - 1.5 had a bug that slipped through testing, fixed that, increased test coverage. 1.5 (2017-11-30) ---------------- - No longer treats macOS as special, but as a unix. - get_windows_info.py is renamed to update_windows_mappings.py - Windows mappings now also contain mappings from deprecated zoneinfo names. (Preston-Landers, regebro) 1.4 (2017-04-18) ---------------- - I use MIT on my other projects, so relicensing. 1.4b1 (2017-04-14) ------------------ - Dropping support for Python versions nobody uses (2.5, 3.1, 3.2), adding 3.6 Python 3.1 and 3.2 still works, 2.5 has been broken for some time. - Ayalash's OS X fix didn't work on Python 2.7, fixed that. 1.3.2 (2017-04-12) ------------------ - Ensure closing of subprocess on OS X (ayalash) DOING: Implementing feedback on the unsubscribe button DOING: Investigating remaining issues with DOCX export BLOCKERS: None - Removed unused imports (jwilk) - Closes stdout and stderr to get rid of ResourceWarnings (johnwquarles) - Updated Windows timezones (axil) 1.3 (2016-10-15) ---------------- - #34: Added support for /var/db/zoneinfo 1.2.2 (2016-03-02) ------------------ - #30: Fixed a bug on OS X. 1.2.1 (2016-02-28) ------------------ - Tests failed if TZ was set in the environment. (EdwardBetts) - Replaces os.popen() with subprocess.Popen() for OS X to handle when systemsetup doesn't exist. (mckabi, cewing) 1.2 (2015-06-14) ---------------- - Systemd stores no time zone name, forcing us to look at the name of the file that localtime symlinks to. (cameris) 1.1.2 (2014-10-18) ------------------ - Timezones that has 3 items did not work on Mac OS X. (Marc Van Olmen) - Now doesn't fail if the TZ environment variable isn't an Olsen time zone. - Some timezones on Windows can apparently be empty (perhaps the are deleted). Now these are ignored. (Xiaokun Zhu) 1.1.1 (2014-01-29) ------------------ - I forgot to add Etc/UTC as an alias for Etc/GMT. 1.1 (2014-01-28) ---------------- - Adding better support for OS X. - Added support to map from tzdata/Olsen names to Windows names. (Thanks to Benjamen Meyer). 1.0 (2013-05-29) ---------------- - Fixed some more cases where spaces needs replacing with underscores. - Better handling of misconfigured /etc/timezone. - Better error message on Windows if we can't find a timezone at all. 0.3 (2012-09-13) ---------------- - Windows 7 support. - Python 2.5 supported; because it only needed a __future__ import. - Python 3.3 tested, it worked. - Got rid of relative imports, because I don't actually like them, so I don't know why I used them in the first place. - For each Windows zone, use the default zoneinfo zone, not the last one. 0.2 (2012-09-12) ---------------- - Python 3 support. 0.1 (2012-09-11) ---------------- - Initial release. tzlocal-1.5.1/LICENSE.txt000066400000000000000000000020441321022135100147770ustar00rootroot00000000000000Copyright 2011-2017 Lennart Regebro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. tzlocal-1.5.1/MANIFEST.in000066400000000000000000000001161321022135100147100ustar00rootroot00000000000000include *.py include *.rst include *.txt recursive-include tzlocal/test_data *tzlocal-1.5.1/README.rst000066400000000000000000000041571321022135100146520ustar00rootroot00000000000000tzlocal ======= This Python module returns a `tzinfo` object with the local timezone information under Unix and Win-32. It requires `pytz`, and returns `pytz` `tzinfo` objects. This module attempts to fix a glaring hole in `pytz`, that there is no way to get the local timezone information, unless you know the zoneinfo name, and under several Linux distros that's hard or impossible to figure out. Also, with Windows different timezone system using pytz isn't of much use unless you separately configure the zoneinfo timezone name. With `tzlocal` you only need to call `get_localzone()` and you will get a `tzinfo` object with the local time zone info. On some Unices you will still not get to know what the timezone name is, but you don't need that when you have the tzinfo file. However, if the timezone name is readily available it will be used. Supported systems ----------------- These are the systems that are in theory supported: * Windows 2000 and later * Any unix-like system with a /etc/localtime or /usr/local/etc/localtime If you have one of the above systems and it does not work, it's a bug. Please report it. Usage ----- Load the local timezone: >>> from tzlocal import get_localzone >>> tz = get_localzone() >>> tz Create a local datetime: >>> from datetime import datetime >>> dt = tz.localize(datetime(2015, 4, 10, 7, 22)) >>> dt datetime.datetime(2015, 4, 10, 7, 22, tzinfo=) Lookup another timezone with `pytz`: >>> import pytz >>> eastern = pytz.timezone('US/Eastern') Convert the datetime: >>> dt.astimezone(eastern) datetime.datetime(2015, 4, 10, 1, 22, tzinfo=) Maintainer ---------- * Lennart Regebro, regebro@gmail.com Contributors ------------ * Marc Van Olmen * Benjamen Meyer * Manuel Ebert * Xiaokun Zhu * Cameris * Edward Betts * McK KIM * Cris Ewing * Ayala Shachar * Lev Maximov * Jakub Wilk * John Quarles * Preston Landers (Sorry if I forgot someone) License ------- * MIT https://opensource.org/licenses/MIT tzlocal-1.5.1/setup.cfg000066400000000000000000000000431321022135100147720ustar00rootroot00000000000000[check-manifest] ignore=spiny.conf tzlocal-1.5.1/setup.py000066400000000000000000000023661321022135100146750ustar00rootroot00000000000000from setuptools import setup, find_packages version = '1.5.1' setup(name='tzlocal', version=version, description="tzinfo object for the local timezone", long_description=open('README.rst', 'rt').read() + '\n\n' + open('CHANGES.txt', 'rt').read(), classifiers=[ 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: MIT License', 'Operating System :: Microsoft :: Windows', 'Operating System :: Unix', 'Operating System :: MacOS :: MacOS X', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', ], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers keywords='timezone pytz', author='Lennart Regebro', author_email='regebro@gmail.com', url='https://github.com/regebro/tzlocal', license="MIT", packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), include_package_data=True, zip_safe=True, install_requires=[ 'pytz', ], tests_require=[ 'mock', ], test_suite='tzlocal.tests', ) tzlocal-1.5.1/spiny.conf000066400000000000000000000002511321022135100151630ustar00rootroot00000000000000[spiny] environments=python2.5 python2.6 python2.7 python3.1 python3.2 python3.3 python3.4 tzlocal-1.5.1/tzlocal/000077500000000000000000000000001321022135100146245ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/__init__.py000066400000000000000000000002501321022135100167320ustar00rootroot00000000000000import sys if sys.platform == 'win32': from tzlocal.win32 import get_localzone, reload_localzone else: from tzlocal.unix import get_localzone, reload_localzone tzlocal-1.5.1/tzlocal/test_data/000077500000000000000000000000001321022135100165745ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/Harare000066400000000000000000000002351321022135100177210ustar00rootroot00000000000000TZif2‚FÇd LMTCATTZif2ÿÿÿÿ‚FÇd LMTCAT CAT-2 tzlocal-1.5.1/tzlocal/test_data/localtime/000077500000000000000000000000001321022135100205455ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/localtime/etc/000077500000000000000000000000001321022135100213205ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/localtime/etc/localtime000066400000000000000000000002351321022135100232140ustar00rootroot00000000000000TZif2‚FÇd LMTCATTZif2ÿÿÿÿ‚FÇd LMTCAT CAT-2 tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/000077500000000000000000000000001321022135100223135ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/etc/000077500000000000000000000000001321022135100230665ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/etc/localtime000077700000000000000000000000001321022135100332442../usr/share/zoneinfo/Africa/Harareustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/usr/000077500000000000000000000000001321022135100231245ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/usr/share/000077500000000000000000000000001321022135100242265ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/000077500000000000000000000000001321022135100260555ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/Africa/000077500000000000000000000000001321022135100272425ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/Africa/Harare000066400000000000000000000002351321022135100303670ustar00rootroot00000000000000TZif2‚FÇd LMTCATTZif2ÿÿÿÿ‚FÇd LMTCAT CAT-2 tzlocal-1.5.1/tzlocal/test_data/timezone/000077500000000000000000000000001321022135100204265ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/timezone/etc/000077500000000000000000000000001321022135100212015ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/timezone/etc/timezone000066400000000000000000000001011321022135100227460ustar00rootroot00000000000000Africa/Harare# We allow comments. It's unusual, but has happened tzlocal-1.5.1/tzlocal/test_data/timezone_setting/000077500000000000000000000000001321022135100221635ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/timezone_setting/etc/000077500000000000000000000000001321022135100227365ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/timezone_setting/etc/conf.d/000077500000000000000000000000001321022135100241055ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/timezone_setting/etc/conf.d/clock000066400000000000000000000000331321022135100251170ustar00rootroot00000000000000TIMEZONE = "Africa/Harare" tzlocal-1.5.1/tzlocal/test_data/vardbzoneinfo/000077500000000000000000000000001321022135100214425ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/vardbzoneinfo/var/000077500000000000000000000000001321022135100222325ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/vardbzoneinfo/var/db/000077500000000000000000000000001321022135100226175ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/vardbzoneinfo/var/db/zoneinfo000066400000000000000000000001201321022135100243620ustar00rootroot00000000000000Africa/Harare localhost # The host is not a part of the format, but is allowed. tzlocal-1.5.1/tzlocal/test_data/zone_setting/000077500000000000000000000000001321022135100213045ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/zone_setting/etc/000077500000000000000000000000001321022135100220575ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/zone_setting/etc/sysconfig/000077500000000000000000000000001321022135100240635ustar00rootroot00000000000000tzlocal-1.5.1/tzlocal/test_data/zone_setting/etc/sysconfig/clock000066400000000000000000000000251321022135100250760ustar00rootroot00000000000000ZONE="Africa/Harare" tzlocal-1.5.1/tzlocal/tests.py000066400000000000000000000121151321022135100163400ustar00rootroot00000000000000import mock import os import pytz import sys import tzlocal.unix import unittest from datetime import datetime class TzLocalTests(unittest.TestCase): def setUp(self): if 'TZ' in os.environ: del os.environ['TZ'] self.path = os.path.split(__file__)[0] def test_env(self): tz_harare = tzlocal.unix._tz_from_env(':Africa/Harare') self.assertEqual(tz_harare.zone, 'Africa/Harare') # Some Unices allow this as well, so we must allow it: tz_harare = tzlocal.unix._tz_from_env('Africa/Harare') self.assertEqual(tz_harare.zone, 'Africa/Harare') tz_local = tzlocal.unix._tz_from_env(':' + os.path.join(self.path, 'test_data', 'Harare')) self.assertEqual(tz_local.zone, 'local') # Make sure the local timezone is the same as the Harare one above. # We test this with a past date, so that we don't run into future changes # of the Harare timezone. dt = datetime(2012, 1, 1, 5) self.assertEqual(tz_harare.localize(dt), tz_local.localize(dt)) # Non-zoneinfo timezones are not supported in the TZ environment. self.assertRaises(pytz.UnknownTimeZoneError, tzlocal.unix._tz_from_env, 'GMT+03:00') # Test the _try function os.environ['TZ'] = 'Africa/Harare' tz_harare = tzlocal.unix._try_tz_from_env() self.assertEqual(tz_harare.zone, 'Africa/Harare') # With a zone that doesn't exist os.environ['TZ'] = 'Just Nonsense' tz_harare = tzlocal.unix._try_tz_from_env() self.assertIsNone(tz_harare) def test_timezone(self): # Most versions of Ubuntu tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'timezone')) self.assertEqual(tz.zone, 'Africa/Harare') def test_zone_setting(self): # A ZONE setting in /etc/sysconfig/clock, f ex CentOS tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'zone_setting')) self.assertEqual(tz.zone, 'Africa/Harare') def test_timezone_setting(self): # A ZONE setting in /etc/conf.d/clock, f ex Gentoo tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'timezone_setting')) self.assertEqual(tz.zone, 'Africa/Harare') def test_symlink_localtime(self): # A ZONE setting in the target path of a symbolic linked localtime, f ex systemd distributions tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'symlink_localtime')) self.assertEqual(tz.zone, 'Africa/Harare') def test_vardbzoneinfo_setting(self): # A ZONE setting in /etc/conf.d/clock, f ex Gentoo tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'vardbzoneinfo')) self.assertEqual(tz.zone, 'Africa/Harare') def test_only_localtime(self): tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'localtime')) self.assertEqual(tz.zone, 'local') dt = datetime(2012, 1, 1, 5) self.assertEqual(pytz.timezone('Africa/Harare').localize(dt), tz.localize(dt)) def test_get_reload(self): os.environ['TZ'] = 'Africa/Harare' tz_harare = tzlocal.unix.get_localzone() self.assertEqual(tz_harare.zone, 'Africa/Harare') # Changing the TZ makes no difference, because it's cached os.environ['TZ'] = 'Africa/Johannesburg' tz_harare = tzlocal.unix.get_localzone() self.assertEqual(tz_harare.zone, 'Africa/Harare') # So we reload it tz_harare = tzlocal.unix.reload_localzone() self.assertEqual(tz_harare.zone, 'Africa/Johannesburg') def test_fail(self): with self.assertRaises(pytz.exceptions.UnknownTimeZoneError): tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data')) if sys.platform == 'win32': import tzlocal.win32 class TzWin32Tests(unittest.TestCase): def test_win32(self): tzlocal.win32.get_localzone() else: class TzWin32Tests(unittest.TestCase): def test_win32_on_unix(self): # Yes, winreg is all mocked out, but this test means we at least # catch syntax errors, etc. winreg = mock.MagicMock() winreg.OpenKey = mock.MagicMock() winreg.OpenKey.close = mock.MagicMock() winreg.QueryInfoKey = mock.MagicMock(return_value=(1, 1)) winreg.EnumValue = mock.MagicMock( return_value=('TimeZoneKeyName','Belarus Standard Time')) winreg.EnumKey = mock.Mock(return_value='Bahia Standard Time') sys.modules['winreg'] = winreg import tzlocal.win32 tz = tzlocal.win32.get_localzone() self.assertEqual(tz.zone, 'Europe/Minsk') tzlocal.win32.valuestodict = mock.Mock(return_value={ 'StandardName': 'Mocked Standard Time', 'Std': 'Mocked Standard Time', }) tz = tzlocal.win32.reload_localzone() self.assertEqual(tz.zone, 'America/Bahia') if __name__ == '__main__': unittest.main() tzlocal-1.5.1/tzlocal/unix.py000066400000000000000000000112061321022135100161610ustar00rootroot00000000000000import os import re import pytz _cache_tz = None def _tz_from_env(tzenv): if tzenv[0] == ':': tzenv = tzenv[1:] # TZ specifies a file if os.path.exists(tzenv): with open(tzenv, 'rb') as tzfile: return pytz.tzfile.build_tzinfo('local', tzfile) # TZ specifies a zoneinfo zone. try: tz = pytz.timezone(tzenv) # That worked, so we return this: return tz except pytz.UnknownTimeZoneError: raise pytz.UnknownTimeZoneError( "tzlocal() does not support non-zoneinfo timezones like %s. \n" "Please use a timezone in the form of Continent/City") def _try_tz_from_env(): tzenv = os.environ.get('TZ') if tzenv: try: return _tz_from_env(tzenv) except pytz.UnknownTimeZoneError: pass def _get_localzone(_root='/'): """Tries to find the local timezone configuration. This method prefers finding the timezone name and passing that to pytz, over passing in the localtime file, as in the later case the zoneinfo name is unknown. The parameter _root makes the function look for files like /etc/localtime beneath the _root directory. This is primarily used by the tests. In normal usage you call the function without parameters.""" tzenv = _try_tz_from_env() if tzenv: return tzenv # Now look for distribution specific configuration files # that contain the timezone name. for configfile in ('etc/timezone', 'var/db/zoneinfo'): tzpath = os.path.join(_root, configfile) if os.path.exists(tzpath): with open(tzpath, 'rb') as tzfile: data = tzfile.read() # Issue #3 was that /etc/timezone was a zoneinfo file. # That's a misconfiguration, but we need to handle it gracefully: if data[:5] == 'TZif2': continue etctz = data.strip().decode() # Get rid of host definitions and comments: if ' ' in etctz: etctz, dummy = etctz.split(' ', 1) if '#' in etctz: etctz, dummy = etctz.split('#', 1) return pytz.timezone(etctz.replace(' ', '_')) # CentOS has a ZONE setting in /etc/sysconfig/clock, # OpenSUSE has a TIMEZONE setting in /etc/sysconfig/clock and # Gentoo has a TIMEZONE setting in /etc/conf.d/clock # We look through these files for a timezone: zone_re = re.compile('\s*ZONE\s*=\s*\"') timezone_re = re.compile('\s*TIMEZONE\s*=\s*\"') end_re = re.compile('\"') for filename in ('etc/sysconfig/clock', 'etc/conf.d/clock'): tzpath = os.path.join(_root, filename) if not os.path.exists(tzpath): continue with open(tzpath, 'rt') as tzfile: data = tzfile.readlines() for line in data: # Look for the ZONE= setting. match = zone_re.match(line) if match is None: # No ZONE= setting. Look for the TIMEZONE= setting. match = timezone_re.match(line) if match is not None: # Some setting existed line = line[match.end():] etctz = line[:end_re.search(line).start()] # We found a timezone return pytz.timezone(etctz.replace(' ', '_')) # systemd distributions use symlinks that include the zone name, # see manpage of localtime(5) and timedatectl(1) tzpath = os.path.join(_root, 'etc/localtime') if os.path.exists(tzpath) and os.path.islink(tzpath): tzpath = os.path.realpath(tzpath) start = tzpath.find("/")+1 while start is not 0: tzpath = tzpath[start:] try: return pytz.timezone(tzpath) except pytz.UnknownTimeZoneError: pass start = tzpath.find("/")+1 # No explicit setting existed. Use localtime for filename in ('etc/localtime', 'usr/local/etc/localtime'): tzpath = os.path.join(_root, filename) if not os.path.exists(tzpath): continue with open(tzpath, 'rb') as tzfile: return pytz.tzfile.build_tzinfo('local', tzfile) raise pytz.UnknownTimeZoneError('Can not find any timezone configuration') def get_localzone(): """Get the computers configured local timezone, if any.""" global _cache_tz if _cache_tz is None: _cache_tz = _get_localzone() return _cache_tz def reload_localzone(): """Reload the cached localzone. You need to call this if the timezone has changed.""" global _cache_tz _cache_tz = _get_localzone() return _cache_tz tzlocal-1.5.1/tzlocal/win32.py000066400000000000000000000061251321022135100161440ustar00rootroot00000000000000try: import _winreg as winreg except ImportError: import winreg from tzlocal.windows_tz import win_tz import pytz _cache_tz = None def valuestodict(key): """Convert a registry key's values to a dictionary.""" dict = {} size = winreg.QueryInfoKey(key)[1] for i in range(size): data = winreg.EnumValue(key, i) dict[data[0]] = data[1] return dict def get_localzone_name(): # Windows is special. It has unique time zone names (in several # meanings of the word) available, but unfortunately, they can be # translated to the language of the operating system, so we need to # do a backwards lookup, by going through all time zones and see which # one matches. handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" localtz = winreg.OpenKey(handle, TZLOCALKEYNAME) keyvalues = valuestodict(localtz) localtz.Close() if 'TimeZoneKeyName' in keyvalues: # Windows 7 (and Vista?) # For some reason this returns a string with loads of NUL bytes at # least on some systems. I don't know if this is a bug somewhere, I # just work around it. tzkeyname = keyvalues['TimeZoneKeyName'].split('\x00', 1)[0] else: # Windows 2000 or XP # This is the localized name: tzwin = keyvalues['StandardName'] # Open the list of timezones to look up the real name: TZKEYNAME = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" tzkey = winreg.OpenKey(handle, TZKEYNAME) # Now, match this value to Time Zone information tzkeyname = None for i in range(winreg.QueryInfoKey(tzkey)[0]): subkey = winreg.EnumKey(tzkey, i) sub = winreg.OpenKey(tzkey, subkey) data = valuestodict(sub) sub.Close() try: if data['Std'] == tzwin: tzkeyname = subkey break except KeyError: # This timezone didn't have proper configuration. # Ignore it. pass tzkey.Close() handle.Close() if tzkeyname is None: raise LookupError('Can not find Windows timezone configuration') timezone = win_tz.get(tzkeyname) if timezone is None: # Nope, that didn't work. Try adding "Standard Time", # it seems to work a lot of times: timezone = win_tz.get(tzkeyname + " Standard Time") # Return what we have. if timezone is None: raise pytz.UnknownTimeZoneError('Can not find timezone ' + tzkeyname) return timezone def get_localzone(): """Returns the zoneinfo-based tzinfo object that matches the Windows-configured timezone.""" global _cache_tz if _cache_tz is None: _cache_tz = pytz.timezone(get_localzone_name()) return _cache_tz def reload_localzone(): """Reload the cached localzone. You need to call this if the timezone has changed.""" global _cache_tz _cache_tz = pytz.timezone(get_localzone_name()) return _cache_tz tzlocal-1.5.1/tzlocal/windows_tz.py000066400000000000000000000747271321022135100174260ustar00rootroot00000000000000# This file is autogenerated by the update_windows_mapping.py script # Do not edit. win_tz = {'AUS Central Standard Time': 'Australia/Darwin', 'AUS Eastern Standard Time': 'Australia/Sydney', 'Afghanistan Standard Time': 'Asia/Kabul', 'Alaskan Standard Time': 'America/Anchorage', 'Aleutian Standard Time': 'America/Adak', 'Altai Standard Time': 'Asia/Barnaul', 'Arab Standard Time': 'Asia/Riyadh', 'Arabian Standard Time': 'Asia/Dubai', 'Arabic Standard Time': 'Asia/Baghdad', 'Argentina Standard Time': 'America/Buenos_Aires', 'Astrakhan Standard Time': 'Europe/Astrakhan', 'Atlantic Standard Time': 'America/Halifax', 'Aus Central W. Standard Time': 'Australia/Eucla', 'Azerbaijan Standard Time': 'Asia/Baku', 'Azores Standard Time': 'Atlantic/Azores', 'Bahia Standard Time': 'America/Bahia', 'Bangladesh Standard Time': 'Asia/Dhaka', 'Belarus Standard Time': 'Europe/Minsk', 'Bougainville Standard Time': 'Pacific/Bougainville', 'Canada Central Standard Time': 'America/Regina', 'Cape Verde Standard Time': 'Atlantic/Cape_Verde', 'Caucasus Standard Time': 'Asia/Yerevan', 'Cen. Australia Standard Time': 'Australia/Adelaide', 'Central America Standard Time': 'America/Guatemala', 'Central Asia Standard Time': 'Asia/Almaty', 'Central Brazilian Standard Time': 'America/Cuiaba', 'Central Europe Standard Time': 'Europe/Budapest', 'Central European Standard Time': 'Europe/Warsaw', 'Central Pacific Standard Time': 'Pacific/Guadalcanal', 'Central Standard Time': 'America/Chicago', 'Central Standard Time (Mexico)': 'America/Mexico_City', 'Chatham Islands Standard Time': 'Pacific/Chatham', 'China Standard Time': 'Asia/Shanghai', 'Cuba Standard Time': 'America/Havana', 'Dateline Standard Time': 'Etc/GMT+12', 'E. Africa Standard Time': 'Africa/Nairobi', 'E. Australia Standard Time': 'Australia/Brisbane', 'E. Europe Standard Time': 'Europe/Chisinau', 'E. South America Standard Time': 'America/Sao_Paulo', 'Easter Island Standard Time': 'Pacific/Easter', 'Eastern Standard Time': 'America/New_York', 'Eastern Standard Time (Mexico)': 'America/Cancun', 'Egypt Standard Time': 'Africa/Cairo', 'Ekaterinburg Standard Time': 'Asia/Yekaterinburg', 'FLE Standard Time': 'Europe/Kiev', 'Fiji Standard Time': 'Pacific/Fiji', 'GMT Standard Time': 'Europe/London', 'GTB Standard Time': 'Europe/Bucharest', 'Georgian Standard Time': 'Asia/Tbilisi', 'Greenland Standard Time': 'America/Godthab', 'Greenwich Standard Time': 'Atlantic/Reykjavik', 'Haiti Standard Time': 'America/Port-au-Prince', 'Hawaiian Standard Time': 'Pacific/Honolulu', 'India Standard Time': 'Asia/Calcutta', 'Iran Standard Time': 'Asia/Tehran', 'Israel Standard Time': 'Asia/Jerusalem', 'Jordan Standard Time': 'Asia/Amman', 'Kaliningrad Standard Time': 'Europe/Kaliningrad', 'Korea Standard Time': 'Asia/Seoul', 'Libya Standard Time': 'Africa/Tripoli', 'Line Islands Standard Time': 'Pacific/Kiritimati', 'Lord Howe Standard Time': 'Australia/Lord_Howe', 'Magadan Standard Time': 'Asia/Magadan', 'Magallanes Standard Time': 'America/Punta_Arenas', 'Marquesas Standard Time': 'Pacific/Marquesas', 'Mauritius Standard Time': 'Indian/Mauritius', 'Middle East Standard Time': 'Asia/Beirut', 'Montevideo Standard Time': 'America/Montevideo', 'Morocco Standard Time': 'Africa/Casablanca', 'Mountain Standard Time': 'America/Denver', 'Mountain Standard Time (Mexico)': 'America/Chihuahua', 'Myanmar Standard Time': 'Asia/Rangoon', 'N. Central Asia Standard Time': 'Asia/Novosibirsk', 'Namibia Standard Time': 'Africa/Windhoek', 'Nepal Standard Time': 'Asia/Katmandu', 'New Zealand Standard Time': 'Pacific/Auckland', 'Newfoundland Standard Time': 'America/St_Johns', 'Norfolk Standard Time': 'Pacific/Norfolk', 'North Asia East Standard Time': 'Asia/Irkutsk', 'North Asia Standard Time': 'Asia/Krasnoyarsk', 'North Korea Standard Time': 'Asia/Pyongyang', 'Omsk Standard Time': 'Asia/Omsk', 'Pacific SA Standard Time': 'America/Santiago', 'Pacific Standard Time': 'America/Los_Angeles', 'Pacific Standard Time (Mexico)': 'America/Tijuana', 'Pakistan Standard Time': 'Asia/Karachi', 'Paraguay Standard Time': 'America/Asuncion', 'Romance Standard Time': 'Europe/Paris', 'Russia Time Zone 10': 'Asia/Srednekolymsk', 'Russia Time Zone 11': 'Asia/Kamchatka', 'Russia Time Zone 3': 'Europe/Samara', 'Russian Standard Time': 'Europe/Moscow', 'SA Eastern Standard Time': 'America/Cayenne', 'SA Pacific Standard Time': 'America/Bogota', 'SA Western Standard Time': 'America/La_Paz', 'SE Asia Standard Time': 'Asia/Bangkok', 'Saint Pierre Standard Time': 'America/Miquelon', 'Sakhalin Standard Time': 'Asia/Sakhalin', 'Samoa Standard Time': 'Pacific/Apia', 'Saratov Standard Time': 'Europe/Saratov', 'Singapore Standard Time': 'Asia/Singapore', 'South Africa Standard Time': 'Africa/Johannesburg', 'Sri Lanka Standard Time': 'Asia/Colombo', 'Syria Standard Time': 'Asia/Damascus', 'Taipei Standard Time': 'Asia/Taipei', 'Tasmania Standard Time': 'Australia/Hobart', 'Tocantins Standard Time': 'America/Araguaina', 'Tokyo Standard Time': 'Asia/Tokyo', 'Tomsk Standard Time': 'Asia/Tomsk', 'Tonga Standard Time': 'Pacific/Tongatapu', 'Transbaikal Standard Time': 'Asia/Chita', 'Turkey Standard Time': 'Europe/Istanbul', 'Turks And Caicos Standard Time': 'America/Grand_Turk', 'US Eastern Standard Time': 'America/Indianapolis', 'US Mountain Standard Time': 'America/Phoenix', 'UTC': 'Etc/GMT', 'UTC+12': 'Etc/GMT-12', 'UTC+13': 'Etc/GMT-13', 'UTC-02': 'Etc/GMT+2', 'UTC-08': 'Etc/GMT+8', 'UTC-09': 'Etc/GMT+9', 'UTC-11': 'Etc/GMT+11', 'Ulaanbaatar Standard Time': 'Asia/Ulaanbaatar', 'Venezuela Standard Time': 'America/Caracas', 'Vladivostok Standard Time': 'Asia/Vladivostok', 'W. Australia Standard Time': 'Australia/Perth', 'W. Central Africa Standard Time': 'Africa/Lagos', 'W. Europe Standard Time': 'Europe/Berlin', 'W. Mongolia Standard Time': 'Asia/Hovd', 'West Asia Standard Time': 'Asia/Tashkent', 'West Bank Standard Time': 'Asia/Hebron', 'West Pacific Standard Time': 'Pacific/Port_Moresby', 'Yakutsk Standard Time': 'Asia/Yakutsk'} # Old name for the win_tz variable: tz_names = win_tz tz_win = {'Africa/Abidjan': 'Greenwich Standard Time', 'Africa/Accra': 'Greenwich Standard Time', 'Africa/Addis_Ababa': 'E. Africa Standard Time', 'Africa/Algiers': 'W. Central Africa Standard Time', 'Africa/Asmera': 'E. Africa Standard Time', 'Africa/Bamako': 'Greenwich Standard Time', 'Africa/Bangui': 'W. Central Africa Standard Time', 'Africa/Banjul': 'Greenwich Standard Time', 'Africa/Bissau': 'Greenwich Standard Time', 'Africa/Blantyre': 'South Africa Standard Time', 'Africa/Brazzaville': 'W. Central Africa Standard Time', 'Africa/Bujumbura': 'South Africa Standard Time', 'Africa/Cairo': 'Egypt Standard Time', 'Africa/Casablanca': 'Morocco Standard Time', 'Africa/Ceuta': 'Romance Standard Time', 'Africa/Conakry': 'Greenwich Standard Time', 'Africa/Dakar': 'Greenwich Standard Time', 'Africa/Dar_es_Salaam': 'E. Africa Standard Time', 'Africa/Djibouti': 'E. Africa Standard Time', 'Africa/Douala': 'W. Central Africa Standard Time', 'Africa/El_Aaiun': 'Morocco Standard Time', 'Africa/Freetown': 'Greenwich Standard Time', 'Africa/Gaborone': 'South Africa Standard Time', 'Africa/Harare': 'South Africa Standard Time', 'Africa/Johannesburg': 'South Africa Standard Time', 'Africa/Juba': 'E. Africa Standard Time', 'Africa/Kampala': 'E. Africa Standard Time', 'Africa/Khartoum': 'E. Africa Standard Time', 'Africa/Kigali': 'South Africa Standard Time', 'Africa/Kinshasa': 'W. Central Africa Standard Time', 'Africa/Lagos': 'W. Central Africa Standard Time', 'Africa/Libreville': 'W. Central Africa Standard Time', 'Africa/Lome': 'Greenwich Standard Time', 'Africa/Luanda': 'W. Central Africa Standard Time', 'Africa/Lubumbashi': 'South Africa Standard Time', 'Africa/Lusaka': 'South Africa Standard Time', 'Africa/Malabo': 'W. Central Africa Standard Time', 'Africa/Maputo': 'South Africa Standard Time', 'Africa/Maseru': 'South Africa Standard Time', 'Africa/Mbabane': 'South Africa Standard Time', 'Africa/Mogadishu': 'E. Africa Standard Time', 'Africa/Monrovia': 'Greenwich Standard Time', 'Africa/Nairobi': 'E. Africa Standard Time', 'Africa/Ndjamena': 'W. Central Africa Standard Time', 'Africa/Niamey': 'W. Central Africa Standard Time', 'Africa/Nouakchott': 'Greenwich Standard Time', 'Africa/Ouagadougou': 'Greenwich Standard Time', 'Africa/Porto-Novo': 'W. Central Africa Standard Time', 'Africa/Sao_Tome': 'Greenwich Standard Time', 'Africa/Timbuktu': 'Greenwich Standard Time', 'Africa/Tripoli': 'Libya Standard Time', 'Africa/Tunis': 'W. Central Africa Standard Time', 'Africa/Windhoek': 'Namibia Standard Time', 'America/Adak': 'Aleutian Standard Time', 'America/Anchorage': 'Alaskan Standard Time', 'America/Anguilla': 'SA Western Standard Time', 'America/Antigua': 'SA Western Standard Time', 'America/Araguaina': 'Tocantins Standard Time', 'America/Argentina/La_Rioja': 'Argentina Standard Time', 'America/Argentina/Rio_Gallegos': 'Argentina Standard Time', 'America/Argentina/Salta': 'Argentina Standard Time', 'America/Argentina/San_Juan': 'Argentina Standard Time', 'America/Argentina/San_Luis': 'Argentina Standard Time', 'America/Argentina/Tucuman': 'Argentina Standard Time', 'America/Argentina/Ushuaia': 'Argentina Standard Time', 'America/Aruba': 'SA Western Standard Time', 'America/Asuncion': 'Paraguay Standard Time', 'America/Atka': 'Aleutian Standard Time', 'America/Bahia': 'Bahia Standard Time', 'America/Bahia_Banderas': 'Central Standard Time (Mexico)', 'America/Barbados': 'SA Western Standard Time', 'America/Belem': 'SA Eastern Standard Time', 'America/Belize': 'Central America Standard Time', 'America/Blanc-Sablon': 'SA Western Standard Time', 'America/Boa_Vista': 'SA Western Standard Time', 'America/Bogota': 'SA Pacific Standard Time', 'America/Boise': 'Mountain Standard Time', 'America/Buenos_Aires': 'Argentina Standard Time', 'America/Cambridge_Bay': 'Mountain Standard Time', 'America/Campo_Grande': 'Central Brazilian Standard Time', 'America/Cancun': 'Eastern Standard Time (Mexico)', 'America/Caracas': 'Venezuela Standard Time', 'America/Catamarca': 'Argentina Standard Time', 'America/Cayenne': 'SA Eastern Standard Time', 'America/Cayman': 'SA Pacific Standard Time', 'America/Chicago': 'Central Standard Time', 'America/Chihuahua': 'Mountain Standard Time (Mexico)', 'America/Coral_Harbour': 'SA Pacific Standard Time', 'America/Cordoba': 'Argentina Standard Time', 'America/Costa_Rica': 'Central America Standard Time', 'America/Creston': 'US Mountain Standard Time', 'America/Cuiaba': 'Central Brazilian Standard Time', 'America/Curacao': 'SA Western Standard Time', 'America/Danmarkshavn': 'UTC', 'America/Dawson': 'Pacific Standard Time', 'America/Dawson_Creek': 'US Mountain Standard Time', 'America/Denver': 'Mountain Standard Time', 'America/Detroit': 'Eastern Standard Time', 'America/Dominica': 'SA Western Standard Time', 'America/Edmonton': 'Mountain Standard Time', 'America/Eirunepe': 'SA Pacific Standard Time', 'America/El_Salvador': 'Central America Standard Time', 'America/Ensenada': 'Pacific Standard Time (Mexico)', 'America/Fort_Nelson': 'US Mountain Standard Time', 'America/Fortaleza': 'SA Eastern Standard Time', 'America/Glace_Bay': 'Atlantic Standard Time', 'America/Godthab': 'Greenland Standard Time', 'America/Goose_Bay': 'Atlantic Standard Time', 'America/Grand_Turk': 'Turks And Caicos Standard Time', 'America/Grenada': 'SA Western Standard Time', 'America/Guadeloupe': 'SA Western Standard Time', 'America/Guatemala': 'Central America Standard Time', 'America/Guayaquil': 'SA Pacific Standard Time', 'America/Guyana': 'SA Western Standard Time', 'America/Halifax': 'Atlantic Standard Time', 'America/Havana': 'Cuba Standard Time', 'America/Hermosillo': 'US Mountain Standard Time', 'America/Indiana/Knox': 'Central Standard Time', 'America/Indiana/Marengo': 'US Eastern Standard Time', 'America/Indiana/Petersburg': 'Eastern Standard Time', 'America/Indiana/Tell_City': 'Central Standard Time', 'America/Indiana/Vevay': 'US Eastern Standard Time', 'America/Indiana/Vincennes': 'Eastern Standard Time', 'America/Indiana/Winamac': 'Eastern Standard Time', 'America/Indianapolis': 'US Eastern Standard Time', 'America/Inuvik': 'Mountain Standard Time', 'America/Iqaluit': 'Eastern Standard Time', 'America/Jamaica': 'SA Pacific Standard Time', 'America/Jujuy': 'Argentina Standard Time', 'America/Juneau': 'Alaskan Standard Time', 'America/Kentucky/Monticello': 'Eastern Standard Time', 'America/Knox_IN': 'Central Standard Time', 'America/Kralendijk': 'SA Western Standard Time', 'America/La_Paz': 'SA Western Standard Time', 'America/Lima': 'SA Pacific Standard Time', 'America/Los_Angeles': 'Pacific Standard Time', 'America/Louisville': 'Eastern Standard Time', 'America/Lower_Princes': 'SA Western Standard Time', 'America/Maceio': 'SA Eastern Standard Time', 'America/Managua': 'Central America Standard Time', 'America/Manaus': 'SA Western Standard Time', 'America/Marigot': 'SA Western Standard Time', 'America/Martinique': 'SA Western Standard Time', 'America/Matamoros': 'Central Standard Time', 'America/Mazatlan': 'Mountain Standard Time (Mexico)', 'America/Mendoza': 'Argentina Standard Time', 'America/Menominee': 'Central Standard Time', 'America/Merida': 'Central Standard Time (Mexico)', 'America/Metlakatla': 'Alaskan Standard Time', 'America/Mexico_City': 'Central Standard Time (Mexico)', 'America/Miquelon': 'Saint Pierre Standard Time', 'America/Moncton': 'Atlantic Standard Time', 'America/Monterrey': 'Central Standard Time (Mexico)', 'America/Montevideo': 'Montevideo Standard Time', 'America/Montreal': 'Eastern Standard Time', 'America/Montserrat': 'SA Western Standard Time', 'America/Nassau': 'Eastern Standard Time', 'America/New_York': 'Eastern Standard Time', 'America/Nipigon': 'Eastern Standard Time', 'America/Nome': 'Alaskan Standard Time', 'America/Noronha': 'UTC-02', 'America/North_Dakota/Beulah': 'Central Standard Time', 'America/North_Dakota/Center': 'Central Standard Time', 'America/North_Dakota/New_Salem': 'Central Standard Time', 'America/Ojinaga': 'Mountain Standard Time', 'America/Panama': 'SA Pacific Standard Time', 'America/Pangnirtung': 'Eastern Standard Time', 'America/Paramaribo': 'SA Eastern Standard Time', 'America/Phoenix': 'US Mountain Standard Time', 'America/Port-au-Prince': 'Haiti Standard Time', 'America/Port_of_Spain': 'SA Western Standard Time', 'America/Porto_Acre': 'SA Pacific Standard Time', 'America/Porto_Velho': 'SA Western Standard Time', 'America/Puerto_Rico': 'SA Western Standard Time', 'America/Punta_Arenas': 'Magallanes Standard Time', 'America/Rainy_River': 'Central Standard Time', 'America/Rankin_Inlet': 'Central Standard Time', 'America/Recife': 'SA Eastern Standard Time', 'America/Regina': 'Canada Central Standard Time', 'America/Resolute': 'Central Standard Time', 'America/Rio_Branco': 'SA Pacific Standard Time', 'America/Santa_Isabel': 'Pacific Standard Time (Mexico)', 'America/Santarem': 'SA Eastern Standard Time', 'America/Santiago': 'Pacific SA Standard Time', 'America/Santo_Domingo': 'SA Western Standard Time', 'America/Sao_Paulo': 'E. South America Standard Time', 'America/Scoresbysund': 'Azores Standard Time', 'America/Shiprock': 'Mountain Standard Time', 'America/Sitka': 'Alaskan Standard Time', 'America/St_Barthelemy': 'SA Western Standard Time', 'America/St_Johns': 'Newfoundland Standard Time', 'America/St_Kitts': 'SA Western Standard Time', 'America/St_Lucia': 'SA Western Standard Time', 'America/St_Thomas': 'SA Western Standard Time', 'America/St_Vincent': 'SA Western Standard Time', 'America/Swift_Current': 'Canada Central Standard Time', 'America/Tegucigalpa': 'Central America Standard Time', 'America/Thule': 'Atlantic Standard Time', 'America/Thunder_Bay': 'Eastern Standard Time', 'America/Tijuana': 'Pacific Standard Time (Mexico)', 'America/Toronto': 'Eastern Standard Time', 'America/Tortola': 'SA Western Standard Time', 'America/Vancouver': 'Pacific Standard Time', 'America/Virgin': 'SA Western Standard Time', 'America/Whitehorse': 'Pacific Standard Time', 'America/Winnipeg': 'Central Standard Time', 'America/Yakutat': 'Alaskan Standard Time', 'America/Yellowknife': 'Mountain Standard Time', 'Antarctica/Casey': 'Central Pacific Standard Time', 'Antarctica/Davis': 'SE Asia Standard Time', 'Antarctica/DumontDUrville': 'West Pacific Standard Time', 'Antarctica/Macquarie': 'Central Pacific Standard Time', 'Antarctica/Mawson': 'West Asia Standard Time', 'Antarctica/McMurdo': 'New Zealand Standard Time', 'Antarctica/Palmer': 'Magallanes Standard Time', 'Antarctica/Rothera': 'SA Eastern Standard Time', 'Antarctica/South_Pole': 'New Zealand Standard Time', 'Antarctica/Syowa': 'E. Africa Standard Time', 'Antarctica/Vostok': 'Central Asia Standard Time', 'Arctic/Longyearbyen': 'W. Europe Standard Time', 'Asia/Aden': 'Arab Standard Time', 'Asia/Almaty': 'Central Asia Standard Time', 'Asia/Amman': 'Jordan Standard Time', 'Asia/Anadyr': 'Russia Time Zone 11', 'Asia/Aqtau': 'West Asia Standard Time', 'Asia/Aqtobe': 'West Asia Standard Time', 'Asia/Ashgabat': 'West Asia Standard Time', 'Asia/Ashkhabad': 'West Asia Standard Time', 'Asia/Atyrau': 'West Asia Standard Time', 'Asia/Baghdad': 'Arabic Standard Time', 'Asia/Bahrain': 'Arab Standard Time', 'Asia/Baku': 'Azerbaijan Standard Time', 'Asia/Bangkok': 'SE Asia Standard Time', 'Asia/Barnaul': 'Altai Standard Time', 'Asia/Beirut': 'Middle East Standard Time', 'Asia/Bishkek': 'Central Asia Standard Time', 'Asia/Brunei': 'Singapore Standard Time', 'Asia/Calcutta': 'India Standard Time', 'Asia/Chita': 'Transbaikal Standard Time', 'Asia/Choibalsan': 'Ulaanbaatar Standard Time', 'Asia/Chongqing': 'China Standard Time', 'Asia/Chungking': 'China Standard Time', 'Asia/Colombo': 'Sri Lanka Standard Time', 'Asia/Dacca': 'Bangladesh Standard Time', 'Asia/Damascus': 'Syria Standard Time', 'Asia/Dhaka': 'Bangladesh Standard Time', 'Asia/Dili': 'Tokyo Standard Time', 'Asia/Dubai': 'Arabian Standard Time', 'Asia/Dushanbe': 'West Asia Standard Time', 'Asia/Famagusta': 'Turkey Standard Time', 'Asia/Gaza': 'West Bank Standard Time', 'Asia/Harbin': 'China Standard Time', 'Asia/Hebron': 'West Bank Standard Time', 'Asia/Hong_Kong': 'China Standard Time', 'Asia/Hovd': 'W. Mongolia Standard Time', 'Asia/Irkutsk': 'North Asia East Standard Time', 'Asia/Jakarta': 'SE Asia Standard Time', 'Asia/Jayapura': 'Tokyo Standard Time', 'Asia/Jerusalem': 'Israel Standard Time', 'Asia/Kabul': 'Afghanistan Standard Time', 'Asia/Kamchatka': 'Russia Time Zone 11', 'Asia/Karachi': 'Pakistan Standard Time', 'Asia/Kashgar': 'Central Asia Standard Time', 'Asia/Katmandu': 'Nepal Standard Time', 'Asia/Khandyga': 'Yakutsk Standard Time', 'Asia/Krasnoyarsk': 'North Asia Standard Time', 'Asia/Kuala_Lumpur': 'Singapore Standard Time', 'Asia/Kuching': 'Singapore Standard Time', 'Asia/Kuwait': 'Arab Standard Time', 'Asia/Macao': 'China Standard Time', 'Asia/Macau': 'China Standard Time', 'Asia/Magadan': 'Magadan Standard Time', 'Asia/Makassar': 'Singapore Standard Time', 'Asia/Manila': 'Singapore Standard Time', 'Asia/Muscat': 'Arabian Standard Time', 'Asia/Nicosia': 'GTB Standard Time', 'Asia/Novokuznetsk': 'North Asia Standard Time', 'Asia/Novosibirsk': 'N. Central Asia Standard Time', 'Asia/Omsk': 'Omsk Standard Time', 'Asia/Oral': 'West Asia Standard Time', 'Asia/Phnom_Penh': 'SE Asia Standard Time', 'Asia/Pontianak': 'SE Asia Standard Time', 'Asia/Pyongyang': 'North Korea Standard Time', 'Asia/Qatar': 'Arab Standard Time', 'Asia/Qyzylorda': 'Central Asia Standard Time', 'Asia/Rangoon': 'Myanmar Standard Time', 'Asia/Riyadh': 'Arab Standard Time', 'Asia/Saigon': 'SE Asia Standard Time', 'Asia/Sakhalin': 'Sakhalin Standard Time', 'Asia/Samarkand': 'West Asia Standard Time', 'Asia/Seoul': 'Korea Standard Time', 'Asia/Shanghai': 'China Standard Time', 'Asia/Singapore': 'Singapore Standard Time', 'Asia/Srednekolymsk': 'Russia Time Zone 10', 'Asia/Taipei': 'Taipei Standard Time', 'Asia/Tashkent': 'West Asia Standard Time', 'Asia/Tbilisi': 'Georgian Standard Time', 'Asia/Tehran': 'Iran Standard Time', 'Asia/Tel_Aviv': 'Israel Standard Time', 'Asia/Thimbu': 'Bangladesh Standard Time', 'Asia/Thimphu': 'Bangladesh Standard Time', 'Asia/Tokyo': 'Tokyo Standard Time', 'Asia/Tomsk': 'Tomsk Standard Time', 'Asia/Ujung_Pandang': 'Singapore Standard Time', 'Asia/Ulaanbaatar': 'Ulaanbaatar Standard Time', 'Asia/Ulan_Bator': 'Ulaanbaatar Standard Time', 'Asia/Urumqi': 'Central Asia Standard Time', 'Asia/Ust-Nera': 'Vladivostok Standard Time', 'Asia/Vientiane': 'SE Asia Standard Time', 'Asia/Vladivostok': 'Vladivostok Standard Time', 'Asia/Yakutsk': 'Yakutsk Standard Time', 'Asia/Yekaterinburg': 'Ekaterinburg Standard Time', 'Asia/Yerevan': 'Caucasus Standard Time', 'Atlantic/Azores': 'Azores Standard Time', 'Atlantic/Bermuda': 'Atlantic Standard Time', 'Atlantic/Canary': 'GMT Standard Time', 'Atlantic/Cape_Verde': 'Cape Verde Standard Time', 'Atlantic/Faeroe': 'GMT Standard Time', 'Atlantic/Jan_Mayen': 'W. Europe Standard Time', 'Atlantic/Madeira': 'GMT Standard Time', 'Atlantic/Reykjavik': 'Greenwich Standard Time', 'Atlantic/South_Georgia': 'UTC-02', 'Atlantic/St_Helena': 'Greenwich Standard Time', 'Atlantic/Stanley': 'SA Eastern Standard Time', 'Australia/ACT': 'AUS Eastern Standard Time', 'Australia/Adelaide': 'Cen. Australia Standard Time', 'Australia/Brisbane': 'E. Australia Standard Time', 'Australia/Broken_Hill': 'Cen. Australia Standard Time', 'Australia/Canberra': 'AUS Eastern Standard Time', 'Australia/Currie': 'Tasmania Standard Time', 'Australia/Darwin': 'AUS Central Standard Time', 'Australia/Eucla': 'Aus Central W. Standard Time', 'Australia/Hobart': 'Tasmania Standard Time', 'Australia/LHI': 'Lord Howe Standard Time', 'Australia/Lindeman': 'E. Australia Standard Time', 'Australia/Lord_Howe': 'Lord Howe Standard Time', 'Australia/Melbourne': 'AUS Eastern Standard Time', 'Australia/NSW': 'AUS Eastern Standard Time', 'Australia/North': 'AUS Central Standard Time', 'Australia/Perth': 'W. Australia Standard Time', 'Australia/Queensland': 'E. Australia Standard Time', 'Australia/South': 'Cen. Australia Standard Time', 'Australia/Sydney': 'AUS Eastern Standard Time', 'Australia/Tasmania': 'Tasmania Standard Time', 'Australia/Victoria': 'AUS Eastern Standard Time', 'Australia/West': 'W. Australia Standard Time', 'Australia/Yancowinna': 'Cen. Australia Standard Time', 'Brazil/Acre': 'SA Pacific Standard Time', 'Brazil/DeNoronha': 'UTC-02', 'Brazil/East': 'E. South America Standard Time', 'Brazil/West': 'SA Western Standard Time', 'CST6CDT': 'Central Standard Time', 'Canada/Atlantic': 'Atlantic Standard Time', 'Canada/Central': 'Central Standard Time', 'Canada/Eastern': 'Eastern Standard Time', 'Canada/Mountain': 'Mountain Standard Time', 'Canada/Newfoundland': 'Newfoundland Standard Time', 'Canada/Pacific': 'Pacific Standard Time', 'Canada/Saskatchewan': 'Canada Central Standard Time', 'Canada/Yukon': 'Pacific Standard Time', 'Chile/Continental': 'Pacific SA Standard Time', 'Chile/EasterIsland': 'Easter Island Standard Time', 'Cuba': 'Cuba Standard Time', 'EST5EDT': 'Eastern Standard Time', 'Egypt': 'Egypt Standard Time', 'Eire': 'GMT Standard Time', 'Etc/GMT': 'UTC', 'Etc/GMT+1': 'Cape Verde Standard Time', 'Etc/GMT+10': 'Hawaiian Standard Time', 'Etc/GMT+11': 'UTC-11', 'Etc/GMT+12': 'Dateline Standard Time', 'Etc/GMT+2': 'UTC-02', 'Etc/GMT+3': 'SA Eastern Standard Time', 'Etc/GMT+4': 'SA Western Standard Time', 'Etc/GMT+5': 'SA Pacific Standard Time', 'Etc/GMT+6': 'Central America Standard Time', 'Etc/GMT+7': 'US Mountain Standard Time', 'Etc/GMT+8': 'UTC-08', 'Etc/GMT+9': 'UTC-09', 'Etc/GMT-1': 'W. Central Africa Standard Time', 'Etc/GMT-10': 'West Pacific Standard Time', 'Etc/GMT-11': 'Central Pacific Standard Time', 'Etc/GMT-12': 'UTC+12', 'Etc/GMT-13': 'UTC+13', 'Etc/GMT-14': 'Line Islands Standard Time', 'Etc/GMT-2': 'South Africa Standard Time', 'Etc/GMT-3': 'E. Africa Standard Time', 'Etc/GMT-4': 'Arabian Standard Time', 'Etc/GMT-5': 'West Asia Standard Time', 'Etc/GMT-6': 'Central Asia Standard Time', 'Etc/GMT-7': 'SE Asia Standard Time', 'Etc/GMT-8': 'Singapore Standard Time', 'Etc/GMT-9': 'Tokyo Standard Time', 'Etc/UTC': 'UTC', 'Europe/Amsterdam': 'W. Europe Standard Time', 'Europe/Andorra': 'W. Europe Standard Time', 'Europe/Astrakhan': 'Astrakhan Standard Time', 'Europe/Athens': 'GTB Standard Time', 'Europe/Belfast': 'GMT Standard Time', 'Europe/Belgrade': 'Central Europe Standard Time', 'Europe/Berlin': 'W. Europe Standard Time', 'Europe/Bratislava': 'Central Europe Standard Time', 'Europe/Brussels': 'Romance Standard Time', 'Europe/Bucharest': 'GTB Standard Time', 'Europe/Budapest': 'Central Europe Standard Time', 'Europe/Busingen': 'W. Europe Standard Time', 'Europe/Chisinau': 'E. Europe Standard Time', 'Europe/Copenhagen': 'Romance Standard Time', 'Europe/Dublin': 'GMT Standard Time', 'Europe/Gibraltar': 'W. Europe Standard Time', 'Europe/Guernsey': 'GMT Standard Time', 'Europe/Helsinki': 'FLE Standard Time', 'Europe/Isle_of_Man': 'GMT Standard Time', 'Europe/Istanbul': 'Turkey Standard Time', 'Europe/Jersey': 'GMT Standard Time', 'Europe/Kaliningrad': 'Kaliningrad Standard Time', 'Europe/Kiev': 'FLE Standard Time', 'Europe/Kirov': 'Russian Standard Time', 'Europe/Lisbon': 'GMT Standard Time', 'Europe/Ljubljana': 'Central Europe Standard Time', 'Europe/London': 'GMT Standard Time', 'Europe/Luxembourg': 'W. Europe Standard Time', 'Europe/Madrid': 'Romance Standard Time', 'Europe/Malta': 'W. Europe Standard Time', 'Europe/Mariehamn': 'FLE Standard Time', 'Europe/Minsk': 'Belarus Standard Time', 'Europe/Monaco': 'W. Europe Standard Time', 'Europe/Moscow': 'Russian Standard Time', 'Europe/Oslo': 'W. Europe Standard Time', 'Europe/Paris': 'Romance Standard Time', 'Europe/Podgorica': 'Central Europe Standard Time', 'Europe/Prague': 'Central Europe Standard Time', 'Europe/Riga': 'FLE Standard Time', 'Europe/Rome': 'W. Europe Standard Time', 'Europe/Samara': 'Russia Time Zone 3', 'Europe/San_Marino': 'W. Europe Standard Time', 'Europe/Sarajevo': 'Central European Standard Time', 'Europe/Saratov': 'Saratov Standard Time', 'Europe/Simferopol': 'Russian Standard Time', 'Europe/Skopje': 'Central European Standard Time', 'Europe/Sofia': 'FLE Standard Time', 'Europe/Stockholm': 'W. Europe Standard Time', 'Europe/Tallinn': 'FLE Standard Time', 'Europe/Tirane': 'Central Europe Standard Time', 'Europe/Tiraspol': 'E. Europe Standard Time', 'Europe/Ulyanovsk': 'Astrakhan Standard Time', 'Europe/Uzhgorod': 'FLE Standard Time', 'Europe/Vaduz': 'W. Europe Standard Time', 'Europe/Vatican': 'W. Europe Standard Time', 'Europe/Vienna': 'W. Europe Standard Time', 'Europe/Vilnius': 'FLE Standard Time', 'Europe/Volgograd': 'Russian Standard Time', 'Europe/Warsaw': 'Central European Standard Time', 'Europe/Zagreb': 'Central European Standard Time', 'Europe/Zaporozhye': 'FLE Standard Time', 'Europe/Zurich': 'W. Europe Standard Time', 'GB': 'GMT Standard Time', 'GB-Eire': 'GMT Standard Time', 'GMT+0': 'UTC', 'GMT-0': 'UTC', 'GMT0': 'UTC', 'Greenwich': 'UTC', 'Hongkong': 'China Standard Time', 'Iceland': 'Greenwich Standard Time', 'Indian/Antananarivo': 'E. Africa Standard Time', 'Indian/Chagos': 'Central Asia Standard Time', 'Indian/Christmas': 'SE Asia Standard Time', 'Indian/Cocos': 'Myanmar Standard Time', 'Indian/Comoro': 'E. Africa Standard Time', 'Indian/Kerguelen': 'West Asia Standard Time', 'Indian/Mahe': 'Mauritius Standard Time', 'Indian/Maldives': 'West Asia Standard Time', 'Indian/Mauritius': 'Mauritius Standard Time', 'Indian/Mayotte': 'E. Africa Standard Time', 'Indian/Reunion': 'Mauritius Standard Time', 'Iran': 'Iran Standard Time', 'Israel': 'Israel Standard Time', 'Jamaica': 'SA Pacific Standard Time', 'Japan': 'Tokyo Standard Time', 'Kwajalein': 'UTC+12', 'Libya': 'Libya Standard Time', 'MST7MDT': 'Mountain Standard Time', 'Mexico/BajaNorte': 'Pacific Standard Time (Mexico)', 'Mexico/BajaSur': 'Mountain Standard Time (Mexico)', 'Mexico/General': 'Central Standard Time (Mexico)', 'NZ': 'New Zealand Standard Time', 'NZ-CHAT': 'Chatham Islands Standard Time', 'Navajo': 'Mountain Standard Time', 'PRC': 'China Standard Time', 'PST8PDT': 'Pacific Standard Time', 'Pacific/Apia': 'Samoa Standard Time', 'Pacific/Auckland': 'New Zealand Standard Time', 'Pacific/Bougainville': 'Bougainville Standard Time', 'Pacific/Chatham': 'Chatham Islands Standard Time', 'Pacific/Easter': 'Easter Island Standard Time', 'Pacific/Efate': 'Central Pacific Standard Time', 'Pacific/Enderbury': 'UTC+13', 'Pacific/Fakaofo': 'UTC+13', 'Pacific/Fiji': 'Fiji Standard Time', 'Pacific/Funafuti': 'UTC+12', 'Pacific/Galapagos': 'Central America Standard Time', 'Pacific/Gambier': 'UTC-09', 'Pacific/Guadalcanal': 'Central Pacific Standard Time', 'Pacific/Guam': 'West Pacific Standard Time', 'Pacific/Honolulu': 'Hawaiian Standard Time', 'Pacific/Johnston': 'Hawaiian Standard Time', 'Pacific/Kiritimati': 'Line Islands Standard Time', 'Pacific/Kosrae': 'Central Pacific Standard Time', 'Pacific/Kwajalein': 'UTC+12', 'Pacific/Majuro': 'UTC+12', 'Pacific/Marquesas': 'Marquesas Standard Time', 'Pacific/Midway': 'UTC-11', 'Pacific/Nauru': 'UTC+12', 'Pacific/Niue': 'UTC-11', 'Pacific/Norfolk': 'Norfolk Standard Time', 'Pacific/Noumea': 'Central Pacific Standard Time', 'Pacific/Pago_Pago': 'UTC-11', 'Pacific/Palau': 'Tokyo Standard Time', 'Pacific/Pitcairn': 'UTC-08', 'Pacific/Ponape': 'Central Pacific Standard Time', 'Pacific/Port_Moresby': 'West Pacific Standard Time', 'Pacific/Rarotonga': 'Hawaiian Standard Time', 'Pacific/Saipan': 'West Pacific Standard Time', 'Pacific/Samoa': 'UTC-11', 'Pacific/Tahiti': 'Hawaiian Standard Time', 'Pacific/Tarawa': 'UTC+12', 'Pacific/Tongatapu': 'Tonga Standard Time', 'Pacific/Truk': 'West Pacific Standard Time', 'Pacific/Wake': 'UTC+12', 'Pacific/Wallis': 'UTC+12', 'Poland': 'Central European Standard Time', 'Portugal': 'GMT Standard Time', 'ROC': 'Taipei Standard Time', 'ROK': 'Korea Standard Time', 'Singapore': 'Singapore Standard Time', 'Turkey': 'Turkey Standard Time', 'US/Alaska': 'Alaskan Standard Time', 'US/Aleutian': 'Aleutian Standard Time', 'US/Arizona': 'US Mountain Standard Time', 'US/Central': 'Central Standard Time', 'US/Eastern': 'Eastern Standard Time', 'US/Hawaii': 'Hawaiian Standard Time', 'US/Indiana-Starke': 'Central Standard Time', 'US/Michigan': 'Eastern Standard Time', 'US/Mountain': 'Mountain Standard Time', 'US/Pacific': 'Pacific Standard Time', 'US/Samoa': 'UTC-11', 'UTC': 'UTC', 'Universal': 'UTC', 'W-SU': 'Russian Standard Time', 'Zulu': 'UTC'} tzlocal-1.5.1/update_windows_mappings.py000077500000000000000000000063401321022135100204660ustar00rootroot00000000000000#!/usr/bin/env python3 # This script generates the mapping between MS Windows timezone names and # tzdata/Olsen timezone names, by retrieving a file: # http://unicode.org/cldr/data/common/supplemental/supplementalData.xml # and parsing it, and from this generating the file windows_tz.py. # # It must be run with Python 3. import ftplib import logging from io import BytesIO from pprint import pprint import tarfile from urllib.parse import urlparse from urllib.request import urlopen from xml.dom import minidom WIN_ZONES_URL = 'http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml' ZONEINFO_URL = 'ftp://ftp.iana.org/tz/tzdata-latest.tar.gz' logging.basicConfig(level=logging.INFO) log = logging.getLogger() def update_old_names(): """Fetches the list of old tz names and returns a mapping""" url = urlparse(ZONEINFO_URL) log.info('Connecting to %s' % url.netloc) ftp = ftplib.FTP(url.netloc) ftp.login() gzfile = BytesIO() log.info('Fetching zoneinfo database') ftp.retrbinary('RETR ' + url.path, gzfile.write) gzfile.seek(0) log.info('Extracting backwards data') archive = tarfile.open(mode="r:gz", fileobj=gzfile) backward = {} for line in archive.extractfile('backward').readlines(): if line[0] == '#': continue if len(line.strip()) == 0: continue parts = line.split() if parts[0] != b'Link': continue backward[parts[2].decode('ascii')] = parts[1].decode('ascii') return backward def update_windows_zones(): backward = update_old_names() log.info('Fetching Windows mapping info from unicode.org') source = urlopen(WIN_ZONES_URL).read() dom = minidom.parseString(source) for element in dom.getElementsByTagName('mapTimezones'): if element.getAttribute('type') == 'windows': break log.info('Making windows mapping') win_tz = {} tz_win = {} for mapping in element.getElementsByTagName('mapZone'): if mapping.getAttribute('territory') == '001': win_tz[mapping.getAttribute('other')] = mapping.getAttribute('type').split(' ')[0] if win_tz[mapping.getAttribute('other')].startswith('Etc'): print (win_tz[mapping.getAttribute('other')], mapping.getAttribute('type').split(' ')[0]) for tz_name in mapping.getAttribute('type').split(' '): tz_win[tz_name] = mapping.getAttribute('other') log.info('Adding backwards data') # Map in the backwards compatible zone names for backward_compat_name, standard_name in backward.items(): win_zone = tz_win.get(standard_name, None) if win_zone: tz_win[backward_compat_name] = win_zone # Etc/UTC is a common but non-standard alias for Etc/GMT: tz_win['Etc/UTC'] = 'UTC' log.info('Writing mapping') with open('tzlocal/windows_tz.py', "wt") as out: out.write("# This file is autogenerated by the update_windows_mapping.py script\n" "# Do not edit.\nwin_tz = ") pprint(win_tz, out) out.write("\n# Old name for the win_tz variable:\ntz_names = win_tz\n\ntz_win = ") pprint(tz_win, out) log.info('Done') if __name__ == '__main__': update_windows_zones()