You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Howard Hinnant date库获取本周一至周日的所有日期

解决方案:获取本周周一至周日并遍历日期范围

问题分析

  • 周日日期计算错误:你直接使用date::Sunday.c_encoding()作为天数累加,这是错误的——c_encoding()返回的是周日在一周中的编码值(如6),并非当前日期到周日的间隔天数。
  • 遍历逻辑错误:原循环从错误的“周日”日期开始递增,导致输出的是次日起的7天,而非周一到周日的完整区间。

修正后的代码

#include <chrono>
#include <iostream>
#include <date/date.h>

int main()
{
    // 获取当前日期(截断为天级别)
    auto todays_date = date::floor<date::days>(std::chrono::system_clock::now());
    date::year_month_day currentDateYMD = todays_date;
    std::cout << "Current Date: " << date::format("%F", currentDateYMD) << "\n";

    // 计算本周周一的日期
    date::year_month_day mondayDate = todays_date - (date::weekday{todays_date} - date::Monday);
    std::cout << "Monday: " << date::format("%F", mondayDate) << "\n";

    // 计算本周周日的日期:基于周一加6天
    date::year_month_day sundayDate = date::sys_days(mondayDate) + date::days{6};
    std::cout << "Sunday: " << date::format("%F", sundayDate) << "\n";

    // 遍历周一至周日的所有日期
    std::cout << "\nWeek dates:\n";
    auto current = date::sys_days(mondayDate);
    const auto sunday = date::sys_days(sundayDate);
    while (current <= sunday)
    {
        std::cout << date::format("%F", date::year_month_day{current}) << "\n";
        current += date::days{1};
    }

    std::cin.get();
    return 0;
}

关键修正说明

  1. 周日计算优化:利用已正确获取的周一日期,直接累加6天得到周日,逻辑直观且避免了复杂的差值计算。
  2. 日期遍历逻辑:
    • 将year_month_day转换为sys_days类型(支持天数加减的时间点),方便日期递增操作。
    • 使用while循环从周一出发,每日递增1天,直到到达周日,确保覆盖完整的一周区间。
  3. 代码精简:移除重复的date::floor调用,简化变量定义,提升可读性。

示例输出(以2023-09-04为例)

Current Date: 2023-09-04
Monday: 2023-09-04
Sunday: 2023-09-10

Week dates:
2023-09-04
2023-09-05
2023-09-06
2023-09-07
2023-09-08
2023-09-09
2023-09-10

内容的提问来源于stack exchange,提问作者segmentation_fault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:02:46