推荐用 std::chrono::zoned_time(c++20)或 std::localtime_r(c++11–17)获取本地小时;前者自动处理时区、夏令时,后者线程安全,均返回 0–23 的 24 小时制整数。

用 std::chrono 提取当前小时(推荐,C++20 及以后更简洁)
直接从系统时钟获取本地时间的小时数,最现代、线程安全且无时区歧义的方式是用 std::chrono 配合 std::chrono::current_zone()(C++20)或回退到 std::localtime(C++11/14/17)。C++20 起能真正区分本地/UTC/任意时区,避免老方法在夏令时或跨时区机器上的偏差。
实操建议:
- 若已用 C++20:优先走
std::chrono::zoned_time+std::chrono::floor<:chrono::hours></:chrono::hours>路径,小时值来自get_local_time().hour() - 若限于 C++11–17:用
std::time(nullptr)→std::localtime→ 读tm_hour字段,注意std::localtime返回静态缓冲区,多线程下需加锁或改用std::localtime_r(POSIX)或std::localtime_s(MSVC) - 别直接用
std::gmtime然后手动加偏移——时区规则复杂,std::chrono::current_zone()才会查系统数据库(如 IANA tzdata)
std::localtime 返回的 tm_hour 是 24 小时制吗?
是。只要系统时区设置正确,std::localtime 解析出的 tm 结构体中 tm_hour 字段就是 0–23 的整数,对应本地时区的 24 小时制小时数,无需转换。
常见错误现象:
- 返回值始终是 0:没检查
std::localtime是否返回nullptr(输入时间无效或系统时区配置损坏) - 值比预期小 1 小时:机器时区设为 UTC 但你期望北京时间,本质是时区没配对,不是代码问题
- 多线程下偶尔错乱:多个线程同时调用
std::localtime会踩同一静态缓冲区,必须用线程安全变体
简短示例(C++11 安全版,Linux/macOS):
time_t now = time(nullptr); tm t; localtime_r(&now, &t); // 不再用 std::localtime int hour = t.tm_hour; // 0–23
Windows 下用 GetLocalTime 为什么有时不准?
GetLocalTime 返回的是系统当前「本地时间」,但它依赖 Windows 系统服务(如 Time Service)同步状态和注册表中时区设置(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation)。如果系统时间未同步、时区被手动篡改、或启用了“自动调整夏令时”,GetLocalTime 可能返回与 std::localtime 不一致的结果。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
使用场景建议:
- 仅限 Windows 原生 GUI 或服务开发,且不跨平台
- 若需和 C 标准库时间函数(如
strftime)结果保持一致,统一用std::localtime或 C++20zoned_time - 不要混合使用:
GetLocalTime+std::mktime容易因闰秒、DST 边界导致一小时偏差
C++20 zoned_time 获取小时的最小可靠写法
这是目前最健壮、可移植、且语义清晰的方式,能自动处理 DST 切换、历史时区变更等边界情况。
实操要点:
- 必须包含
<chrono></chrono>和<string></string>(C++20 中current_zone()返回const time_zone*) -
zoned_time{current_zone(), system_clock::now()}构造后,调用.get_local_time()得到local_time,再用.hour()成员函数提取小时 - 注意:
system_clock::now()是 UTC 时间戳,zoned_time会自动按本地时区规则转换
简短示例:
using namespace std::chrono;
auto zt = zoned_time{current_zone(), system_clock::now()};
auto lt = zt.get_local_time();
int hour = lt.hour(); // 0–23,类型是 int,非 unsigned
容易被忽略的是:C++20 的 hour() 成员只存在于 hh_mm_ss 或 local_time<duration></duration> 的特定 duration 类型上;直接对 sys_days 或 local_days 调用会编译失败——得先转成带时分秒精度的时间点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










