gpt4 book ai didi

c++ - 如何在C++中查找上周一的日期

转载 作者:太空狗 更新时间:2023-10-29 20:33:14 24 4
gpt4 key购买 nike

我想制作一个不接受输入并返回上周一日期的程序。 (我不关心时区。我只担心公历)。我正在使用 date by Howard Hinnant .这就是我目前的做法:

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

int main() {

auto todays_day = date::year_month_weekday(date::floor<date::days>(std::chrono::system_clock::now()));

auto todays_date = date::floor<date::days>(std::chrono::system_clock::now());

int offset = 0;

auto weekday = todays_day.weekday();

if(weekday == date::Tuesday)
offset = 1;
else if (weekday == date::Wednesday)
offset = 2;
else if (weekday == date::Thursday)
offset = 3;
else if (weekday == date::Friday)
offset = 4;
else if (weekday == date::Saturday)
offset = 5;
else if (weekday == date::Sunday)
offset = 6;

auto lastMonday = date::year_month_day(todays_date - date::days(offset));

std::cout << lastMonday;
}

没有 boost::previous_weekday 有更好的方法吗? ? (不是必须不用boost,只是想知道可不可以)

最佳答案

了解如何更简单地做到这一点的关键是了解关于 Howard Hinnant's date library 的这一事实:

weekday 差异是循环的(如果您愿意,也可以对 7 取模)。也就是说,从任何 weekday 中减去任何 weekday 都会得到 [0, 6] 范围内的 days 数。这有效地隐藏了 weekday 的底层编码。

因此不需要将 [Monday, Sunday] 翻译成 [0, 6](或任何其他编码):

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

int
main()
{
auto todays_date = date::floor<date::days>(std::chrono::system_clock::now());
date::year_month_day lastMonday = todays_date -
(date::weekday{todays_date} - date::Monday);
std::cout << lastMonday << '\n';
}

相反,您只需决定需要从 sys_days 中减去多少天(本例中为 todays_date)。该天数是今天的 weekday 减去 Monday。如果今天是星期一,则结果是天{0}。如果今天是 Sunday,则结果是 days{6}。我们也可以谈论寻找上周五。逻辑不会改变。

此外,可以直接将 sys_days 转换为 weekday。无需经过 year_month_weekday

如果今天恰好是星期一,OP 问题中的代码会将“前一个星期一”视为今天。那很好。这正是许多“前一个工作日”算法所需要的。这就是我在上面编码的逻辑。

但是,如果您要查找的工作日是今天,则通常希望 previous-weekday-algorithm 的结果是上周。 IE。如果今天是星期一,计算一周前而不是今天。这也很容易做到,而且算法几乎相同。如果您需要这种行为,只需在算法开始时减去一天:

auto todays_date = ...
todays_date -= date::days{1};
date::year_month_day lastMonday = ...

关于c++ - 如何在C++中查找上周一的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com