| ================= | 
 | Time Zone Support | 
 | ================= | 
 |  | 
 | Introduction | 
 | ============ | 
 |  | 
 | Starting with C++20 the ``<chrono>`` library has support for time zones. | 
 | These are available in the | 
 | `IANA Time Zone Database <https://data.iana.org/time-zones/tz-link.html>`_. | 
 | This page describes the design decisions and trade-offs made to implement this | 
 | feature. This page contains several links with more information regarding the | 
 | contents of the IANA database, this page assumes the reader is familiar with | 
 | this information. | 
 |  | 
 | Which version of the Time Zone Database to use | 
 | ============================================== | 
 |  | 
 | The data of the database is available on several platforms in different forms: | 
 |  | 
 | - Typically Unix systems ship the database as | 
 |   `TZif files <https://www.rfc-editor.org/rfc/rfc8536.html>`_. This format has | 
 |   3 versions and the ``time_zone_link`` information is not always available. | 
 |   If available, they are symlinks in the file system. | 
 |   These files don't provide the database version information. This information | 
 |   is needed for the functions ``std::chrono:: remote_version()`` and | 
 |   ``std::chrono::reload_tzdb()``. | 
 |  | 
 | - On several Unix systems the time zone source files are available. These files | 
 |   are stored in several regions, mainly the continents. This file contains a | 
 |   large amount of comment with historical information regarding time zones. | 
 |   The format is documented in the | 
 |   `IANA documentation <https://data.iana.org/time-zones/tz-how-to.html>`_ | 
 |   and in the `man page <https://man7.org/linux/man-pages/man8/zic.8.html>`_ of zic. | 
 |   The disadvantage of this version is that at least Linux versions don't have | 
 |   the database version information. This information is needed for the functions | 
 |   ``std::chrono:: remote_version()`` and ``std::chrono::reload_tzdb()``. | 
 |  | 
 | - On Linux systems ``tzdata.zi`` is available. This contains the same | 
 |   information as the source files but in one file without the comments. This | 
 |   file uses the same format as the sources, but shortens the names. For example | 
 |   ``Rule`` is abbreviated to ``R``. This file contains the database version | 
 |   information. | 
 |  | 
 | The disadvantage of the ``TZif`` format (which is a binary format) is that it's | 
 | not possible to get the proper ``time_zone_link`` information on all platforms. | 
 | The time zone database version number is also missing from ``TZif`` files. | 
 | Since the time zone database is supposed to contain both these informations, | 
 | ``TZif`` files can't be used to create a conforming implementation. | 
 |  | 
 | Since it's easier to parse one file than a set of files we decided | 
 | to use the ``tzdata.zi``. The other benefit is that the ``tzdata.zi`` file | 
 | contains the database version information needed for a conforming | 
 | implementation. | 
 |  | 
 | The ``tzdata.zi`` file is not available on all platforms as of August 2023, so | 
 | some vendors will need to make changes to their platform. Most vendors already | 
 | ship the database, so they only need to adjust the packaging of their time zone | 
 | package to include the files we require. One notable exception is Windows, | 
 | where no IANA time zone database is provided at all. However it's possible for | 
 | Windows packagers to add these files to their libc++ packages. The IANA | 
 | databases can be | 
 | `downloaded <https://data.iana.org/time-zones/releases/>`_. | 
 |  | 
 | An alternative would be to ship the database with libc++, either as a file or | 
 | compiled in the dylib. The text file is about 112 KB. For now libc++ will not | 
 | ship this file. If it's hard to get vendors to ship these files we can | 
 | reconsider based on that information. | 
 |  | 
 | Leap seconds | 
 | ------------ | 
 |  | 
 | For the leap seconds libc++ will use the source file ``leap-seconds.list``. | 
 | This file is easier to parse than the ``leapseconds`` file. Both files are | 
 | present on Linux, but not always on other platforms. Since these platforms need | 
 | to change their packaging for ``tzdata.zi``, adding two instead of one files | 
 | seems a small change. | 
 |  | 
 |  | 
 | Updating the Time Zone Database | 
 | =============================== | 
 |  | 
 | Per `[time.zone.db.remote]/1 <http://eel.is/c++draft/time.zone#db.remote-1>`_ | 
 |  | 
 | .. code-block:: text | 
 |  | 
 |   The local time zone database is that supplied by the implementation when the | 
 |   program first accesses the database, for example via current_zone(). While the | 
 |   program is running, the implementation may choose to update the time zone | 
 |   database. This update shall not impact the program in any way unless the | 
 |   program calls the functions in this subclause. This potentially updated time | 
 |   zone database is referred to as the remote time zone database. | 
 |  | 
 | There is an update mechanism in libc++, however this is not done automatically. | 
 | Invoking the function ``std::chrono::remote_version()`` will parse the version | 
 | information of the ``tzdata.zi`` file and return that information. Similarly, | 
 | ``std::chrono::reload_tzdb()`` will parse the ``tzdata.zi`` and | 
 | ``leap-seconds.list`` again. This makes it possible to update the database if | 
 | needed by the application and gives the user full power over the update policy. | 
 |  | 
 | This approach has several advantages: | 
 |  | 
 | - It is simple to implement. | 
 | - The library does not need to start a periodic background process to poll | 
 |   changes to the filesystem. When using a background process, it may become | 
 |   active when the application is busy with its core task, taking away resources | 
 |   from that task. | 
 | - If there is no threading available this polling | 
 |   becomes more involved. For example, query the file every *x* calls to | 
 |   ``std::chrono::get_tzdb()``. This mean calls to ``std::chrono::get_tzdb()`` | 
 |   would have different performance characteristics. | 
 |  | 
 | The small drawback is: | 
 |  | 
 | - On platforms with threading enabled updating the database may take longer. | 
 |   On these platforms the remote database could have been loaded in a background | 
 |   process. | 
 |  | 
 | Another issue with the automatic update is that it may not be considered | 
 | Standard compliant, since the Standard uses the wording "This update shall not | 
 | impact the program in any way". Using resources could be considered as | 
 | impacting the program. |