如何在 C++17 中使用 date.h 获取本周周一和周五的日期?
数据小许
先计算今天距离本周周一的天数,从今天减去这个天数得到周一,再加上 4 天得到周五。这里一周从周一开始,周六和周日归入此前那个周一开始的一周。
完整代码
假设头文件可以通过 "date.h" 引入;如果安装目录不同,请调整包含路径。
#include "date.h"
#include <chrono>
#include <iostream>
int main()
{
const auto todayDate =
date::floor<date::days>(std::chrono::system_clock::now());
const auto daysSinceMonday =
date::weekday{todayDate} - date::Monday;
const auto mondayDate = todayDate - daysSinceMonday;
const auto fridayDate = mondayDate + date::days{4};
std::cout << "Monday: " << date::format("%F", mondayDate) << '\n';
std::cout << "Friday: " << date::format("%F", fridayDate) << '\n';
}
为什么这样计算
date::weekday{todayDate} 获取当天的星期。两个 weekday 相减会返回 date::days,运算以 7 天为周期,结果在 0~6 天之间。因此,周一减去周一为 0 天,周三减去周一为 2 天,周日减去周一为 6 天。具体规则见 date.h 官方文档。
从今天减去这个差值,就得到本周周一;再加上 date::days{4},就得到同一周的周五。日期运算会处理跨月和跨年,无需手动调整月份或年份。
周末和时区需要注意什么
如果今天是周六或周日,代码会返回本周已经过去的周一和周五。如果业务需要下一个工作周,可以在周末将两个结果分别加上 date::days{7}。
代码直接对 system_clock::now() 按天取整,得到的是 UTC 日期,不会自动转换成计算机所在时区的日期。如果需要当地工作周,应先将当前时间转换到目标时区,再对当地时间按天取整。时区支持需要配合该项目的时区扩展,参见 官方文档的时区说明。
备注:内容仅供参考。
