调用date::make_zoned()时如何避免发起网络请求?
问题分析与解决方案
当设备联网时,使用Howard Hinnant的date库将std::chrono::system_clock::time_point转换为带时区的字符串耗时长达1s32ms,断网时仅需54ms。性能分析显示延迟来自date::remote_version...Curl_http_connect调用序列,这是因为date库默认会在首次加载时区数据时尝试连接远程服务器,检查时区数据库(tzdata)的版本更新。
要阻止联网状态下的这个远程连接行为,有两种可靠的解决方法:
方法一:禁用远程版本检查
通过定义编译宏DATE_DISABLE_REMOTE_VERSION_CHECK,可以直接关闭库的远程版本检查功能。
实现方式
- 编译时添加宏定义:比如使用g++编译时,添加参数:
g++ -DDATE_DISABLE_REMOTE_VERSION_CHECK your_code.cpp -o your_program - 代码中提前定义宏:在包含
date/tz.h之前手动定义该宏:#define DATE_DISABLE_REMOTE_VERSION_CHECK #include "date/tz.h" #include <chrono> #include <iostream> std::string tp2str(const std::chrono::system_clock::time_point &tp, const std::string &tz) { auto z = date::make_zoned(tz, tp); return date::format("%Y-%m-%d %H:%M:%S %Z (%A)", z); } int main() { const auto now = std::chrono::system_clock::now(); std::cout << tp2str(now, "US/Eastern") << std::endl; }
方法二:指定本地时区数据源
通过date::set_install函数设置本地时区数据的存储路径,让库直接从本地读取tzdata,避免触发远程检查。
实现示例
#include "date/tz.h" #include <chrono> #include <iostream> std::string tp2str(const std::chrono::system_clock::time_point &tp, const std::string &tz) { auto z = date::make_zoned(tz, tp); return date::format("%Y-%m-%d %H:%M:%S %Z (%A)", z); } int main() { // 设置本地时区数据目录,示例为Linux系统默认路径,Windows路径需自行调整 date::set_install("/usr/share/zoneinfo"); const auto now = std::chrono::system_clock::now(); std::cout << tp2str(now, "US/Eastern") << std::endl; }
这两种方法都能消除联网时的远程连接延迟,推荐优先使用方法一,操作更简洁;如果需要自定义时区数据路径,再选择方法二。
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

