调用C++日期库current_zone()时为何访问下载文件夹?
Howard Hinnant日期库current_zone()访问下载文件夹的问题解析
1. 为什么会访问下载文件夹?
这是因为你的编译环境未启用USE_OS_TZDB宏,此时库会默认从用户下载目录下的tzdata文件夹读取时区数据库:
- 首次调用
current_zone()时,会触发延迟初始化的静态变量tzdb_list:static tzdb_list tz_db = create_tzdb(); create_tzdb()内部调用get_install()获取时区数据库路径,在!USE_OS_TZDB分支下,access_install()会生成下载目录路径:
Windows环境下,这个路径就是#if !USE_OS_TZDB static std::string& access_install() { static std::string install #ifndef INSTALL = get_download_folder() + folder_delimiter + "tzdata"; #endif }C:\Users\MyComputer\Downloads\tzdata\。- 库会检查该路径是否存在,不存在则抛出运行时错误:
if (!file_exists(install)) { std::string msg = "Timezone database not found at \""; msg += install; msg += "\""; throw std::runtime_error(msg); }
2. 为什么需要下载内容?
这里的**时区数据库(tzdata)**是IANA维护的全球时区规则集合,包含时区偏移、夏令时变更等精确时间规则。
- 操作系统确实自带时区数据,但该日期库提供两种模式:
- 启用
USE_OS_TZDB:直接调用系统API读取内置时区数据,无需额外文件 - 不启用
USE_OS_TZDB:依赖独立的IANA tzdata文件,需要你预先下载该数据包到指定路径
- 启用
3. 解决方法
- 优先推荐:编译时添加宏定义,让库使用系统时区数据:
- GCC/Clang:添加编译参数
-DUSE_OS_TZDB - MSVC:添加编译参数
/DUSE_OS_TZDB
- GCC/Clang:添加编译参数
- 若需使用独立tzdata:获取IANA tzdata数据包,解压到
C:\Users\MyComputer\Downloads\tzdata\路径下
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

