How to create a vector of dates between a start and end date in C++

2 Answers

0 votes
#include <iostream>
#include <chrono>
#include <vector>

int main() {
    using namespace std;
    using namespace std::chrono;

    // Define start and end dates
    year_month_day start {year{2026}, month{1}, day{3}};
    year_month_day end   {year{2026}, month{1}, day{12}};

    // Convert to sys_days for arithmetic
    sys_days start_days = sys_days(start);
    sys_days end_days   = sys_days(end);

    if (start_days > end_days) {
        cerr << "Start date must be <= end date\n";
        return 1;
    }

    // Create vector of dates
    vector<year_month_day> dates;

    for (sys_days d = start_days; d <= end_days; d += days{1}) {
        dates.push_back(year_month_day{d});
    }

    // Print results
    for (const auto& d : dates) {
        cout << int(d.year()) << "-"
             << unsigned(d.month()) << "-"
             << unsigned(d.day()) << "\n";
    }
}



/*
run:

Generated 10 dates:
2026-01-03
2026-01-04
2026-01-05
2026-01-06
2026-01-07
2026-01-08
2026-01-09
2026-01-10
2026-01-11
2026-01-12

*/

 



answered Jan 30 by avibootz
0 votes
#include <iostream>
#include <chrono>
#include <vector>

using namespace std;
using namespace std::chrono;

// Convert Y-M-D to sys_days
sys_days to_sys_days(const year_month_day& ymd) {
    return sys_days{ymd};
}

// Convert sys_days to Y-M-D
year_month_day from_sys_days(const sys_days& sd) {
    return year_month_day{sd};
}

// Print a date
void print_date(const year_month_day& d) {
    cout << int(d.year()) << "-"
         << unsigned(d.month()) << "-"
         << unsigned(d.day()) << "\n";
}

// Compute number of days between two dates
int days_between(const year_month_day& a, const year_month_day& b) {
    sys_days sa = to_sys_days(a);
    sys_days sb = to_sys_days(b);
    
    return (sb - sa).count();
}

// Add N days to a date
year_month_day add_days(const year_month_day& d, int n) {
    sys_days sd = to_sys_days(d);
    sd += days{n};
    
    return from_sys_days(sd);
}

// Generate vector of dates from start to end (inclusive)
vector<year_month_day> generate_dates(const year_month_day& start,
                                      const year_month_day& end) {
    vector<year_month_day> result;

    sys_days s = to_sys_days(start);
    sys_days e = to_sys_days(end);

    if (s > e) return result;

    for (sys_days d = s; d <= e; d += days{1}) {
        result.push_back(from_sys_days(d));
    }

    return result;
}

int main() {
    year_month_day start {year{2026}, month{1}, day{3}};
    year_month_day end   {year{2026}, month{1}, day{12}};

    auto dates = generate_dates(start, end);

    cout << "Generated " << dates.size() << " dates:\n";

    for (const auto& d : dates)
        print_date(d);

    return 0;
}



/*
run:

Generated 10 dates:
2026-1-3
2026-1-4
2026-1-5
2026-1-6
2026-1-7
2026-1-8
2026-1-9
2026-1-10
2026-1-11
2026-1-12

*/

 



answered Jan 30 by avibootz
...