Windows Server上std::zoned_time无法运行的问题求助
std::chrono::zoned_time在Windows Server 2016崩溃问题解决
核心原因
Windows Server 2016(1809版本)的系统时区数据库未支持Antarctica/Casey这类IANA时区标识符,而Windows 10 21H2已完成IANA时区与系统本地时区的映射适配。代码中直接使用未被识别的IANA时区时,zoned_time构造函数会抛出未捕获的异常,导致程序崩溃。
验证方法
在Windows Server 2016上运行带异常捕获的代码,确认错误类型:
#include <iostream> #include <chrono> #include <stdexcept> using namespace std::chrono; int main() { try { zoned_time zt("Antarctica/Casey", sys_days{2021y/September/15d}+16h+45min); sys_info si = zt.get_info(); std::cout << si; } catch (const std::exception& e) { std::cout << "异常信息: " << e.what() << std::endl; } return 0; }
运行后会输出类似异常信息: The specified time zone cannot be found.的内容,证实是时区识别失败导致的崩溃。
解决方案
- 替换为Windows本地时区标识符:将
"Antarctica/Casey"替换为服务器支持的时区名称,比如"UTC+11",修改后代码如下:
#include <iostream> #include <chrono> using namespace std::chrono; int main() { zoned_time zt("UTC+11", sys_days{2021y/September/15d}+16h+45min); sys_info si = zt.get_info(); std::cout << si; return 0; }
更新服务器时区数据:安装Windows Server 2016的最新累积更新,微软后续更新补丁中补充了IANA时区的支持。通过Windows Update手动检查并安装所有可用更新后,系统即可识别
Antarctica/Casey这类时区。使用第三方时区库(可选):若无法更新系统,可集成ICU等第三方时区库,脱离对系统自带时区数据库的依赖,直接处理IANA时区。
内容的提问来源于stack exchange,提问作者jakub
相关产品推荐
相关产品推荐

