about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/tzlocal
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/tzlocal')
-rw-r--r--.venv/lib/python3.12/site-packages/tzlocal/__init__.py19
-rw-r--r--.venv/lib/python3.12/site-packages/tzlocal/py.typed0
-rw-r--r--.venv/lib/python3.12/site-packages/tzlocal/unix.py249
-rw-r--r--.venv/lib/python3.12/site-packages/tzlocal/utils.py108
-rw-r--r--.venv/lib/python3.12/site-packages/tzlocal/win32.py144
-rw-r--r--.venv/lib/python3.12/site-packages/tzlocal/windows_tz.py736
6 files changed, 1256 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/tzlocal/__init__.py b/.venv/lib/python3.12/site-packages/tzlocal/__init__.py
new file mode 100644
index 00000000..8296a15d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/tzlocal/__init__.py
@@ -0,0 +1,19 @@
+import sys
+
+if sys.platform == "win32":
+    from tzlocal.win32 import (
+        get_localzone,
+        get_localzone_name,
+        reload_localzone,
+    )
+else:
+    from tzlocal.unix import get_localzone, get_localzone_name, reload_localzone
+
+from tzlocal.utils import assert_tz_offset
+
+__all__ = [
+    "get_localzone",
+    "get_localzone_name",
+    "reload_localzone",
+    "assert_tz_offset",
+]
diff --git a/.venv/lib/python3.12/site-packages/tzlocal/py.typed b/.venv/lib/python3.12/site-packages/tzlocal/py.typed
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/tzlocal/py.typed
diff --git a/.venv/lib/python3.12/site-packages/tzlocal/unix.py b/.venv/lib/python3.12/site-packages/tzlocal/unix.py
new file mode 100644
index 00000000..a1a8d897
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/tzlocal/unix.py
@@ -0,0 +1,249 @@
+import logging
+import os
+import re
+import sys
+import warnings
+from datetime import timezone
+
+from tzlocal import utils
+
+import zoneinfo
+
+_cache_tz = None
+_cache_tz_name = None
+
+log = logging.getLogger("tzlocal")
+
+
+def _get_localzone_name(_root="/"):
+    """Tries to find the local timezone configuration.
+
+    This method finds the timezone name, if it can, or it returns None.
+
+    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."""
+
+    # First try the ENV setting.
+    tzenv = utils._tz_name_from_env()
+    if tzenv:
+        return tzenv
+
+    # Are we under Termux on Android?
+    if os.path.exists(os.path.join(_root, "system/bin/getprop")):
+        log.debug("This looks like Termux")
+
+        import subprocess
+
+        try:
+            androidtz = (
+                subprocess.check_output(["getprop", "persist.sys.timezone"])
+                .strip()
+                .decode()
+            )
+            return androidtz
+        except (OSError, subprocess.CalledProcessError):
+            # proot environment or failed to getprop
+            log.debug("It's not termux?")
+            pass
+
+    # Now look for distribution specific configuration files
+    # that contain the timezone name.
+
+    # Stick all of them in a dict, to compare later.
+    found_configs = {}
+
+    for configfile in ("etc/timezone", "var/db/zoneinfo"):
+        tzpath = os.path.join(_root, configfile)
+        try:
+            with open(tzpath) as tzfile:
+                data = tzfile.read()
+                log.debug(f"{tzpath} found, contents:\n {data}")
+
+                etctz = data.strip("/ \t\r\n")
+                if not etctz:
+                    # Empty file, skip
+                    continue
+                for etctz in etctz.splitlines():
+                    # Get rid of host definitions and comments:
+                    if " " in etctz:
+                        etctz, dummy = etctz.split(" ", 1)
+                    if "#" in etctz:
+                        etctz, dummy = etctz.split("#", 1)
+                    if not etctz:
+                        continue
+
+                    found_configs[tzpath] = etctz.replace(" ", "_")
+
+        except (OSError, UnicodeDecodeError):
+            # File doesn't exist or is a directory, or it's a binary file.
+            continue
+
+    # 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(r"\s*ZONE\s*=\s*\"")
+    timezone_re = re.compile(r"\s*TIMEZONE\s*=\s*\"")
+    end_re = re.compile('"')
+
+    for filename in ("etc/sysconfig/clock", "etc/conf.d/clock"):
+        tzpath = os.path.join(_root, filename)
+        try:
+            with open(tzpath, "rt") as tzfile:
+                data = tzfile.readlines()
+                log.debug(f"{tzpath} found, contents:\n {data}")
+
+            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
+                    found_configs[tzpath] = etctz.replace(" ", "_")
+
+        except (OSError, UnicodeDecodeError):
+            # UnicodeDecode handles when clock is symlink to /etc/localtime
+            continue
+
+    # 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):
+        log.debug(f"{tzpath} found")
+        etctz = os.path.realpath(tzpath)
+        start = etctz.find("/") + 1
+        while start != 0:
+            etctz = etctz[start:]
+            try:
+                zoneinfo.ZoneInfo(etctz)
+                tzinfo = f"{tzpath} is a symlink to"
+                found_configs[tzinfo] = etctz.replace(" ", "_")
+                # Only need first valid relative path in simlink.
+                break
+            except zoneinfo.ZoneInfoNotFoundError:
+                pass
+            start = etctz.find("/") + 1
+
+    if len(found_configs) > 0:
+        log.debug(f"{len(found_configs)} found:\n {found_configs}")
+
+        # We found some explicit config of some sort!
+        if len(found_configs) > 1:
+            # Uh-oh, multiple configs. See if they match:
+            unique_tzs = _get_unique_tzs(found_configs, _root)
+
+            if len(unique_tzs) != 1 and "etc/timezone" in str(found_configs.keys()):
+                # For some reason some distros are removing support for /etc/timezone, 
+                # which is bad, because that's the only place where the timezone is stated 
+                # in plain text, and what's worse, they don't delete it. So we can't trust 
+                # it now, so when we have conflicting configs, we just ignore it, with a warning.
+                log.warning("/etc/timezone is deprecated in some distros, and no longer reliable. "
+                            "tzlocal is ignoring it, and you can likely delete it.")
+                found_configs = {k: v for k, v in found_configs.items() if "etc/timezone" not in k}
+                unique_tzs = _get_unique_tzs(found_configs, _root)
+
+            if len(unique_tzs) != 1:
+                message = "Multiple conflicting time zone configurations found:\n"
+                for key, value in found_configs.items():
+                    message += f"{key}: {value}\n"
+                message += "Fix the configuration, or set the time zone in a TZ environment variable.\n"
+                raise zoneinfo.ZoneInfoNotFoundError(message)
+
+        # We found exactly one config! Use it.
+        return list(found_configs.values())[0]
+
+
+def _get_unique_tzs(found_configs, _root):
+    unique_tzs = set()
+    zoneinfopath = os.path.join(_root, "usr", "share", "zoneinfo")
+    directory_depth = len(zoneinfopath.split(os.path.sep))
+
+    for tzname in found_configs.values():
+        # Look them up in /usr/share/zoneinfo, and find what they
+        # really point to:
+        path = os.path.realpath(os.path.join(zoneinfopath, *tzname.split("/")))
+        real_zone_name = "/".join(path.split(os.path.sep)[directory_depth:])
+        unique_tzs.add(real_zone_name)
+
+    return unique_tzs
+
+
+def _get_localzone(_root="/"):
+    """Creates a timezone object from the timezone name.
+
+    If there is no timezone config, it will try to create a file from the
+    localtime timezone, and if there isn't one, it will default to UTC.
+
+    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."""
+
+    # First try the ENV setting.
+    tzenv = utils._tz_from_env()
+    if tzenv:
+        return tzenv
+
+    tzname = _get_localzone_name(_root)
+    if tzname is None:
+        # No explicit setting existed. Use localtime
+        log.debug("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:
+                tz = zoneinfo.ZoneInfo.from_file(tzfile, key="local")
+                break
+        else:
+            warnings.warn("Can not find any timezone configuration, defaulting to UTC.")
+            utcname = [x for x in zoneinfo.available_timezones() if "UTC" in x]
+            if utcname:
+                tz = zoneinfo.ZoneInfo(utcname[0])
+            else:
+                tz = timezone.utc
+    else:
+        tz = zoneinfo.ZoneInfo(tzname)
+
+    if _root == "/":
+        # We are using a file in etc to name the timezone.
+        # Verify that the timezone specified there is actually used:
+        utils.assert_tz_offset(tz, error=False)
+    return tz
+
+
+def get_localzone_name() -> str:
+    """Get the computers configured local timezone name, if any."""
+    global _cache_tz_name
+    if _cache_tz_name is None:
+        _cache_tz_name = _get_localzone_name()
+
+    return _cache_tz_name
+
+
+def get_localzone() -> zoneinfo.ZoneInfo:
+    """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() -> zoneinfo.ZoneInfo:
+    """Reload the cached localzone. You need to call this if the timezone has changed."""
+    global _cache_tz_name
+    global _cache_tz
+    _cache_tz_name = _get_localzone_name()
+    _cache_tz = _get_localzone()
+
+    return _cache_tz
diff --git a/.venv/lib/python3.12/site-packages/tzlocal/utils.py b/.venv/lib/python3.12/site-packages/tzlocal/utils.py
new file mode 100644
index 00000000..5a0b72e4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/tzlocal/utils.py
@@ -0,0 +1,108 @@
+import calendar
+import datetime
+import logging
+import os
+import time
+import warnings
+import zoneinfo
+
+from tzlocal import windows_tz
+
+log = logging.getLogger("tzlocal")
+
+
+def get_tz_offset(tz):
+    """Get timezone's offset using built-in function datetime.utcoffset()."""
+    return int(datetime.datetime.now(tz).utcoffset().total_seconds())
+
+
+def assert_tz_offset(tz, error=True):
+    """Assert that system's timezone offset equals to the timezone offset found.
+
+    If they don't match, we probably have a misconfiguration, for example, an
+    incorrect timezone set in /etc/timezone file in systemd distributions.
+
+    If error is True, this method will raise a ValueError, otherwise it will
+    emit a warning.
+    """
+
+    tz_offset = get_tz_offset(tz)
+    system_offset = calendar.timegm(time.localtime()) - calendar.timegm(time.gmtime())
+    # No one has timezone offsets less than a minute, so this should be close enough:
+    if abs(tz_offset - system_offset) > 60:
+        msg = (
+            f"Timezone offset does not match system offset: {tz_offset} != {system_offset}. "
+            "Please, check your config files."
+        )
+        if error:
+            raise ValueError(msg)
+        warnings.warn(msg)
+
+
+def _tz_name_from_env(tzenv=None):
+    if tzenv is None:
+        tzenv = os.environ.get("TZ")
+
+    if not tzenv:
+        return None
+
+    log.debug(f"Found a TZ environment: {tzenv}")
+
+    if tzenv[0] == ":":
+        tzenv = tzenv[1:]
+
+    if tzenv in windows_tz.tz_win:
+        # Yup, it's a timezone
+        return tzenv
+
+    if os.path.isabs(tzenv) and os.path.exists(tzenv):
+        # It's a file specification, expand it, if possible
+        parts = os.path.realpath(tzenv).split(os.sep)
+
+        # Is it a zone info zone?
+        possible_tz = "/".join(parts[-2:])
+        if possible_tz in windows_tz.tz_win:
+            # Yup, it is
+            return possible_tz
+
+        # Maybe it's a short one, like UTC?
+        if parts[-1] in windows_tz.tz_win:
+            # Indeed
+            return parts[-1]
+
+    log.debug("TZ does not contain a time zone name")
+    return None
+
+
+def _tz_from_env(tzenv=None):
+    if tzenv is None:
+        tzenv = os.environ.get("TZ")
+
+    if not tzenv:
+        return None
+
+    # Some weird format that exists:
+    if tzenv[0] == ":":
+        tzenv = tzenv[1:]
+
+    # TZ specifies a file
+    if os.path.isabs(tzenv) and os.path.exists(tzenv):
+        # Try to see if we can figure out the name
+        tzname = _tz_name_from_env(tzenv)
+        if not tzname:
+            # Nope, not a standard timezone name, just take the filename
+            tzname = tzenv.split(os.sep)[-1]
+        with open(tzenv, "rb") as tzfile:
+            return zoneinfo.ZoneInfo.from_file(tzfile, key=tzname)
+
+    # TZ must specify a zoneinfo zone.
+    try:
+        tz = zoneinfo.ZoneInfo(tzenv)
+        # That worked, so we return this:
+        return tz
+    except zoneinfo.ZoneInfoNotFoundError:
+        # Nope, it's something like "PST4DST" etc, we can't handle that.
+        raise zoneinfo.ZoneInfoNotFoundError(
+            f"tzlocal() does not support non-zoneinfo timezones like {tzenv}. \n"
+            "Please use a timezone in the form of Continent/City"
+        ) from None
diff --git a/.venv/lib/python3.12/site-packages/tzlocal/win32.py b/.venv/lib/python3.12/site-packages/tzlocal/win32.py
new file mode 100644
index 00000000..cfcdba53
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/tzlocal/win32.py
@@ -0,0 +1,144 @@
+import logging
+from datetime import datetime
+
+try:
+    import _winreg as winreg
+except ImportError:
+    import winreg
+
+import zoneinfo
+
+from tzlocal import utils
+from tzlocal.windows_tz import win_tz
+
+_cache_tz = None
+_cache_tz_name = None
+
+log = logging.getLogger("tzlocal")
+
+
+def valuestodict(key):
+    """Convert a registry key's values to a dictionary."""
+    result = {}
+    size = winreg.QueryInfoKey(key)[1]
+    for i in range(size):
+        data = winreg.EnumValue(key, i)
+        result[data[0]] = data[1]
+    return result
+
+
+def _get_dst_info(tz):
+    # Find the offset for when it doesn't have DST:
+    dst_offset = std_offset = None
+    has_dst = False
+    year = datetime.now().year
+    for dt in (datetime(year, 1, 1), datetime(year, 6, 1)):
+        if tz.dst(dt).total_seconds() == 0.0:
+            # OK, no DST during winter, get this offset
+            std_offset = tz.utcoffset(dt).total_seconds()
+        else:
+            has_dst = True
+
+    return has_dst, std_offset, dst_offset
+
+
+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.
+    tzenv = utils._tz_name_from_env()
+    if tzenv:
+        return tzenv
+
+    log.debug("Looking up time zone info from registry")
+    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 later
+
+        # 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:
+        # Don't support XP any longer
+        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 zoneinfo.ZoneInfoNotFoundError(tzkeyname)
+
+    if keyvalues.get("DynamicDaylightTimeDisabled", 0) == 1:
+        # DST is disabled, so don't return the timezone name,
+        # instead return Etc/GMT+offset
+
+        tz = zoneinfo.ZoneInfo(timezone)
+        has_dst, std_offset, dst_offset = _get_dst_info(tz)
+        if not has_dst:
+            # The DST is turned off in the windows configuration,
+            # but this timezone doesn't have DST so it doesn't matter
+            return timezone
+
+        if std_offset is None:
+            raise zoneinfo.ZoneInfoNotFoundError(
+                f"{tzkeyname} claims to not have a non-DST time!?"
+            )
+
+        if std_offset % 3600:
+            # I can't convert this to an hourly offset
+            raise zoneinfo.ZoneInfoNotFoundError(
+                f"tzlocal can't support disabling DST in the {timezone} zone."
+            )
+
+        # This has whole hours as offset, return it as Etc/GMT
+        return f"Etc/GMT{-std_offset//3600:+.0f}"
+
+    return timezone
+
+
+def get_localzone_name() -> str:
+    """Get the zoneinfo timezone name that matches the Windows-configured timezone."""
+    global _cache_tz_name
+    if _cache_tz_name is None:
+        _cache_tz_name = _get_localzone_name()
+
+    return _cache_tz_name
+
+
+def get_localzone() -> zoneinfo.ZoneInfo:
+    """Returns the zoneinfo-based tzinfo object that matches the Windows-configured timezone."""
+
+    global _cache_tz
+    if _cache_tz is None:
+        _cache_tz = zoneinfo.ZoneInfo(get_localzone_name())
+
+    if not utils._tz_name_from_env():
+        # If the timezone does NOT come from a TZ environment variable,
+        # verify that it's correct. If it's from the environment,
+        # we accept it, this is so you can run tests with different timezones.
+        utils.assert_tz_offset(_cache_tz, error=False)
+
+    return _cache_tz
+
+
+def reload_localzone() -> zoneinfo.ZoneInfo:
+    """Reload the cached localzone. You need to call this if the timezone has changed."""
+    global _cache_tz
+    global _cache_tz_name
+    _cache_tz_name = _get_localzone_name()
+    _cache_tz = zoneinfo.ZoneInfo(_cache_tz_name)
+    utils.assert_tz_offset(_cache_tz, error=False)
+    return _cache_tz
diff --git a/.venv/lib/python3.12/site-packages/tzlocal/windows_tz.py b/.venv/lib/python3.12/site-packages/tzlocal/windows_tz.py
new file mode 100644
index 00000000..3d475760
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/tzlocal/windows_tz.py
@@ -0,0 +1,736 @@
+# 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/Mazatlan",
+    "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",
+    "Qyzylorda Standard Time": "Asia/Qyzylorda",
+    "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",
+    "Sao Tome Standard Time": "Africa/Sao_Tome",
+    "Saratov Standard Time": "Europe/Saratov",
+    "Singapore Standard Time": "Asia/Singapore",
+    "South Africa Standard Time": "Africa/Johannesburg",
+    "South Sudan Standard Time": "Africa/Juba",
+    "Sri Lanka Standard Time": "Asia/Colombo",
+    "Sudan Standard Time": "Africa/Khartoum",
+    "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/UTC",
+    "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",
+    "Volgograd Standard Time": "Europe/Volgograd",
+    "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",
+    "Yukon Standard Time": "America/Whitehorse",
+}
+
+# Old name for the win_tz variable:
+tz_names = win_tz
+
+tz_win = {
+    "": "Central Standard Time (Mexico)",
+    "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/Asmara": "E. 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": "South Sudan Standard Time",
+    "Africa/Kampala": "E. Africa Standard Time",
+    "Africa/Khartoum": "Sudan 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": "Sao Tome 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/Buenos_Aires": "Argentina Standard Time",
+    "America/Argentina/Catamarca": "Argentina Standard Time",
+    "America/Argentina/ComodRivadavia": "Argentina Standard Time",
+    "America/Argentina/Cordoba": "Argentina Standard Time",
+    "America/Argentina/Jujuy": "Argentina Standard Time",
+    "America/Argentina/La_Rioja": "Argentina Standard Time",
+    "America/Argentina/Mendoza": "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/Atikokan": "SA Pacific 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": "Central Standard Time (Mexico)",
+    "America/Ciudad_Juarez": "Mountain Standard Time",
+    "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": "Greenwich Standard Time",
+    "America/Dawson": "Yukon 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/Fort_Wayne": "US Eastern 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/Indianapolis": "US Eastern 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/Louisville": "Eastern 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/Nuuk": "Greenland Standard Time",
+    "America/Ojinaga": "Central 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/Rosario": "Argentina 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": "Yukon 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": "Tasmania Standard Time",
+    "Antarctica/Mawson": "West Asia Standard Time",
+    "Antarctica/McMurdo": "New Zealand Standard Time",
+    "Antarctica/Palmer": "SA Eastern 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": "GTB Standard Time",
+    "Asia/Gaza": "West Bank Standard Time",
+    "Asia/Harbin": "China Standard Time",
+    "Asia/Hebron": "West Bank Standard Time",
+    "Asia/Ho_Chi_Minh": "SE Asia Standard Time",
+    "Asia/Hong_Kong": "China Standard Time",
+    "Asia/Hovd": "W. Mongolia Standard Time",
+    "Asia/Irkutsk": "North Asia East Standard Time",
+    "Asia/Istanbul": "Turkey 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/Kathmandu": "Nepal Standard Time",
+    "Asia/Katmandu": "Nepal Standard Time",
+    "Asia/Khandyga": "Yakutsk Standard Time",
+    "Asia/Kolkata": "India 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/Qostanay": "Central Asia Standard Time",
+    "Asia/Qyzylorda": "Qyzylorda 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/Yangon": "Myanmar 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/Faroe": "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": "Yukon 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+0": "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-0": "UTC",
+    "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/GMT0": "UTC",
+    "Etc/Greenwich": "UTC",
+    "Etc/UCT": "UTC",
+    "Etc/UTC": "UTC",
+    "Etc/Universal": "UTC",
+    "Etc/Zulu": "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/Kyiv": "FLE 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/Nicosia": "GTB 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": "Volgograd 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/Chuuk": "West Pacific 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/Kanton": "UTC+13",
+    "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/Pohnpei": "Central Pacific Standard Time",
+    "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",
+    "Pacific/Yap": "West Pacific Standard Time",
+    "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",
+    "UCT": "UTC",
+    "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",
+}