如何在C++中解析并格式化带时区信息的RFC-9557日期时间?
如何在C++中解析并格式化带时区信息的RFC-9557日期时间?
当然可以用C++20的<chrono>库搞定你所有的需求!我来一步步给你拆解:
1. 用哪个chrono结构存储所有信息?
你需要的是std::chrono::zoned_time,这个结构完美匹配RFC-9557的时间格式——它同时持有带精度的时间点和对应的时区对象,能完整保留2022-07-08T00:14:07+02:00[Europe/Paris]里的所有信息:时间戳、偏移、时区ID。
它的模板参数用来指定精度,比如zoned_time<seconds>是秒级精度,zoned_time<nanoseconds>就是纳秒级,完全满足你调整精度的需求。
2. 解析RFC-9557格式的字符串
C++20的std::chrono::parse直接支持这种格式,只需要对应正确的格式字符串就行。举个完整的示例代码:
#include <chrono> #include <iostream> #include <sstream> #include <string> #include <format> int main() { using namespace std::chrono; // 示例RFC-9557字符串,也可以换成带纳秒的版本 const std::string rfc_str = "2022-07-08T00:14:07+02:00[Europe/Paris]"; // 用秒级精度的zoned_time存储 zoned_time<seconds> parsed_time; std::istringstream input(rfc_str); // 格式字符串完全匹配RFC-9557的结构 input >> parse("%FT%T%Ez[%Z]", parsed_time); // 检查解析是否成功 if (!input) { std::cerr << "日期时间解析失败!可能是格式错误或时区/偏移不一致" << std::endl; return 1; } std::cout << "解析成功!当前时间(本地时区显示):" << parsed_time << std::endl; return 0; }
3. 检查偏移与时区的一致性
你不用担心手动对比——<chrono>在解析时会自动验证:当字符串里的偏移和时区ID在该时间点的实际偏移不匹配时(比如巴黎7月应该是+02:00,但字符串写了+01:00),parse会让输入流进入错误状态,你只需要检查input的状态就能判断一致性是否符合要求,就像上面代码里的if (!input)判断。
4. 格式化回RFC-9557格式
用std::format配合同样的格式字符串就能轻松格式化回去,而且可以根据精度调整格式:
// 秒级精度格式化回原格式 std::cout << "格式化为RFC-9557(秒级):" << format("%FT%T%Ez[%Z]", parsed_time) << std::endl; // 如果是纳秒级的zoned_time,调整格式字符串保留纳秒 zoned_time<nanoseconds> ns_time = parsed_time; std::cout << "格式化为RFC-9557(纳秒级):" << format("%FT%T%9f%Ez[%Z]", ns_time) << std::endl;
如果你的编译器支持C++20,这些代码都能直接跑起来,完全不需要额外的库。
内容来源于stack exchange
相关产品推荐
相关产品推荐

