Get past plus future date and get all dates in said range

I am using Howard Hinnant’s awesome date library to do some date calculations.

What I want to do is get Monday’s date wherever I am and then get Sunday’s date wherever I am. Then I want to get all the dates in between said Monday and Sunday. I don’t need time info, just the dates

With this answer, I am able to get Monday’s date as per Howard Hinnant’s answer.

What I am struggling with is going forward to calculate Sunday’s and thus I’m not sure how to get all the dates between the ranges (Monday – Sunday)

This what I have tried thus far:

#include <chrono>
#include <iostream>

#include <date/date.h>

int main()
{
    auto currentDateYMD = date::year_month_day{ date::floor<date::days>(std::chrono::system_clock::now()) };
    auto todays_date = date::floor<date::days>(std::chrono::system_clock::now());
    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";

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

    todays_date += date::days{ date::Sunday.c_encoding() }; // should go forward to Sunday's date
    std::cout << "Sunday: " << date::format("%F", todays_date) << " \n"; // prints today's date

    // calculate range
    for (unsigned int i = 0; i < /*date::Sunday.c_encoding()*/ 7; i++) {
        std::cout << "Future Date: " << date::format("%F", ++todays_date) << " \n";
    }

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

Which outputs this:

Current Date: 2023-09-04
Monday: 2023-09-04
Sunday: 2023-09-04
Future Date: 2023-09-05
Future Date: 2023-09-06
Future Date: 2023-09-07
Future Date: 2023-09-08
Future Date: 2023-09-09
Future Date: 2023-09-10
Future Date: 2023-09-11

I am not sure what I am missing nor am I sure how to "traverse the range" to get dates

I am using C++17 thus I am using the date library and not std::chrono.

>Solution :

todays_date += date::days{ date::Sunday.c_encoding() }; // should go forward to Sunday's date

In general, try to stay away from the member functions .c_encoding() and .iso_encoding() as these are "escape hatches" out of the type-safe chrono system. They are best used when you have to interface with some code outside of the chrono library.

Instead you could just:

todays_date += date::days{ 6 }; // go forward to Sunday's date

Or, if you would rather compute the days{6} you could:

todays_date += date::Sunday - date::Monday; // go forward to Sunday's date

because Sunday is always 6 days after Monday (no matter the encoding under the hood).

And in your loop, you could just test the weekday and exit when you want. Maybe something like:

do
{
    std::cout << "Future Date: " << date::format("%F", ++todays_date) << " \n";
} while (date::weekday{todays_date} != date::Sunday);

Though counting to 7 as you’re doing is fine too. I’m just showing a different possibility.

Leave a Reply