如何用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
相关产品推荐
相关产品推荐

