最简单方法是用 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<:chrono::seconds>(
now.time_since_epoch()).count();
</:chrono::seconds>
注意: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
示例逻辑:
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 </p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill4025" title="C++ 算法竞赛自动化测试数据生成与校验框架"><img src="https://img.php.cn/upload/skill/000/000/081/178988956499722.jpg" alt="C++ 算法竞赛自动化测试数据生成与校验框架" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill4025" title="C++ 算法竞赛自动化测试数据生成与校验框架" class="overflowclass">C++ 算法竞赛自动化测试数据生成与校验框架</a> <p class="overflowclass">根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。</p> </div> <a rel="nofollow" href="/xiazai/skill4025" title="C++ 算法竞赛自动化测试数据生成与校验框架" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h3>处理跨午夜的时间段(如 22:00 到次日 06:00)</h3><p>普通大于小于判断失效——因为 23:00(1380 分钟)> 05:00(300 分钟),但实际属于该区间。此时需拆成两个条件:</p>
- 时间段不跨天:直接
start - 时间段跨天(
start > end):改用now >= start || now
完整判断函数可写成:
bool is_in_time_range(int now_min, int start_min, int end_min) {
if (start_min = start_min && now_min = start_min || now_min <h3>C++20 <code>std::chrono::zoned_time</code> 的正确用法(仅限较新编译器)</h3><p>如果你用的是 GCC 13+/Clang 15+ 且开启 <code>-std=c++20</code>,可用标准库原生时区支持,但要注意:<code>zoned_time</code> 构造时必须显式指定时区名(如 <code>"Asia/Shanghai"</code>),不能只靠系统 locale:</p><pre class="brush:php;toolbar:false;">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;
</minutes></hours>容易踩的坑:zoned_time 不接受空字符串或 "local" 作为时区名;未安装 tzdata 或编译器未链接时区数据库会导致运行时报错 std::runtime_error: Unknown time zone: "Asia/Shanghai"。
跨天逻辑、本地时分提取、时区依赖——这三个点任一处理不当,都会让“是否在某时间段内”变成随机布尔值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










