C++20 是否需要使用 IANA 时区数据库的实现?

Does C++20 require of the implementations the use of IANA Time Zone Database?

C++20 <chrono> 库支持本地时间和时区。该库的接口与 IANA Time Zone Database 的接口兼容,但问题是,C++ 标准是否要求实现实际使用 IANA 时区数据库及其所有历史数据?

在线 C++ 参考声称它确实如此:see here. The C++ Standard itself contains a weaker statement:

[time.zone] describes an interface for accessing the IANA Time Zone Database that interoperates with sys_­time and local_­time. This interface provides time zone support to both the civil calendar types ([time.cal]) and to user-defined calendars.

只说接口,没说数据。标准中时区库的后续描述没有进一步引用 IANA 时区数据库。

我的结论是C++ Reference是错误的,实现不需要使用IANA时区数据库。有人可以确认这个结论是否正确吗?

我的理解是该语言要求实现能够使用 IANA 时区数据库或任何模仿它的东西。这意味着一个区域需要有一个名称,一个与 UTC 的增量,以及可选的夏令时定义和每年变化的时间。

但是那个数据库的实际内容超出了C++标准,属于操作系统。这意味着如果 OS 提供了 IANA 时区数据库的真实(和最新)副本,该程序将可以访问它,但标准并不强制要求 OS 具有该最新副本,不执行携带一个在 OS 不。

C++ 标准委员会的库工作组与 those words for quite a bit, trying to get them right. The intent is that the std::lib supplies the IANA Time Zone Database 进行了较量。也许更重要的是,所有三大 std::lib 供应商都 on-board 有这个意图。

online standard 中未显示的是标准的参考书目部分,其中包含:


请注意 std::chrono 也支持 user-written 时区。 Here is an example of one1,下面是它的使用示例:

#include "date/ptz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;

    auto now = system_clock::now();
    auto tzp = Posix::time_zone{"EST5EDT,M3.2.0,M11.1.0"};
    cout << zoned_time{tzp, now} << '\n';
}

此示例建模 POSIX timezones,此示例显示“America/New_York”的当前定义(没有 2007 年之前的历史数据)。


1此示例耦合到 pre-C++20 chrono preview 而不是 std::chrono。要更改它只需要将对 namespace date 的引用更改为 namespace std::chrono.