17db96d56Sopenharmony_ci:mod:`zoneinfo` --- IANA time zone support
27db96d56Sopenharmony_ci==========================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: zoneinfo
57db96d56Sopenharmony_ci    :synopsis: IANA time zone support
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. versionadded:: 3.9
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci.. moduleauthor:: Paul Ganssle <paul@ganssle.io>
107db96d56Sopenharmony_ci.. sectionauthor:: Paul Ganssle <paul@ganssle.io>
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci**Source code:** :source:`Lib/zoneinfo`
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci--------------
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciThe :mod:`zoneinfo` module provides a concrete time zone implementation to
177db96d56Sopenharmony_cisupport the IANA time zone database as originally specified in :pep:`615`. By
187db96d56Sopenharmony_cidefault, :mod:`zoneinfo` uses the system's time zone data if available; if no
197db96d56Sopenharmony_cisystem time zone data is available, the library will fall back to using the
207db96d56Sopenharmony_cifirst-party `tzdata`_ package available on PyPI.
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci.. seealso::
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    Module: :mod:`datetime`
257db96d56Sopenharmony_ci        Provides the :class:`~datetime.time` and :class:`~datetime.datetime`
267db96d56Sopenharmony_ci        types with which the :class:`ZoneInfo` class is designed to be used.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci    Package `tzdata`_
297db96d56Sopenharmony_ci        First-party package maintained by the CPython core developers to supply
307db96d56Sopenharmony_ci        time zone data via PyPI.
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci.. include:: ../includes/wasm-notavail.rst
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ciUsing ``ZoneInfo``
357db96d56Sopenharmony_ci------------------
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci:class:`ZoneInfo` is a concrete implementation of the :class:`datetime.tzinfo`
387db96d56Sopenharmony_ciabstract base class, and is intended to be attached to ``tzinfo``, either via
397db96d56Sopenharmony_cithe constructor, the :meth:`datetime.replace <datetime.datetime.replace>`
407db96d56Sopenharmony_cimethod or :meth:`datetime.astimezone <datetime.datetime.astimezone>`::
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci    >>> from zoneinfo import ZoneInfo
437db96d56Sopenharmony_ci    >>> from datetime import datetime, timedelta
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
467db96d56Sopenharmony_ci    >>> print(dt)
477db96d56Sopenharmony_ci    2020-10-31 12:00:00-07:00
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci    >>> dt.tzname()
507db96d56Sopenharmony_ci    'PDT'
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ciDatetimes constructed in this way are compatible with datetime arithmetic and
537db96d56Sopenharmony_cihandle daylight saving time transitions with no further intervention::
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    >>> dt_add = dt + timedelta(days=1)
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    >>> print(dt_add)
587db96d56Sopenharmony_ci    2020-11-01 12:00:00-08:00
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    >>> dt_add.tzname()
617db96d56Sopenharmony_ci    'PST'
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ciThese time zones also support the :attr:`~datetime.datetime.fold` attribute
647db96d56Sopenharmony_ciintroduced in :pep:`495`.  During offset transitions which induce ambiguous
657db96d56Sopenharmony_citimes (such as a daylight saving time to standard time transition), the offset
667db96d56Sopenharmony_cifrom *before* the transition is used when ``fold=0``, and the offset *after*
677db96d56Sopenharmony_cithe transition is used when ``fold=1``, for example::
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci    >>> dt = datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
707db96d56Sopenharmony_ci    >>> print(dt)
717db96d56Sopenharmony_ci    2020-11-01 01:00:00-07:00
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci    >>> print(dt.replace(fold=1))
747db96d56Sopenharmony_ci    2020-11-01 01:00:00-08:00
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ciWhen converting from another time zone, the fold will be set to the correct
777db96d56Sopenharmony_civalue::
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci    >>> from datetime import timezone
807db96d56Sopenharmony_ci    >>> LOS_ANGELES = ZoneInfo("America/Los_Angeles")
817db96d56Sopenharmony_ci    >>> dt_utc = datetime(2020, 11, 1, 8, tzinfo=timezone.utc)
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci    >>> # Before the PDT -> PST transition
847db96d56Sopenharmony_ci    >>> print(dt_utc.astimezone(LOS_ANGELES))
857db96d56Sopenharmony_ci    2020-11-01 01:00:00-07:00
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    >>> # After the PDT -> PST transition
887db96d56Sopenharmony_ci    >>> print((dt_utc + timedelta(hours=1)).astimezone(LOS_ANGELES))
897db96d56Sopenharmony_ci    2020-11-01 01:00:00-08:00
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ciData sources
927db96d56Sopenharmony_ci------------
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ciThe ``zoneinfo`` module does not directly provide time zone data, and instead
957db96d56Sopenharmony_cipulls time zone information from the system time zone database or the
967db96d56Sopenharmony_cifirst-party PyPI package `tzdata`_, if available. Some systems, including
977db96d56Sopenharmony_cinotably Windows systems, do not have an IANA database available, and so for
987db96d56Sopenharmony_ciprojects targeting cross-platform compatibility that require time zone data, it
997db96d56Sopenharmony_ciis recommended to declare a dependency on tzdata. If neither system data nor
1007db96d56Sopenharmony_citzdata are available, all calls to :class:`ZoneInfo` will raise
1017db96d56Sopenharmony_ci:exc:`ZoneInfoNotFoundError`.
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci.. _zoneinfo_data_configuration:
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ciConfiguring the data sources
1067db96d56Sopenharmony_ci****************************
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ciWhen ``ZoneInfo(key)`` is called, the constructor first searches the
1097db96d56Sopenharmony_cidirectories specified in :data:`TZPATH` for a file matching ``key``, and on
1107db96d56Sopenharmony_cifailure looks for a match in the tzdata package. This behavior can be
1117db96d56Sopenharmony_ciconfigured in three ways:
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci1. The default :data:`TZPATH` when not otherwise specified can be configured at
1147db96d56Sopenharmony_ci   :ref:`compile time <zoneinfo_data_compile_time_config>`.
1157db96d56Sopenharmony_ci2. :data:`TZPATH` can be configured using :ref:`an environment variable
1167db96d56Sopenharmony_ci   <zoneinfo_data_environment_var>`.
1177db96d56Sopenharmony_ci3. At :ref:`runtime <zoneinfo_data_runtime_config>`, the search path can be
1187db96d56Sopenharmony_ci   manipulated using the :func:`reset_tzpath` function.
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci.. _zoneinfo_data_compile_time_config:
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ciCompile-time configuration
1237db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ciThe default :data:`TZPATH` includes several common deployment locations for the
1267db96d56Sopenharmony_citime zone database (except on Windows, where there are no "well-known"
1277db96d56Sopenharmony_cilocations for time zone data). On POSIX systems, downstream distributors and
1287db96d56Sopenharmony_cithose building Python from source who know where their system
1297db96d56Sopenharmony_citime zone data is deployed may change the default time zone path by specifying
1307db96d56Sopenharmony_cithe compile-time option ``TZPATH`` (or, more likely, the :option:`configure
1317db96d56Sopenharmony_ciflag --with-tzpath <--with-tzpath>`), which should be a string delimited by
1327db96d56Sopenharmony_ci:data:`os.pathsep`.
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ciOn all platforms, the configured value is available as the ``TZPATH`` key in
1357db96d56Sopenharmony_ci:func:`sysconfig.get_config_var`.
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci.. _zoneinfo_data_environment_var:
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ciEnvironment configuration
1407db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ciWhen initializing :data:`TZPATH` (either at import time or whenever
1437db96d56Sopenharmony_ci:func:`reset_tzpath` is called with no arguments), the ``zoneinfo`` module will
1447db96d56Sopenharmony_ciuse the environment variable ``PYTHONTZPATH``, if it exists, to set the search
1457db96d56Sopenharmony_cipath.
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci.. envvar:: PYTHONTZPATH
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci    This is an :data:`os.pathsep`-separated string containing the time zone
1507db96d56Sopenharmony_ci    search path to use. It must consist of only absolute rather than relative
1517db96d56Sopenharmony_ci    paths. Relative components specified in ``PYTHONTZPATH`` will not be used,
1527db96d56Sopenharmony_ci    but otherwise the behavior when a relative path is specified is
1537db96d56Sopenharmony_ci    implementation-defined; CPython will raise :exc:`InvalidTZPathWarning`, but
1547db96d56Sopenharmony_ci    other implementations are free to silently ignore the erroneous component
1557db96d56Sopenharmony_ci    or raise an exception.
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ciTo set the system to ignore the system data and use the tzdata package
1587db96d56Sopenharmony_ciinstead, set ``PYTHONTZPATH=""``.
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci.. _zoneinfo_data_runtime_config:
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ciRuntime configuration
1637db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ciThe TZ search path can also be configured at runtime using the
1667db96d56Sopenharmony_ci:func:`reset_tzpath` function. This is generally not an advisable operation,
1677db96d56Sopenharmony_cithough it is reasonable to use it in test functions that require the use of a
1687db96d56Sopenharmony_cispecific time zone path (or require disabling access to the system time zones).
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ciThe ``ZoneInfo`` class
1727db96d56Sopenharmony_ci----------------------
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci.. class:: ZoneInfo(key)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci    A concrete :class:`datetime.tzinfo` subclass that represents an IANA time
1777db96d56Sopenharmony_ci    zone specified by the string ``key``. Calls to the primary constructor will
1787db96d56Sopenharmony_ci    always return objects that compare identically; put another way, barring
1797db96d56Sopenharmony_ci    cache invalidation via :meth:`ZoneInfo.clear_cache`, for all values of
1807db96d56Sopenharmony_ci    ``key``, the following assertion will always be true:
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci    .. code-block:: python
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci        a = ZoneInfo(key)
1857db96d56Sopenharmony_ci        b = ZoneInfo(key)
1867db96d56Sopenharmony_ci        assert a is b
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci    ``key`` must be in the form of a relative, normalized POSIX path, with no
1897db96d56Sopenharmony_ci    up-level references. The constructor will raise :exc:`ValueError` if a
1907db96d56Sopenharmony_ci    non-conforming key is passed.
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    If no file matching ``key`` is found, the constructor will raise
1937db96d56Sopenharmony_ci    :exc:`ZoneInfoNotFoundError`.
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ciThe ``ZoneInfo`` class has two alternate constructors:
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci.. classmethod:: ZoneInfo.from_file(fobj, /, key=None)
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci    Constructs a ``ZoneInfo`` object from a file-like object returning bytes
2017db96d56Sopenharmony_ci    (e.g. a file opened in binary mode or an :class:`io.BytesIO` object).
2027db96d56Sopenharmony_ci    Unlike the primary constructor, this always constructs a new object.
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    The ``key`` parameter sets the name of the zone for the purposes of
2057db96d56Sopenharmony_ci    :py:meth:`~object.__str__` and :py:meth:`~object.__repr__`.
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci    Objects created via this constructor cannot be pickled (see `pickling`_).
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci.. classmethod:: ZoneInfo.no_cache(key)
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci    An alternate constructor that bypasses the constructor's cache. It is
2127db96d56Sopenharmony_ci    identical to the primary constructor, but returns a new object on each
2137db96d56Sopenharmony_ci    call. This is most likely to be useful for testing or demonstration
2147db96d56Sopenharmony_ci    purposes, but it can also be used to create a system with a different cache
2157db96d56Sopenharmony_ci    invalidation strategy.
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci    Objects created via this constructor will also bypass the cache of a
2187db96d56Sopenharmony_ci    deserializing process when unpickled.
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci    .. TODO: Add "See `cache_behavior`_" reference when that section is ready.
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci    .. caution::
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci        Using this constructor may change the semantics of your datetimes in
2257db96d56Sopenharmony_ci        surprising ways, only use it if you know that you need to.
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ciThe following class methods are also available:
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci.. classmethod:: ZoneInfo.clear_cache(*, only_keys=None)
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci    A method for invalidating the cache on the ``ZoneInfo`` class. If no
2327db96d56Sopenharmony_ci    arguments are passed, all caches are invalidated and the next call to
2337db96d56Sopenharmony_ci    the primary constructor for each key will return a new instance.
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci    If an iterable of key names is passed to the ``only_keys`` parameter, only
2367db96d56Sopenharmony_ci    the specified keys will be removed from the cache. Keys passed to
2377db96d56Sopenharmony_ci    ``only_keys`` but not found in the cache are ignored.
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci    .. TODO: Add "See `cache_behavior`_" reference when that section is ready.
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci    .. warning::
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci        Invoking this function may change the semantics of datetimes using
2447db96d56Sopenharmony_ci        ``ZoneInfo`` in surprising ways; this modifies process-wide global state
2457db96d56Sopenharmony_ci        and thus may have wide-ranging effects. Only use it if you know that you
2467db96d56Sopenharmony_ci        need to.
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ciThe class has one attribute:
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci.. attribute:: ZoneInfo.key
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci    This is a read-only :term:`attribute` that returns the value of ``key``
2537db96d56Sopenharmony_ci    passed to the constructor, which should be a lookup key in the IANA time
2547db96d56Sopenharmony_ci    zone database (e.g. ``America/New_York``, ``Europe/Paris`` or
2557db96d56Sopenharmony_ci    ``Asia/Tokyo``).
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci    For zones constructed from file without specifying a ``key`` parameter,
2587db96d56Sopenharmony_ci    this will be set to ``None``.
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    .. note::
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci        Although it is a somewhat common practice to expose these to end users,
2637db96d56Sopenharmony_ci        these values are designed to be primary keys for representing the
2647db96d56Sopenharmony_ci        relevant zones and not necessarily user-facing elements.  Projects like
2657db96d56Sopenharmony_ci        CLDR (the Unicode Common Locale Data Repository) can be used to get
2667db96d56Sopenharmony_ci        more user-friendly strings from these keys.
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ciString representations
2697db96d56Sopenharmony_ci**********************
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ciThe string representation returned when calling :py:class:`str` on a
2727db96d56Sopenharmony_ci:class:`ZoneInfo` object defaults to using the :attr:`ZoneInfo.key` attribute (see
2737db96d56Sopenharmony_cithe note on usage in the attribute documentation)::
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci    >>> zone = ZoneInfo("Pacific/Kwajalein")
2767db96d56Sopenharmony_ci    >>> str(zone)
2777db96d56Sopenharmony_ci    'Pacific/Kwajalein'
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci    >>> dt = datetime(2020, 4, 1, 3, 15, tzinfo=zone)
2807db96d56Sopenharmony_ci    >>> f"{dt.isoformat()} [{dt.tzinfo}]"
2817db96d56Sopenharmony_ci    '2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]'
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ciFor objects constructed from a file without specifying a ``key`` parameter,
2847db96d56Sopenharmony_ci``str`` falls back to calling :func:`repr`. ``ZoneInfo``'s ``repr`` is
2857db96d56Sopenharmony_ciimplementation-defined and not necessarily stable between versions, but it is
2867db96d56Sopenharmony_ciguaranteed not to be a valid ``ZoneInfo`` key.
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci.. _pickling:
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ciPickle serialization
2917db96d56Sopenharmony_ci********************
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ciRather than serializing all transition data, ``ZoneInfo`` objects are
2947db96d56Sopenharmony_ciserialized by key, and ``ZoneInfo`` objects constructed from files (even those
2957db96d56Sopenharmony_ciwith a value for ``key`` specified) cannot be pickled.
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ciThe behavior of a ``ZoneInfo`` file depends on how it was constructed:
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci1. ``ZoneInfo(key)``: When constructed with the primary constructor, a
3007db96d56Sopenharmony_ci   ``ZoneInfo`` object is serialized by key, and when deserialized, the
3017db96d56Sopenharmony_ci   deserializing process uses the primary and thus it is expected that these
3027db96d56Sopenharmony_ci   are expected to be the same object as other references to the same time
3037db96d56Sopenharmony_ci   zone.  For example, if ``europe_berlin_pkl`` is a string containing a pickle
3047db96d56Sopenharmony_ci   constructed from ``ZoneInfo("Europe/Berlin")``, one would expect the
3057db96d56Sopenharmony_ci   following behavior:
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci   .. code-block:: pycon
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci       >>> a = ZoneInfo("Europe/Berlin")
3107db96d56Sopenharmony_ci       >>> b = pickle.loads(europe_berlin_pkl)
3117db96d56Sopenharmony_ci       >>> a is b
3127db96d56Sopenharmony_ci       True
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci2. ``ZoneInfo.no_cache(key)``: When constructed from the cache-bypassing
3157db96d56Sopenharmony_ci   constructor, the ``ZoneInfo`` object is also serialized by key, but when
3167db96d56Sopenharmony_ci   deserialized, the deserializing process uses the cache bypassing
3177db96d56Sopenharmony_ci   constructor. If ``europe_berlin_pkl_nc`` is a string containing a pickle
3187db96d56Sopenharmony_ci   constructed from ``ZoneInfo.no_cache("Europe/Berlin")``, one would expect
3197db96d56Sopenharmony_ci   the following behavior:
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci   .. code-block:: pycon
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci       >>> a = ZoneInfo("Europe/Berlin")
3247db96d56Sopenharmony_ci       >>> b = pickle.loads(europe_berlin_pkl_nc)
3257db96d56Sopenharmony_ci       >>> a is b
3267db96d56Sopenharmony_ci       False
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci3. ``ZoneInfo.from_file(fobj, /, key=None)``: When constructed from a file, the
3297db96d56Sopenharmony_ci   ``ZoneInfo`` object raises an exception on pickling. If an end user wants to
3307db96d56Sopenharmony_ci   pickle a ``ZoneInfo`` constructed from a file, it is recommended that they
3317db96d56Sopenharmony_ci   use a wrapper type or a custom serialization function: either serializing by
3327db96d56Sopenharmony_ci   key or storing the contents of the file object and serializing that.
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ciThis method of serialization requires that the time zone data for the required
3357db96d56Sopenharmony_cikey be available on both the serializing and deserializing side, similar to the
3367db96d56Sopenharmony_ciway that references to classes and functions are expected to exist in both the
3377db96d56Sopenharmony_ciserializing and deserializing environments. It also means that no guarantees
3387db96d56Sopenharmony_ciare made about the consistency of results when unpickling a ``ZoneInfo``
3397db96d56Sopenharmony_cipickled in an environment with a different version of the time zone data.
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ciFunctions
3427db96d56Sopenharmony_ci---------
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci.. function:: available_timezones()
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci    Get a set containing all the valid keys for IANA time zones available
3477db96d56Sopenharmony_ci    anywhere on the time zone path. This is recalculated on every call to the
3487db96d56Sopenharmony_ci    function.
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci    This function only includes canonical zone names and does not include
3517db96d56Sopenharmony_ci    "special" zones such as those under the ``posix/`` and ``right/``
3527db96d56Sopenharmony_ci    directories, or the ``posixrules`` zone.
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci    .. caution::
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci        This function may open a large number of files, as the best way to
3577db96d56Sopenharmony_ci        determine if a file on the time zone path is a valid time zone is to
3587db96d56Sopenharmony_ci        read the "magic string" at the beginning.
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci    .. note::
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci        These values are not designed to be exposed to end-users; for user
3637db96d56Sopenharmony_ci        facing elements, applications should use something like CLDR (the
3647db96d56Sopenharmony_ci        Unicode Common Locale Data Repository) to get more user-friendly
3657db96d56Sopenharmony_ci        strings. See also the cautionary note on :attr:`ZoneInfo.key`.
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci.. function:: reset_tzpath(to=None)
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci    Sets or resets the time zone search path (:data:`TZPATH`) for the module.
3707db96d56Sopenharmony_ci    When called with no arguments, :data:`TZPATH` is set to the default value.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci    Calling ``reset_tzpath`` will not invalidate the :class:`ZoneInfo` cache,
3737db96d56Sopenharmony_ci    and so calls to the primary ``ZoneInfo`` constructor will only use the new
3747db96d56Sopenharmony_ci    ``TZPATH`` in the case of a cache miss.
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci    The ``to`` parameter must be a :term:`sequence` of strings or
3777db96d56Sopenharmony_ci    :class:`os.PathLike` and not a string, all of which must be absolute paths.
3787db96d56Sopenharmony_ci    :exc:`ValueError` will be raised if something other than an absolute path
3797db96d56Sopenharmony_ci    is passed.
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ciGlobals
3827db96d56Sopenharmony_ci-------
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci.. data:: TZPATH
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci    A read-only sequence representing the time zone search path -- when
3877db96d56Sopenharmony_ci    constructing a ``ZoneInfo`` from a key, the key is joined to each entry in
3887db96d56Sopenharmony_ci    the ``TZPATH``, and the first file found is used.
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci    ``TZPATH`` may contain only absolute paths, never relative paths,
3917db96d56Sopenharmony_ci    regardless of how it is configured.
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci    The object that ``zoneinfo.TZPATH`` points to may change in response to a
3947db96d56Sopenharmony_ci    call to :func:`reset_tzpath`, so it is recommended to use
3957db96d56Sopenharmony_ci    ``zoneinfo.TZPATH`` rather than importing ``TZPATH`` from ``zoneinfo`` or
3967db96d56Sopenharmony_ci    assigning a long-lived variable to ``zoneinfo.TZPATH``.
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci    For more information on configuring the time zone search path, see
3997db96d56Sopenharmony_ci    :ref:`zoneinfo_data_configuration`.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ciExceptions and warnings
4027db96d56Sopenharmony_ci-----------------------
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci.. exception:: ZoneInfoNotFoundError
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci    Raised when construction of a :class:`ZoneInfo` object fails because the
4077db96d56Sopenharmony_ci    specified key could not be found on the system. This is a subclass of
4087db96d56Sopenharmony_ci    :exc:`KeyError`.
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci.. exception:: InvalidTZPathWarning
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci    Raised when :envvar:`PYTHONTZPATH` contains an invalid component that will
4137db96d56Sopenharmony_ci    be filtered out, such as a relative path.
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci.. Links and references:
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci.. _tzdata: https://pypi.org/project/tzdata/
418