

新闻资讯
技术学院std::chrono 本身不直接支持时区转换;zoned_time 是 C++20 引入的类型,但它依赖于运行时加载的时区数据库(IANA TZDB),且标准库实现(如 libstdc++、libc++)对它的支持仍不完整或默认禁用。
zoned_time 在多数编译环境下无法直接使用Clang(libc++)和 GCC(libstdc++)目前均未默认启用完整的时区支持:
-lstdc++_tzdata,且 std::chrono::get_tzdb_list() 默认返回空_LIBCPP_HAS_TIME_ZONE_DATABASE 并静态链接 tzdb 数据,构建复杂,macOS 上甚至完全不可用(系统不提供 TZDB)GetDynamicTimeZoneInformation 有限支持本地时区,不支持任意 IANA 时区名(如 "Asia/Shanghai")date::zoned_time(Howard Hinnant 的 date 库)这是当前最可靠的方式——它被 ISO C++20 chrono 时区部分直接参考,且已稳定维护多年。只需头文件即可使用,无需系统 TZDB。
#include "date/date.h",命名空间为 date(不是 std)#include "date/date.h" #includeint main() { // 构造一个北京时间的 zoned_time auto bj = date::zoned_time{"Asia/Shanghai", std::chrono::system_clock::now()}; // 转为纽约时间 auto ny = date::zoned_time{"America/New_York", bj.get_local_time()}; std
::cout << "Beijing: " << bj << '\n'; std::cout << "New York: " << ny << '\n'; }
throw)date::locate_zone("xxx") 在找不到时区时会抛出 std::runtime_error,生产环境必须捕获:
zoned_time 构造函数date::locate_zone 获取 const date::time_zone* 指针nullptr(date 库 v3+ 改为抛异常,v2 返回 null)"China Standard Time"),需自行映射到 IANA 名try {
const auto* tz = date::locate_zone("Europe/London");
if (!tz) throw std::runtime_error("Unknown time zone");
auto zt = date::zoned_time{tz, std::chrono::system_clock::now()};
} catch (const std::exception& e) {
// handle error
}真正麻烦的从来不是写几行 zoned_time 代码,而是让程序在不同 OS、不同编译器、不同部署环境中都能找到并正确解析时区数据——标准库还没做到这点,别硬扛。用 date::zoned_time + 静态 TZDB 是目前唯一能落地的选择。