c++ 20要求实现使用IANA时区数据库吗?



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

在线c++参考资料声称它可以:见这里。c++标准本身包含一个较弱的语句:

[时间。zone]描述访问IANA时区数据库的接口,该接口与sys_time和local_time互操作。这个接口提供了对民用日历类型([time.cal])和用户定义日历的时区支持。

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

我的结论是c++参考是错误的,实现不需要使用IANA时区数据库。有人能证实这个结论是否正确吗?

c++标准委员会的库工作小组对这些词进行了相当多的争论,试图使它们正确。这样做的目的是std::lib提供IANA时区数据库。也许更重要的是,所有三个主要的std::lib供应商都有这个意图。

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

  • IANA时区数据库。可从:https://www.iana.org/time-zones
  • 获取

注意,std::chrono也支持用户编写的时区。下面是一个1的例子,下面是它的用法的例子:

#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时区,这个例子显示了"America/New_York"的当前定义。(没有2007年以前的历史数据)。


1这个例子与c++ 20之前的计时预览相耦合,而不是std::chrono。要更改它,只需要将对namespace date的引用更改为namespace std::chrono

我的阅读是,语言要求实现能够使用IANA时区数据库或任何模仿它。这意味着一个区域需要有一个名称,来自UTC的增量,以及可选的每年变化时间的日光节约时间的定义。

但是该数据库的实际内容超出了c++标准,属于操作系统。这意味着,如果操作系统提供了IANA时区数据库的真实(和最新)副本,程序将有权访问它,但标准并未强制操作系统拥有该最新副本,而在操作系统中携带该副本的实现则没有。

最新更新