You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:51:33