| ================= | |
| 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. |