如何在C++17中借助Howard Hinnant的date.h库获取当周周一与周五的日期
如何在C++17中借助Howard Hinnant的date.h库获取当周周一与周五的日期
很高兴能帮你搞定这个问题!Howard Hinnant的date库确实把C++日期处理变得丝滑很多,你已经能获取今天的日期了,在此基础上扩展到周一和周五非常简单,我给你拆解清楚:
首先,先回顾你已经写好的获取今日日期的代码,我们就从这里出发:
auto todayDate = date::floor<date::days>(std::chrono::system_clock::now());
核心思路
要拿到当周的周一和周五,关键是利用date::weekday类型来计算日期偏移量——这个类型可以直接从date对象构造,还能做循环的星期运算,完全不用我们手动处理跨周的边界情况。
完整代码示例
下面是可直接运行的代码,我加了详细注释,还包含两种场景的处理(普通场景和周末自动划归下一周的场景):
#include <chrono> #include <date/date.h> #include <iostream> int main() { // 你已经实现的:获取当前系统日期(截断到天) auto todayDate = date::floor<date::days>(std::chrono::system_clock::now()); std::cout << "今日日期:" << date::format("%F", todayDate) << "\n"; // 步骤1:获取今日对应的星期 date::weekday today_wd = date::weekday{todayDate}; // 步骤2:计算本周周一(默认逻辑:包含今日的自然周,周日会对应上周周一) auto monday = todayDate - (today_wd - date::Monday); // 步骤3:周五直接通过周一加4天得到,简单又可靠 auto friday = monday + date::days{4}; // ------------------------------ // 可选:如果希望周末(周六/周日)自动划归下一个工作周 // 替换上面的步骤2和3为以下代码: // auto adjusted_wd = (today_wd >= date::Monday) ? today_wd : today_wd + date::days{7}; // auto monday = todayDate - (adjusted_wd - date::Monday); // auto friday = monday + date::days{4}; // ------------------------------ // 格式化输出结果 std::cout << "当周周一:" << date::format("%F", monday) << "\n"; std::cout << "当周周五:" << date::format("%F", friday) << "\n"; return 0; }
关键细节说明
date::weekday的运算:星期之间的减法会返回date::days类型的差值,而且是模7循环的,比如周日(date::Sunday,对应值0)减去周一(date::Monday,对应值1)会得到6天的差,自动帮我们处理了跨周的计算,不用写一堆if-else判断边界。- 周五的简化计算:直接用周一加4天得到周五,比单独从今日计算更不容易出错,毕竟周一到周五的间隔是固定的4天。
- 周末场景的调整:如果你的业务里,周末属于下一个工作周,只需要把今日的星期调整为下一周的对应星期再计算偏移量就好,代码里已经写好注释可以直接替换。




