aboutsummaryrefslogtreecommitdiffhomepage
path: root/libs/tzlocal
diff options
context:
space:
mode:
authormorpheus65535 <[email protected]>2018-09-16 20:27:00 -0400
committermorpheus65535 <[email protected]>2018-09-16 20:33:04 -0400
commit0f061f21226f91883c841f85ceef31b30981277a (patch)
treea1350723ae688ccbae4d4ca564cc4175ccc73996 /libs/tzlocal
parent8b681d8a151a3b41d3aaa5bfdd7a082bdda7896c (diff)
downloadbazarr-0f061f21226f91883c841f85ceef31b30981277a.tar.gz
bazarr-0f061f21226f91883c841f85ceef31b30981277a.zip
Include dependencies and remove requirements.txt
Diffstat (limited to 'libs/tzlocal')
-rw-r--r--libs/tzlocal/__init__.py5
-rw-r--r--libs/tzlocal/test_data/Hararebin0 -> 157 bytes
-rw-r--r--libs/tzlocal/test_data/localtime/etc/localtimebin0 -> 157 bytes
-rw-r--r--libs/tzlocal/test_data/symlink_localtime/etc/localtimebin0 -> 157 bytes
-rw-r--r--libs/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/Africa/Hararebin0 -> 157 bytes
-rw-r--r--libs/tzlocal/test_data/timezone/etc/timezone1
-rw-r--r--libs/tzlocal/test_data/timezone_setting/etc/conf.d/clock1
-rw-r--r--libs/tzlocal/test_data/vardbzoneinfo/var/db/zoneinfo1
-rw-r--r--libs/tzlocal/test_data/zone_setting/etc/sysconfig/clock1
-rw-r--r--libs/tzlocal/tests.py134
-rw-r--r--libs/tzlocal/unix.py138
-rw-r--r--libs/tzlocal/win32.py95
-rw-r--r--libs/tzlocal/windows_tz.py690
13 files changed, 1066 insertions, 0 deletions
diff --git a/libs/tzlocal/__init__.py b/libs/tzlocal/__init__.py
new file mode 100644
index 000000000..c8196d66d
--- /dev/null
+++ b/libs/tzlocal/__init__.py
@@ -0,0 +1,5 @@
+import sys
+if sys.platform == 'win32':
+ from tzlocal.win32 import get_localzone, reload_localzone
+else:
+ from tzlocal.unix import get_localzone, reload_localzone
diff --git a/libs/tzlocal/test_data/Harare b/libs/tzlocal/test_data/Harare
new file mode 100644
index 000000000..258b39363
--- /dev/null
+++ b/libs/tzlocal/test_data/Harare
Binary files differ
diff --git a/libs/tzlocal/test_data/localtime/etc/localtime b/libs/tzlocal/test_data/localtime/etc/localtime
new file mode 100644
index 000000000..258b39363
--- /dev/null
+++ b/libs/tzlocal/test_data/localtime/etc/localtime
Binary files differ
diff --git a/libs/tzlocal/test_data/symlink_localtime/etc/localtime b/libs/tzlocal/test_data/symlink_localtime/etc/localtime
new file mode 100644
index 000000000..258b39363
--- /dev/null
+++ b/libs/tzlocal/test_data/symlink_localtime/etc/localtime
Binary files differ
diff --git a/libs/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/Africa/Harare b/libs/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/Africa/Harare
new file mode 100644
index 000000000..258b39363
--- /dev/null
+++ b/libs/tzlocal/test_data/symlink_localtime/usr/share/zoneinfo/Africa/Harare
Binary files differ
diff --git a/libs/tzlocal/test_data/timezone/etc/timezone b/libs/tzlocal/test_data/timezone/etc/timezone
new file mode 100644
index 000000000..e7003c445
--- /dev/null
+++ b/libs/tzlocal/test_data/timezone/etc/timezone
@@ -0,0 +1 @@
+Africa/Harare# We allow comments. It's unusual, but has happened
diff --git a/libs/tzlocal/test_data/timezone_setting/etc/conf.d/clock b/libs/tzlocal/test_data/timezone_setting/etc/conf.d/clock
new file mode 100644
index 000000000..95032934d
--- /dev/null
+++ b/libs/tzlocal/test_data/timezone_setting/etc/conf.d/clock
@@ -0,0 +1 @@
+TIMEZONE = "Africa/Harare"
diff --git a/libs/tzlocal/test_data/vardbzoneinfo/var/db/zoneinfo b/libs/tzlocal/test_data/vardbzoneinfo/var/db/zoneinfo
new file mode 100644
index 000000000..028ec1d7a
--- /dev/null
+++ b/libs/tzlocal/test_data/vardbzoneinfo/var/db/zoneinfo
@@ -0,0 +1 @@
+Africa/Harare localhost # The host is not a part of the format, but is allowed.
diff --git a/libs/tzlocal/test_data/zone_setting/etc/sysconfig/clock b/libs/tzlocal/test_data/zone_setting/etc/sysconfig/clock
new file mode 100644
index 000000000..e1ddbfd6e
--- /dev/null
+++ b/libs/tzlocal/test_data/zone_setting/etc/sysconfig/clock
@@ -0,0 +1 @@
+ZONE="Africa/Harare"
diff --git a/libs/tzlocal/tests.py b/libs/tzlocal/tests.py
new file mode 100644
index 000000000..ace7ffe63
--- /dev/null
+++ b/libs/tzlocal/tests.py
@@ -0,0 +1,134 @@
+import 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()
diff --git a/libs/tzlocal/unix.py b/libs/tzlocal/unix.py
new file mode 100644
index 000000000..9f7a706f8
--- /dev/null
+++ b/libs/tzlocal/unix.py
@@ -0,0 +1,138 @@
+import 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
diff --git a/libs/tzlocal/win32.py b/libs/tzlocal/win32.py
new file mode 100644
index 000000000..86dd99fc0
--- /dev/null
+++ b/libs/tzlocal/win32.py
@@ -0,0 +1,95 @@
+try:
+ 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
diff --git a/libs/tzlocal/windows_tz.py b/libs/tzlocal/windows_tz.py
new file mode 100644
index 000000000..123980b80
--- /dev/null
+++ b/libs/tzlocal/windows_tz.py
@@ -0,0 +1,690 @@
+# 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'}