You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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天。
  • 周末场景的调整:如果你的业务里,周末属于下一个工作周,只需要把今日的星期调整为下一周的对应星期再计算偏移量就好,代码里已经写好注释可以直接替换。

火山引擎 最新活动