【问题标题】:C++ date library fails with timezoneC++ 日期库因时区而失败
【发布时间】:2019-02-27 04:59:43
【问题描述】:

这曾经播放过一次。我正在尝试从 C++ date 库中获取一些数据,但捕获到异常。我正在编译

-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;

    }

}

【问题讨论】:

  • 我刚刚添加了标签 c++20,使这个问题成为话题。 OP 引用的库是 C++20 草案规范的示例实现。
  • .what() 中的消息是什么?
  • @SamVarshavchik:“我很好奇“日期库”“非常受欢迎”的证据是什么。“我不知道它是不是真的”非常受欢迎”,但我认为它被投票加入 C++20 的标准库将提高它的受欢迎程度;)对于那些跟上 C++ 发展的人来说,这是众所周知的。尽管 OP 对那些从未听说过的人说的不够清楚。
  • @HowardHinnant:未知错误-1
  • @cateof:我不确定问题出在哪里,但我可以告诉你,我的库不会引发包含“未知错误”消息的异常。尝试将-DONLY_C_LOCALE=1 添加到您的构建标志中。这将避免您的 std::lib 的 time_put 方面,但会将您仅限于“C”语言环境。如果这解决了问题,那么是您的 std::lib 的 std::time_put 方面引发了异常。

标签: c++ date c++20


【解决方案1】:

您需要使用-pthread 标志。 tz.cpp 使用 call_once 进行部分初始化。如果没有-pthread,它就无法工作(因为它下面需要__gthread_once 之类的东西)。详情请见this

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

【讨论】:

    【解决方案2】:

    我不确定问题是什么,但我可以告诉你this library 不会抛出包含“未知错误”消息的异常。

    尝试将-DONLY_C_LOCALE=1 添加到您的构建标志中。这将避免您的 std::lib 的 time_put 方面,但会将您仅限于“C”语言环境。如果这解决了问题,那么是您的 std::lib 的 std::time_put 方面引发了异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2021-07-10
      • 2013-11-24
      • 1970-01-01
      • 2013-01-06
      相关资源
      最近更新 更多