| # 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) | |
| ```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. | |