Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

calendar.cpp

Example of using date_time functions for generating calendar for current year.

//
//  Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
//
//  Distributed under the Boost Software License, Version 1.0. (See
//  accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)
//
#include <boost/locale.hpp>
#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
    using namespace boost::locale;

    generator gen;
    std::locale::global(gen(""));
    std::cout.imbue(std::locale());
    // Setup environment

    boost::locale::date_time now;

    date_time start=now;

    // Set the first day of the first month of this year
    start.set(period::month(),now.minimum(period::month()));
    start.set(period::day(),start.minimum(period::day()));

    int current_year = period::year(now);


    // Display current year
    std::cout << format("{1,ftime='%Y'}") % now << std::endl;

    //
    // Run forward untill current year is the date
    //
    for(now=start; period::year(now) == current_year;) {

        // Print heading of month
        if(calendar().is_gregorian()) 
            std::cout << format("{1,ftime='%B'}") % now <<std::endl;
        else
            std::cout << format("{1,ftime='%B'} ({1,ftime='%Y-%m-%d',locale=en} - {2,locale=en,ftime='%Y-%m-%d'})")
                % now 
                % date_time(now,now.maximum(period::day())*period::day()) << std::endl;

        int first = calendar().first_day_of_week();

        // Print weeks days
        for(int i=0;i<7;i++) {
            date_time tmp(now,period::day_of_week() * (first + i));
            std::cout << format("{1,w=8,ftime='%a'} ") % tmp;
        }
        std::cout << std::endl;

        int current_month = now / period::month();
        int skip = now / period::day_of_week_local() - 1;
        for(int i=0;i<skip*9;i++)
            std::cout << ' ';
        for(;now / period::month() == current_month ;now += period::day()) {
            std::cout << format("{1,w=8,ftime='%e'} ") % now;     
            if(now / period::day_of_week_local() == 7)
                std::cout << std::endl;
        }
        std::cout << std::endl;
    }

}
// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4