代码之家  ›  专栏  ›  技术社区  ›  S.R Tom Panning

根据musl和glibc将数据/时间转换为tm/time_点。普通方式

  •  2
  • S.R Tom Panning  · 技术社区  · 7 年前

    我想将字符串数据转换为 struct tm (c) 或 std::chrono::time_point . 问题是我想为标准libc(glibc和 musl ). 我想解析树标准格式。

    1. 1994年11月6日星期日08:49:37 GMT

    2. “1994年11月6日星期日08:49:37 GMT”

    3. 1994年11月6日星期日08:49:37“

    有什么办法可以让它工作吗? std::get_time 有一个 bug
    strptime

    get_time . 但如果有必要的话,罚款。(可以使用GCC5>和c++11标准)

    1 回复  |  直到 7 年前
        1
  •  1
  •   S.R Tom Panning    7 年前

    Howard Hinnant's free, open source, header-only, date/time library std::chrono::time_point ,即使在出现故障的情况下 get_time strptime 设施它确实需要使用 std::istringstream

    #include "date.h"
    #include <sstream>
    
    std::chrono::system_clock::time_point
    parse_RFC_1123(const std::string& s)
    {
        std::istringstream in{s};
        std::chrono::system_clock::time_point tp;
        in >> date::parse("%a, %d %b %Y %T %Z", tp);
        return tp;
    }
    
    std::chrono::system_clock::time_point
    parse_RFC_850(const std::string& s)
    {
        std::istringstream in{s};
        std::chrono::system_clock::time_point tp;
        in >> date::parse("%a, %d-%b-%y %T %Z", tp);
        return tp;
    }
    
    std::chrono::system_clock::time_point
    parse_asctime(const std::string& s)
    {
        std::istringstream in{s};
        std::chrono::system_clock::time_point tp;
        in >> date::parse("%a %b %d %T %Y", tp);
        return tp;
    }
    

    可以这样操作:

    #include <iostream>
    
    int
    main()
    {
        auto tp = parse_RFC_1123("Sun, 06 Nov 1994 08:49:37 GMT");
        using namespace date;
        std::cout << tp << '\n';
        tp = parse_RFC_850("Sunday, 06-Nov-94 08:49:37 GMT");
        std::cout << tp << '\n';
        tp = parse_asctime("Sun Nov 6 08:49:37 1994");
        std::cout << tp << '\n';
    }
    

    和输出:

    1994-11-06 08:49:37.000000
    1994-11-06 08:49:37.000000
    1994-11-06 08:49:37.000000
    

    %a %b -DONLY_C_LOCALE=1 它变成了 与区域设置无关 . 它 应该 无论哪种方式,结果都是一样的。但从实际角度来看,如果您编译 没有 如果没有得到上述结果,则必须向std::lib供应商提交错误报告。

    如果你编译 具有 -DONLY\u C\u语言环境=1 如果你没有得到上面的结果,把我的笼子弄得嘎嘎作响,我会在几天内,甚至几个小时内把它修好。