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

如何用C++20 chrono或Howard Hinnant的date库解析时分格式字符串?

解析HH:MM时间字符串并计算距午夜的纳秒数

当然可以用%H:%M格式直接解析单独的时间字符串,借助Howard Hinnant的date库,不需要依赖日期部分就能得到距午夜的时长,再转换成纳秒即可。

方法一:直接解析为纳秒级时长

直接将解析结果存储到std::chrono::nanoseconds类型,date库会自动计算HH:MM对应的总时长:

#include <iostream>
#include <chrono>
#include <sstream>
#include <date/date.h>

int main()
{
    std::string str = "08:00";
    std::istringstream ss(str);

    std::chrono::nanoseconds since_midnight;
    // 用%H:%M格式解析到duration类型
    ss >> date::parse("%H:%M", since_midnight);

    if (ss.fail()) [[unlikely]]
        std::cerr << "parse failed\n";

    std::cout << "ns=" << since_midnight.count() << '\n'; // 输出28800000000000
    return 0;
}

方法二:分步解析时分再合并

如果需要更清晰地拆分小时和分钟,可以分别解析到hours和minutes类型,再相加转换为纳秒:

#include <iostream>
#include <chrono>
#include <sstream>
#include <date/date.h>

int main()
{
    std::string str = "08:00";
    std::istringstream ss(str);

    std::chrono::hours h;
    std::chrono::minutes m;
    // 按顺序解析小时和分钟
    ss >> date::parse("%H:%M", h, m);

    if (ss.fail()) [[unlikely]]
        std::cerr << "parse failed\n";

    auto since_midnight = h + m;
    // 转换为纳秒
    auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(since_midnight);
    std::cout << "ns=" << ns.count() << '\n'; // 输出28800000000000
    return 0;
}

关于hh_mm_ss

你提到的hh_mm_ss是C++20 chrono里的工具类,它的作用是将duration格式化为时分秒形式,而不是用来解析字符串的。解析时间字符串还是需要依赖date库的parse函数配合格式说明符。

内容的提问来源于stack exchange,提问作者Steve Lorimer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:15:52