summaryrefslogtreecommitdiffstats
path: root/nikola/packages
diff options
context:
space:
mode:
Diffstat (limited to 'nikola/packages')
-rw-r--r--nikola/packages/README.md7
-rw-r--r--nikola/packages/datecond/LICENSE30
-rw-r--r--nikola/packages/datecond/__init__.py96
-rw-r--r--nikola/packages/pygments_better_html/LICENSE30
-rw-r--r--nikola/packages/pygments_better_html/LICENSE.pygments25
-rw-r--r--nikola/packages/pygments_better_html/__init__.py241
-rw-r--r--nikola/packages/tzlocal/__init__.py9
-rw-r--r--nikola/packages/tzlocal/darwin.py43
-rw-r--r--nikola/packages/tzlocal/unix.py184
-rw-r--r--nikola/packages/tzlocal/win32.py31
-rw-r--r--nikola/packages/tzlocal/windows_tz.py1226
11 files changed, 1239 insertions, 683 deletions
diff --git a/nikola/packages/README.md b/nikola/packages/README.md
index 156d43f..7265069 100644
--- a/nikola/packages/README.md
+++ b/nikola/packages/README.md
@@ -2,4 +2,9 @@ We ship some third-party things with Nikola. They live here, along with their l
Packages:
- * tzlocal by Lennart Regebro, CC0 license (modified)
+ * tzlocal by Lennart Regebro, CC0 license (modified to remove pytz dependency)
+ * datecond by Chris Warrick (Nikola contributor), 3-clause BSD license
+ (modified)
+ * pygments_better_html by Chris Warrick (Nikola contributor), 3-clause BSD license,
+ portions copyright the Pygments team (2-clause BSD license).
+
diff --git a/nikola/packages/datecond/LICENSE b/nikola/packages/datecond/LICENSE
new file mode 100644
index 0000000..d9980a8
--- /dev/null
+++ b/nikola/packages/datecond/LICENSE
@@ -0,0 +1,30 @@
+Copyright © 2016-2020, Chris Warrick.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the author of this software nor the names of
+ contributors to this software may be used to endorse or promote
+ products derived from this software without specific prior written
+ consent.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/nikola/packages/datecond/__init__.py b/nikola/packages/datecond/__init__.py
new file mode 100644
index 0000000..92e7908
--- /dev/null
+++ b/nikola/packages/datecond/__init__.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+# Date Conditionals v0.1.7
+# Copyright © 2015-2020, Chris Warrick.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the author of this software nor the names of
+# contributors to this software may be used to endorse or promote
+# products derived from this software without specific prior written
+# consent.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Date range parser."""
+
+import datetime
+import dateutil.parser
+import re
+import operator
+
+
+__all__ = ('date_in_range',)
+CLAUSE = re.compile('(year|month|day|hour|minute|second|weekday|isoweekday)?'
+ ' ?(==|!=|<=|>=|<|>) ?(.*)')
+OPERATORS = {
+ '==': operator.eq,
+ '!=': operator.ne,
+ '<=': operator.le,
+ '>=': operator.ge,
+ '<': operator.lt,
+ '>': operator.gt,
+}
+
+
+def date_in_range(date_range, date, debug=False, now=None):
+ """Check if date is in the range specified.
+
+ Format:
+ * comma-separated clauses (AND)
+ * clause: attribute comparison_operator value (spaces optional)
+ * attribute: year, month, day, hour, month, second, weekday, isoweekday
+ or empty for full datetime
+ * comparison_operator: == != <= >= < >
+ * value: integer, 'now', 'today', or dateutil-compatible date input
+
+ The optional `now` parameter can be used to provide a specific `now`/`today` value
+ (if none is provided, datetime.datetime.now()/datetime.date.today() is used).
+ """
+ out = True
+
+ for item in date_range.split(','):
+ attribute, comparison_operator, value = CLAUSE.match(
+ item.strip()).groups()
+ if attribute in ('weekday', 'isoweekday'):
+ left = getattr(date, attribute)()
+ right = int(value)
+ elif value == 'now':
+ left = date
+ right = now or datetime.datetime.now()
+ elif value == 'today':
+ left = date.date() if isinstance(date, datetime.datetime) else date
+ if now:
+ right = now.date() if isinstance(now, datetime.datetime) else now
+ else:
+ right = datetime.date.today()
+ elif attribute:
+ left = getattr(date, attribute)
+ right = int(value)
+ else:
+ left = date
+ right = dateutil.parser.parse(value)
+ if debug: # pragma: no cover
+ print(" <{0} {1} {2}>".format(left, comparison_operator, right))
+ out = out and OPERATORS[comparison_operator](left, right)
+ return out
diff --git a/nikola/packages/pygments_better_html/LICENSE b/nikola/packages/pygments_better_html/LICENSE
new file mode 100644
index 0000000..196413e
--- /dev/null
+++ b/nikola/packages/pygments_better_html/LICENSE
@@ -0,0 +1,30 @@
+Copyright © 2020, Chris Warrick.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the author of this software nor the names of
+ contributors to this software may be used to endorse or promote
+ products derived from this software without specific prior written
+ consent.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/nikola/packages/pygments_better_html/LICENSE.pygments b/nikola/packages/pygments_better_html/LICENSE.pygments
new file mode 100644
index 0000000..13d1c74
--- /dev/null
+++ b/nikola/packages/pygments_better_html/LICENSE.pygments
@@ -0,0 +1,25 @@
+Copyright (c) 2006-2019 by the respective authors (see AUTHORS file).
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/nikola/packages/pygments_better_html/__init__.py b/nikola/packages/pygments_better_html/__init__.py
new file mode 100644
index 0000000..ed6e004
--- /dev/null
+++ b/nikola/packages/pygments_better_html/__init__.py
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+"""Better HTML formatter for Pygments.
+
+Copyright © 2020, Chris Warrick.
+License: 3-clause BSD.
+Portions copyright © 2006-2019, the Pygments authors. (2-clause BSD).
+"""
+
+__all__ = ["BetterHtmlFormatter"]
+__version__ = "0.1.4"
+
+import enum
+import re
+import warnings
+
+from pygments.formatters.html import HtmlFormatter
+
+MANY_SPACES = re.compile("( +)")
+
+
+def _sp_to_nbsp(m):
+ return "&nbsp;" * (m.end() - m.start())
+
+
+class BetterLinenos(enum.Enum):
+ TABLE = "table"
+ OL = "ol"
+
+
+class BetterHtmlFormatter(HtmlFormatter):
+ r"""
+ Format tokens as HTML 4 ``<span>`` tags, with alternate formatting styles.
+
+ * ``linenos = 'table'`` renders each line of code in a separate table row
+ * ``linenos = 'ol'`` renders each line in a <li> element (inside <ol>)
+
+ Both options allow word wrap and don't include line numbers when copying.
+ """
+
+ name = "HTML"
+ aliases = ["html"]
+ filenames = ["*.html", "*.htm"]
+
+ def __init__(self, **options):
+ """Initialize the formatter."""
+ super().__init__(**options)
+ self.linenos_name = self.options.get("linenos", "table")
+ if self.linenos_name is False:
+ self.linenos_val = False
+ self.linenos = 0
+ elif self.linenos_name is True:
+ self.linenos_name = "table"
+ if self.linenos_name is not False:
+ self.linenos_val = BetterLinenos(self.linenos_name)
+ self.linenos = 2 if self.linenos_val == BetterLinenos.OL else 1
+
+ def get_style_defs(self, arg=None, wrapper_classes=None):
+ """Generate CSS style definitions.
+
+ Return CSS style definitions for the classes produced by the current
+ highlighting style. ``arg`` can be a string or list of selectors to
+ insert before the token type classes. ``wrapper_classes`` are a list of
+ classes for the wrappers, defaults to the ``cssclass`` option.
+ """
+ base = super().get_style_defs(arg)
+ new_styles = (
+ ("{0} table, {0} tr, {0} td", "border-spacing: 0; border-collapse: separate; padding: 0"),
+ ("{0} pre", "white-space: pre-wrap; line-height: normal"),
+ (
+ "{0}table td.linenos",
+ "vertical-align: top; padding-left: 10px; padding-right: 10px; user-select: none; -webkit-user-select: none",
+ ),
+ # Hack for Safari (user-select does not affect copy-paste)
+ ("{0}table td.linenos code:before", "content: attr(data-line-number)"),
+ ("{0}table td.code", "overflow-wrap: normal; border-collapse: collapse"),
+ (
+ "{0}table td.code code",
+ "overflow: unset; border: none; padding: 0; margin: 0; white-space: pre-wrap; line-height: unset; background: none",
+ ),
+ ("{0} .lineno.nonumber", "list-style: none"),
+ )
+ new_styles_code = []
+ if wrapper_classes is None:
+ wrapper_classes = ["." + self.cssclass]
+ for cls, rule in new_styles:
+ new_styles_code.append(", ".join(cls.format(c) for c in wrapper_classes) + " { " + rule + " }")
+ return base + "\n" + "\n".join(new_styles_code)
+
+ def _wrap_tablelinenos(self, inner):
+ lncount = 0
+ codelines = []
+ for t, line in inner:
+ if t:
+ lncount += 1
+ codelines.append(line)
+
+ fl = self.linenostart
+ mw = len(str(lncount + fl - 1))
+ sp = self.linenospecial
+ st = self.linenostep
+ la = self.lineanchors
+ aln = self.anchorlinenos
+ nocls = self.noclasses
+ if sp:
+ lines = []
+
+ for i in range(fl, fl + lncount):
+ line_before = ""
+ line_after = ""
+ if i % st == 0:
+ if i % sp == 0:
+ if aln:
+ line_before = '<a href="#%s-%d" class="special">' % (la, i)
+ line_after = "</a>"
+ else:
+ line_before = '<span class="special">'
+ line_after = "</span>"
+ elif aln:
+ line_before = '<a href="#%s-%d">' % (la, i)
+ line_after = "</a>"
+ lines.append((line_before, "%*d" % (mw, i), line_after))
+ else:
+ lines.append(("", "", ""))
+ else:
+ lines = []
+ for i in range(fl, fl + lncount):
+ line_before = ""
+ line_after = ""
+ if i % st == 0:
+ if aln:
+ line_before = '<a href="#%s-%d">' % (la, i)
+ line_after = "</a>"
+ lines.append((line_before, "%*d" % (mw, i), line_after))
+ else:
+ lines.append(("", "", ""))
+
+ yield 0, '<div class="%s"><table class="%stable">' % (
+ self.cssclass,
+ self.cssclass,
+ )
+ for lndata, cl in zip(lines, codelines):
+ ln_b, ln, ln_a = lndata
+ cl = MANY_SPACES.sub(_sp_to_nbsp, cl)
+ if nocls:
+ yield 0, (
+ '<tr><td class="linenos linenodiv" style="background-color: #f0f0f0; padding-right: 10px">' + ln_b +
+ '<code data-line-number="' + ln + '"></code>' + ln_a + '</td><td class="code"><code>' + cl + "</code></td></tr>"
+ )
+ else:
+ yield 0, (
+ '<tr><td class="linenos linenodiv">' + ln_b + '<code data-line-number="' + ln +
+ '"></code>' + ln_a + '</td><td class="code"><code>' + cl + "</code></td></tr>"
+ )
+ yield 0, "</table></div>"
+
+ def _wrap_inlinelinenos(self, inner):
+ # Override with new method
+ return self._wrap_ollineos(self, inner)
+
+ def _wrap_ollinenos(self, inner):
+ lines = inner
+ sp = self.linenospecial
+ st = self.linenostep or 1
+ num = self.linenostart
+
+ if self.anchorlinenos:
+ warnings.warn("anchorlinenos is not supported for linenos='ol'.")
+
+ yield 0, "<ol>"
+ if self.noclasses:
+ if sp:
+ for t, line in lines:
+ if num % sp == 0:
+ style = "background-color: #ffffc0; padding: 0 5px 0 5px"
+ else:
+ style = "background-color: #f0f0f0; padding: 0 5px 0 5px"
+ if num % st != 0:
+ style += "; list-style: none"
+ yield 1, '<li style="%s" value="%s">' % (style, num,) + line + "</li>"
+ num += 1
+ else:
+ for t, line in lines:
+ yield 1, (
+ '<li style="background-color: #f0f0f0; padding: 0 5px 0 5px%s" value="%s">'
+ % (("; list-style: none" if num % st != 0 else ""), num) + line + "</li>"
+ )
+ num += 1
+ elif sp:
+ for t, line in lines:
+ yield 1, '<li class="lineno%s%s" value="%s">' % (
+ " special" if num % sp == 0 else "",
+ " nonumber" if num % st != 0 else "",
+ num,
+ ) + line + "</li>"
+ num += 1
+ else:
+ for t, line in lines:
+ yield 1, '<li class="lineno%s" value="%s">' % (
+ "" if num % st != 0 else " nonumber",
+ num,
+ ) + line + "</li>"
+ num += 1
+
+ yield 0, "</ol>"
+
+ def format_unencoded(self, tokensource, outfile):
+ """Format code and write to outfile.
+
+ The formatting process uses several nested generators; which of
+ them are used is determined by the user's options.
+
+ Each generator should take at least one argument, ``inner``,
+ and wrap the pieces of text generated by this.
+
+ Always yield 2-tuples: (code, text). If "code" is 1, the text
+ is part of the original tokensource being highlighted, if it's
+ 0, the text is some piece of wrapping. This makes it possible to
+ use several different wrappers that process the original source
+ linewise, e.g. line number generators.
+ """
+ if self.linenos_val is False:
+ return super().format_unencoded(tokensource, outfile)
+ source = self._format_lines(tokensource)
+ if self.hl_lines:
+ source = self._highlight_lines(source)
+ if not self.nowrap:
+ if self.linenos_val == BetterLinenos.OL:
+ source = self._wrap_ollinenos(source)
+ if self.lineanchors:
+ source = self._wrap_lineanchors(source)
+ if self.linespans:
+ source = self._wrap_linespans(source)
+ if self.linenos_val == BetterLinenos.TABLE:
+ source = self._wrap_tablelinenos(source)
+ if self.linenos_val == BetterLinenos.OL:
+ source = self.wrap(source, outfile)
+ if self.full:
+ source = self._wrap_full(source, outfile)
+
+ for t, piece in source:
+ outfile.write(piece)
diff --git a/nikola/packages/tzlocal/__init__.py b/nikola/packages/tzlocal/__init__.py
index 4a6b1d6..5b4947c 100644
--- a/nikola/packages/tzlocal/__init__.py
+++ b/nikola/packages/tzlocal/__init__.py
@@ -1,9 +1,8 @@
-"""tzlocal init."""
-
+"""Try to figure out what your local timezone is."""
import sys
-if sys.platform == 'win32':
+__version__ = "2.0.0-nikola"
+
+if sys.platform == "win32":
from .win32 import get_localzone, reload_localzone # NOQA
-elif 'darwin' in sys.platform:
- from .darwin import get_localzone, reload_localzone # NOQA
else:
from .unix import get_localzone, reload_localzone # NOQA
diff --git a/nikola/packages/tzlocal/darwin.py b/nikola/packages/tzlocal/darwin.py
deleted file mode 100644
index 0dbf1c1..0000000
--- a/nikola/packages/tzlocal/darwin.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""tzlocal for OS X."""
-
-import os
-import dateutil.tz
-import subprocess
-
-_cache_tz = None
-
-
-def _get_localzone():
- tzname = subprocess.check_output(["systemsetup", "-gettimezone"]).decode('utf-8')
- tzname = tzname.replace("Time Zone: ", "")
- # OS X 10.9+, this command is root-only
- if 'exiting!' in tzname:
- tzname = ''
-
- if not tzname:
- # link will be something like /usr/share/zoneinfo/America/Los_Angeles.
- link = os.readlink("/etc/localtime")
- tzname = link.split('zoneinfo/')[-1]
- tzname = tzname.strip()
- try:
- # test the name
- assert tzname
- dateutil.tz.gettz(tzname)
- return tzname
- except:
- return None
-
-
-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/nikola/packages/tzlocal/unix.py b/nikola/packages/tzlocal/unix.py
index 8f7fc84..086ab7c 100644
--- a/nikola/packages/tzlocal/unix.py
+++ b/nikola/packages/tzlocal/unix.py
@@ -1,115 +1,128 @@
-"""tzlocal for UNIX."""
-
-from __future__ import with_statement
+"""Unix support for tzlocal."""
import os
import re
+
import dateutil.tz
_cache_tz = None
-def _get_localzone():
- """Try to find the local timezone configuration.
+def _try_tz_from_env():
+ tzenv = os.environ.get("TZ")
+ if tzenv and tzenv[0] == ":":
+ tzenv = tzenv[1:]
+ try:
+ if tzenv:
+ dateutil.tz.gettz(tzenv)
+ return tzenv
+ except Exception:
+ pass
+
- 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.
+def _get_localzone(_root="/"):
+ """Try to find the local timezone configuration.
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.
"""
- tz = os.environ.get('TZ')
- if tz and tz[0] == ':':
- tz = tz[1:]
- try:
- if tz:
- dateutil.tz.gettz(tz)
- return tz
- except:
- pass
+ tzenv = _try_tz_from_env()
+ if tzenv:
+ return tzenv
- try:
- # link will be something like /usr/share/zoneinfo/America/Los_Angeles.
- link = os.readlink('/etc/localtime')
- tz = link.split('zoneinfo/')[-1]
+ # Are we under Termux on Android?
+ if os.path.exists("/system/bin/getprop"):
+ import subprocess
- if tz:
- dateutil.tz.gettz(tz)
- return tz
- except:
- return None
+ androidtz = (
+ subprocess.check_output(["getprop", "persist.sys.timezone"])
+ .strip()
+ .decode()
+ )
+ return androidtz
# Now look for distribution specific configuration files
# that contain the timezone name.
- tzpath = os.path.join('/etc/timezone')
- 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':
+ for configfile in ("etc/timezone", "var/db/zoneinfo"):
+ tzpath = os.path.join(_root, configfile)
+ try:
+ 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] == b"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)
- tz = etctz.replace(' ', '_')
- try:
- if tz:
- dateutil.tz.gettz(tz)
- return tz
- except:
- pass
+ if not etctz:
+ # Empty file, skip
+ continue
+ for etctz in data.decode().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
+ tz = etctz.replace(" ", "_")
+ return tz
+
+ except IOError:
+ # File doesn't exist or is a directory
+ 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('\s*ZONE\s*=\s*\"')
- timezone_re = re.compile('\s*TIMEZONE\s*=\s*\"')
- end_re = re.compile('\"')
-
- for tzpath in ('/etc/sysconfig/clock', '/etc/conf.d/clock'):
- if not os.path.exists(tzpath):
+ 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()
+
+ 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
+ tz = etctz.replace(" ", "_")
+ return tz
+
+ except IOError:
+ # File doesn't exist or is a directory
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
- tz = etctz.replace(' ', '_')
- try:
- if tz:
- dateutil.tz.gettz(tz)
- return tz
- except:
- pass
-
- # Nikola cannot use this thing below...
-
- # 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)
+ # 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 != 0:
+ tzpath = tzpath[start:]
+ try:
+ dateutil.tz.gettz(tzpath)
+ return tzpath
+ except Exception:
+ pass
+ start = tzpath.find("/") + 1
+
+ # Nothing found, return UTC
return None
@@ -118,6 +131,7 @@ def get_localzone():
global _cache_tz
if _cache_tz is None:
_cache_tz = _get_localzone()
+
return _cache_tz
diff --git a/nikola/packages/tzlocal/win32.py b/nikola/packages/tzlocal/win32.py
index cb19284..b8be8b4 100644
--- a/nikola/packages/tzlocal/win32.py
+++ b/nikola/packages/tzlocal/win32.py
@@ -1,12 +1,8 @@
-"""tzlocal for Windows."""
-
+"""Windows support for tzlocal."""
try:
import _winreg as winreg
except ImportError:
- try:
- import winreg
- except ImportError:
- pass # not windows
+ import winreg
from .windows_tz import win_tz
@@ -24,7 +20,7 @@ def valuestodict(key):
def get_localzone_name():
- """Get local time zone name."""
+ """Get local zone 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
@@ -36,18 +32,19 @@ def get_localzone_name():
localtz = winreg.OpenKey(handle, TZLOCALKEYNAME)
keyvalues = valuestodict(localtz)
localtz.Close()
- if 'TimeZoneKeyName' in keyvalues:
+
+ 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]
+ tzkeyname = keyvalues["TimeZoneKeyName"].split("\x00", 1)[0]
else:
# Windows 2000 or XP
# This is the localized name:
- tzwin = keyvalues['StandardName']
+ tzwin = keyvalues["StandardName"]
# Open the list of timezones to look up the real name:
TZKEYNAME = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"
@@ -60,15 +57,20 @@ def get_localzone_name():
sub = winreg.OpenKey(tzkey, subkey)
data = valuestodict(sub)
sub.Close()
- if data['Std'] == tzwin:
- tzkeyname = subkey
- break
+ 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')
+ raise LookupError("Can not find Windows timezone configuration")
timezone = win_tz.get(tzkeyname)
if timezone is None:
@@ -85,6 +87,7 @@ def get_localzone():
global _cache_tz
if _cache_tz is None:
_cache_tz = get_localzone_name()
+
return _cache_tz
diff --git a/nikola/packages/tzlocal/windows_tz.py b/nikola/packages/tzlocal/windows_tz.py
index c171aa5..0e911fd 100644
--- a/nikola/packages/tzlocal/windows_tz.py
+++ b/nikola/packages/tzlocal/windows_tz.py
@@ -1,544 +1,700 @@
-"""Windows timezone names."""
-# This file is autogenerated by the get_windows_info.py script
+"""Windows timezone mapping."""
+# 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',
- 'Arab Standard Time': 'Asia/Riyadh',
- 'Arabian Standard Time': 'Asia/Dubai',
- 'Arabic Standard Time': 'Asia/Baghdad',
- 'Argentina Standard Time': 'America/Buenos_Aires',
- 'Atlantic Standard Time': 'America/Halifax',
- 'Azerbaijan Standard Time': 'Asia/Baku',
- 'Azores Standard Time': 'Atlantic/Azores',
- 'Bahia Standard Time': 'America/Bahia',
- 'Bangladesh Standard Time': 'Asia/Dhaka',
- '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',
- 'China Standard Time': 'Asia/Shanghai',
- 'Dateline Standard Time': 'Etc/GMT+12',
- 'E. Africa Standard Time': 'Africa/Nairobi',
- 'E. Australia Standard Time': 'Australia/Brisbane',
- 'E. Europe Standard Time': 'Asia/Nicosia',
- 'E. South America Standard Time': 'America/Sao_Paulo',
- 'Eastern Standard Time': 'America/New_York',
- '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',
- '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',
- 'Magadan Standard Time': 'Asia/Magadan',
- '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',
- 'North Asia East Standard Time': 'Asia/Irkutsk',
- 'North Asia Standard Time': 'Asia/Krasnoyarsk',
- 'Pacific SA Standard Time': 'America/Santiago',
- 'Pacific Standard Time': 'America/Los_Angeles',
- 'Pacific Standard Time (Mexico)': 'America/Santa_Isabel',
- 'Pakistan Standard Time': 'Asia/Karachi',
- 'Paraguay Standard Time': 'America/Asuncion',
- 'Romance Standard Time': 'Europe/Paris',
- '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',
- 'Samoa Standard Time': 'Pacific/Apia',
- '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',
- 'Tokyo Standard Time': 'Asia/Tokyo',
- 'Tonga Standard Time': 'Pacific/Tongatapu',
- 'Turkey Standard Time': 'Europe/Istanbul',
- 'US Eastern Standard Time': 'America/Indianapolis',
- 'US Mountain Standard Time': 'America/Phoenix',
- 'UTC': 'Etc/GMT',
- 'UTC+12': 'Etc/GMT-12',
- 'UTC-02': 'Etc/GMT+2',
- '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',
- 'West Asia Standard Time': 'Asia/Tashkent',
- 'West Pacific Standard Time': 'Pacific/Port_Moresby',
- 'Yakutsk Standard Time': 'Asia/Yakutsk'
+ "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",
+ "Sao Tome Standard Time": "Africa/Sao_Tome",
+ "Saratov Standard Time": "Europe/Saratov",
+ "Singapore Standard Time": "Asia/Singapore",
+ "South Africa Standard Time": "Africa/Johannesburg",
+ "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/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/Tripoli': 'Libya Standard Time',
- 'Africa/Tunis': 'W. Central Africa Standard Time',
- 'Africa/Windhoek': 'Namibia Standard Time',
- 'America/Anchorage': 'Alaskan Standard Time',
- 'America/Anguilla': 'SA Western Standard Time',
- 'America/Antigua': 'SA Western Standard Time',
- 'America/Araguaina': 'SA Eastern 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/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': 'Central 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/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': 'Eastern 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': 'Eastern 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/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/Mexico_City': 'Central Standard Time (Mexico)',
- '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': 'Eastern Standard Time',
- 'America/Port_of_Spain': 'SA Western Standard Time',
- 'America/Porto_Velho': 'SA Western Standard Time',
- 'America/Puerto_Rico': 'SA Western 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',
- 'America/Toronto': 'Eastern Standard Time',
- 'America/Tortola': 'SA Western Standard Time',
- 'America/Vancouver': 'Pacific Standard Time',
- 'America/Whitehorse': 'Pacific Standard Time',
- 'America/Winnipeg': 'Central Standard Time',
- 'America/Yakutat': 'Alaskan Standard Time',
- 'America/Yellowknife': 'Mountain Standard Time',
- 'Antarctica/Casey': 'W. Australia 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': 'Pacific SA 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': 'Magadan Standard Time',
- 'Asia/Aqtau': 'West Asia Standard Time',
- 'Asia/Aqtobe': 'West Asia Standard Time',
- 'Asia/Ashgabat': '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/Beirut': 'Middle East Standard Time',
- 'Asia/Bishkek': 'Central Asia Standard Time',
- 'Asia/Brunei': 'Singapore Standard Time',
- 'Asia/Calcutta': 'India Standard Time',
- 'Asia/Choibalsan': 'Ulaanbaatar Standard Time',
- 'Asia/Chongqing': 'China Standard Time',
- 'Asia/Colombo': 'Sri Lanka 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/Harbin': 'China Standard Time',
- 'Asia/Hong_Kong': 'China Standard Time',
- 'Asia/Hovd': 'SE Asia 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': 'Magadan Standard Time',
- 'Asia/Karachi': 'Pakistan Standard Time',
- 'Asia/Kashgar': 'China 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/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': 'E. Europe Standard Time',
- 'Asia/Novokuznetsk': 'N. Central Asia Standard Time',
- 'Asia/Novosibirsk': 'N. Central Asia Standard Time',
- 'Asia/Omsk': 'N. Central Asia Standard Time',
- 'Asia/Oral': 'West Asia Standard Time',
- 'Asia/Phnom_Penh': 'SE Asia Standard Time',
- 'Asia/Pontianak': 'SE Asia Standard Time',
- 'Asia/Pyongyang': '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': 'Vladivostok Standard Time',
- 'Asia/Samarkand': 'West Asia Standard Time',
- 'Asia/Seoul': 'Korea Standard Time',
- 'Asia/Shanghai': 'China Standard Time',
- 'Asia/Singapore': 'Singapore Standard Time',
- 'Asia/Taipei': 'Taipei Standard Time',
- 'Asia/Tashkent': 'West Asia Standard Time',
- 'Asia/Tbilisi': 'Georgian Standard Time',
- 'Asia/Tehran': 'Iran Standard Time',
- 'Asia/Thimphu': 'Bangladesh Standard Time',
- 'Asia/Tokyo': 'Tokyo Standard Time',
- 'Asia/Ulaanbaatar': 'Ulaanbaatar Standard Time',
- 'Asia/Urumqi': 'China 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/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/Adelaide': 'Cen. Australia Standard Time',
- 'Australia/Brisbane': 'E. Australia Standard Time',
- 'Australia/Broken_Hill': 'Cen. Australia Standard Time',
- 'Australia/Currie': 'Tasmania Standard Time',
- 'Australia/Darwin': 'AUS Central Standard Time',
- 'Australia/Hobart': 'Tasmania Standard Time',
- 'Australia/Lindeman': 'E. Australia Standard Time',
- 'Australia/Melbourne': 'AUS Eastern Standard Time',
- 'Australia/Perth': 'W. Australia Standard Time',
- 'Australia/Sydney': 'AUS Eastern Standard Time',
- 'CST6CDT': 'Central Standard Time',
- 'EST5EDT': 'Eastern 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-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': 'Tonga 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/Athens': 'GTB 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': 'GTB 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/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': 'Kaliningrad 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': 'Russian Standard Time',
- 'Europe/San_Marino': 'W. Europe Standard Time',
- 'Europe/Sarajevo': 'Central European Standard Time',
- 'Europe/Simferopol': 'FLE 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/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',
- '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',
- 'MST7MDT': 'Mountain Standard Time',
- 'PST8PDT': 'Pacific Standard Time',
- 'Pacific/Apia': 'Samoa Standard Time',
- 'Pacific/Auckland': 'New Zealand Standard Time',
- 'Pacific/Efate': 'Central Pacific Standard Time',
- 'Pacific/Enderbury': 'Tonga Standard Time',
- 'Pacific/Fakaofo': 'Tonga Standard Time',
- 'Pacific/Fiji': 'Fiji Standard Time',
- 'Pacific/Funafuti': 'UTC+12',
- 'Pacific/Galapagos': 'Central America Standard Time',
- 'Pacific/Guadalcanal': 'Central Pacific Standard Time',
- 'Pacific/Guam': 'West Pacific Standard Time',
- 'Pacific/Honolulu': 'Hawaiian Standard Time',
- 'Pacific/Johnston': 'Hawaiian Standard Time',
- 'Pacific/Kosrae': 'Central Pacific Standard Time',
- 'Pacific/Kwajalein': 'UTC+12',
- 'Pacific/Majuro': 'UTC+12',
- 'Pacific/Midway': 'UTC-11',
- 'Pacific/Nauru': 'UTC+12',
- 'Pacific/Niue': 'UTC-11',
- 'Pacific/Noumea': 'Central Pacific Standard Time',
- 'Pacific/Pago_Pago': 'UTC-11',
- 'Pacific/Palau': 'Tokyo 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/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'
+ "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": "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/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": "Pacific 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": "W. Australia 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": "GTB 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/Qostanay": "Central Asia Standard Time",
+ "Asia/Qyzylorda": "West 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/UCT": "UTC",
+ "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",
+ "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",
}