C++日期库因时区而失败

C++ date library fails with timezone

本文关键字:失败 时区 日期 C++      更新时间:2023-10-16

这曾经玩过一次。我正在尝试从C++日期库中获取一些数据,但捕获了一个异常。我正在编译

-DUSE_AUTOLOAD=0 -DHAS_REMOTE_API=0 -DUSE_OS_TZDB=1

代码有什么问题?

#include <iostream>
#include "date/tz.h"
#include <exception>
using namespace date;
using namespace std::chrono;
int main(int argc, char** argv) {

try {
auto current_time_zone = make_zoned("Europe/Athens", std::chrono::system_clock::now());
auto current_day = date::format("%A", current_time_zone);
auto current_time = date::format("%H:%M", current_time_zone);
std::cout << "day: " << current_day << ", time: " << current_time << " in timezone: " << current_time_zone << std::endl;
//std::cout << " in timezone: " << current_time_zone << std::endl;
} catch ( std::exception& e) {
std::cout << e.what() << std::endl;
}
}

您需要使用-pthread标志。tz.cpp使用call_once来执行部分初始化。没有-pthread它将无法工作(因为它下面需要类似__gthread_once的东西(。有关更多详细信息,请参阅此处。

您可以通过使用gdb运行示例来验证这是否是问题所在(使用catch throw(。

我不确定问题是什么,但我可以告诉你,这个库不会抛出包含消息"未知错误"的异常。

尝试将-DONLY_C_LOCALE=1添加到生成标志。这将避免 std::lib 的time_put方面,但会将您限制为仅"C"区域设置。如果这解决了问题,那么是你的 std::lib 的std::time_put方面抛出了异常。