使用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; }
关键修正说明
- 周日计算优化:利用已正确获取的周一日期,直接累加6天得到周日,逻辑直观且避免了复杂的差值计算。
- 日期遍历逻辑:
- 将
year_month_day转换为sys_days类型(支持天数加减的时间点),方便日期递增操作。 - 使用
while循环从周一出发,每日递增1天,直到到达周日,确保覆盖完整的一周区间。
- 将
- 代码精简:移除重复的
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
相关产品推荐
相关产品推荐

