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 中未显示的是标准的参考书目部分,其中包含:
- IANA 时区数据库。可从:https://www.iana.org/time-zones
请注意 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
.
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 中未显示的是标准的参考书目部分,其中包含:
- IANA 时区数据库。可从:https://www.iana.org/time-zones
请注意 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
.