最简单方法是用 std::time(nullptr) 获取 Unix 时间戳,但本地时间段判断应提取 tm 结构体的时分转为当日分钟数比较;跨午夜需拆分条件判断。

用 std::chrono 获取当前时间并转为本地时钟秒数
直接用 std::time(nullptr) 最简单,但它是 time_t 类型,本质是自 Unix epoch 起的秒数(通常为 signed integer),可直接参与比较。若需更高精度或跨平台一致性,std::chrono::system_clock::now() 更可靠,但必须转成秒级整数才能和时间段边界对齐:
auto now = std::chrono::system_clock::now();
auto now_sec = std::chrono::duration_cast<std::chrono::seconds>(
now.time_since_epoch()).count();
注意:system_clock 是 UTC 时间,不做时区转换;如果你的“特定时间段”是本地时间(比如“每天 9:00–17:30”),必须先用 std::localtime 或 C++20 的 zoned_time 提取本地时分,否则会出错。
提取当前本地小时和分钟做范围判断
最常用也最安全的做法:不比绝对时间戳,而是比“今天内的时分”。这样避免了跨天、夏令时、时区偏移等干扰:
- 用
std::time(nullptr)+std::localtime获取tm结构体 -
tm.tm_hour是 0–23,tm.tm_min是 0–59,组合成分钟级偏移(hour * 60 + min)更易比较 - 起止时间也统一转成“当天第几分钟”,例如 “9:30” →
9*60+30 = 570,“17:45” →1065
示例逻辑:
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
auto t = std::time(nullptr); auto lt = *std::localtime(&t); int now_minutes = lt.tm_hour * 60 + lt.tm_min; int start_minutes = 9 * 60 + 30; // 09:30 int end_minutes = 17 * 60 + 45; // 17:45 <p>bool in_range = (now_minutes >= start_minutes) && (now_minutes <= end_minutes);
处理跨午夜的时间段(如 22:00 到次日 06:00)
普通大于小于判断失效——因为 23:00(1380 分钟)> 05:00(300 分钟),但实际属于该区间。此时需拆成两个条件:
- 时间段不跨天:直接
start - 时间段跨天(
start > end):改用now >= start || now
完整判断函数可写成:
bool is_in_time_range(int now_min, int start_min, int end_min) {
if (start_min <= end_min) {
return now_min >= start_min && now_min <= end_min;
} else {
return now_min >= start_min || now_min <= end_min;
}
}
C++20 std::chrono::zoned_time 的正确用法(仅限较新编译器)
如果你用的是 GCC 13+/Clang 15+ 且开启 -std=c++20,可用标准库原生时区支持,但要注意:zoned_time 构造时必须显式指定时区名(如 "Asia/Shanghai"),不能只靠系统 locale:
using namespace std::chrono;
auto zt = zoned_time{"Asia/Shanghai", system_clock::now()};
auto lt = zt.get_local_time();
auto h = floor<hours>(lt).time_since_epoch().count() % 24;
auto m = floor<minutes>(lt).time_since_epoch().count() % 60;
容易踩的坑:zoned_time 不接受空字符串或 "local" 作为时区名;未安装 tzdata 或编译器未链接时区数据库会导致运行时报错 std::runtime_error: Unknown time zone: "Asia/Shanghai"。
跨天逻辑、本地时分提取、时区依赖——这三个点任一处理不当,都会让“是否在某时间段内”变成随机布尔值。

















