
C++20 的 <chrono></chrono> 确实带来了日历和时区的原生支持,不再是靠第三方库(如 Howard Hinnant 的 date 库)打补丁了——它直接把 date 库的核心逻辑“收编”进了标准。用起来清晰、类型安全、无运行时依赖,但需要理解几个新概念才能真正上手。
C++20 引入了 std::chrono::year、std::chrono::month、std::chrono::day、std::chrono::year_month_day 等“日历类型”,它们不带时区、不带偏移,纯粹表示民用时间(civil time)。
例如:
std::chrono::year_month_day{2024y/3/15} 表示 2024 年 3 月 15 日(注意 2024y 是字面量后缀,需包含 <chrono></chrono>)auto ymd = sys_days{2024y/3/15}; 把日期转成系统时间点(即自 1970-01-01 的天数)ymd.time_since_epoch() 返回 days 类型,可转为整数天数sys_days 和 sys_time
std::chrono::sys_days 是 system_clock::time_point 的“天粒度”别名,代表 UTC 时间轴上的某一天零点(00:00:00 UTC)。
立即学习“C++免费学习笔记(深入)”;
想得到带具体时刻的时间点?组合使用:
auto tp = sys_days{2024y/3/15} + 14h + 30min; → 得到 2024-03-15 14:30:00 UTCauto tp_local = clock_cast<local_t>(tp);</local_t> → 转成本地时区(非 UTC,但仍是本地系统时区,不含 IANA 时区名)⚠️ 注意:local_t 不是某个具体时区(比如 “Asia/Shanghai”),只是当前系统的本地时区(由 std::chrono::current_zone() 返回的时区对象决定)。
C++20 支持完整的 IANA 时区数据库,但需满足两个前提:
_ENABLE_EXTENDED_ALIGNED_STORAGE 或使用 ICU)典型用法:
const auto tz = std::chrono::locate_zone("Asia/Shanghai"); → 获取时区指针auto tp_utc = tz->to_sys(2024y/3/15 / 14h + 30min); → 把本地时间(东八区)转为 UTC 时间点auto tp_local = tz->to_local(tp_utc); → 反向转换(含夏令时自动处理)tz->get_info(tp_utc).offset; → 查该时刻的 UTC 偏移(如 +0800)<format></format> 配合 std::chrono
C++20 的 <format></format> 直接支持日历和时区类型:
std::format("{:%Y-%m-%d %H:%M %Z}", tp_utc); → 输出 "2024-03-15 06:30 UTC"std::format("{:%F %T %Z}", tp_local_in_shanghai); → 输出 "2024-03-15 14:30:00 CST"std::chrono::parse(C++20 提供):std::istringstream s{"2024-03-15 14:30"};std::chrono::sys_seconds tp;s >> std::chrono::parse("%F %T", tp);
⚠️ 注意:parse 默认按 UTC 解析;若要按特定时区解析,需先转成对应时区时间再调用 to_sys。
不复杂但容易忽略:所有日历操作默认不检查有效性(如 2024y/2/30),但可通过 .ok() 成员函数验证,例如 (2024y/2/30).ok() 返回 false。
以上就是c++++20的日历和时区库怎么用 库的史诗级增强【现代C++】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号