Initial commit
This commit is contained in:
20
libs/date_time/example/gregorian/Jamfile.v2
Normal file
20
libs/date_time/example/gregorian/Jamfile.v2
Normal file
@@ -0,0 +1,20 @@
|
||||
# Copyright (c) 2002-2006 CrystalClear Software, Inc.
|
||||
# Use, modification and distribution is subject to the
|
||||
# Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
#
|
||||
|
||||
project
|
||||
: requirements <library>../../build/boost_date_time
|
||||
;
|
||||
|
||||
exe dates_as_strings : dates_as_strings.cpp ;
|
||||
exe end_of_month_day : end_of_month_day.cpp ;
|
||||
exe period_calc : period_calc.cpp ;
|
||||
exe days_alive : days_alive.cpp ;
|
||||
exe print_holidays : print_holidays.cpp ;
|
||||
exe days_since_year_start : days_since_year_start.cpp ;
|
||||
exe print_month : print_month.cpp ;
|
||||
exe days_till_new_year : days_till_new_year.cpp ;
|
||||
exe date_localization : localization.cpp ;
|
||||
|
||||
127
libs/date_time/example/gregorian/date_serialization_demo.cpp
Normal file
127
libs/date_time/example/gregorian/date_serialization_demo.cpp
Normal file
@@ -0,0 +1,127 @@
|
||||
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include "boost/date_time/gregorian/greg_serialize.hpp"
|
||||
#include "boost/serialization/set.hpp"
|
||||
#include "boost/serialization/list.hpp"
|
||||
#include "boost/archive/text_oarchive.hpp"
|
||||
#include "boost/archive/text_iarchive.hpp"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
using namespace boost::gregorian;
|
||||
typedef std::set<date> date_set;
|
||||
typedef std::list<date> date_list;
|
||||
|
||||
void print(std::ostream& os, const date_set& ds)
|
||||
{
|
||||
os << "******** Date Set *********" << std::endl;
|
||||
date_set::const_iterator itr = ds.begin();
|
||||
while (itr != ds.end())
|
||||
{
|
||||
os << (*itr) << " ";
|
||||
itr++;
|
||||
}
|
||||
os << "\n***************************" << std::endl;
|
||||
}
|
||||
|
||||
class foo {
|
||||
public:
|
||||
foo(date d = date(not_a_date_time),
|
||||
int i = 0) :
|
||||
my_date(d),
|
||||
my_int(i)
|
||||
{}
|
||||
void insert_date(date d)
|
||||
{
|
||||
my_dates.push_back(d);
|
||||
}
|
||||
void print(std::ostream& os) const
|
||||
{
|
||||
os << "foo= my_date is: " << my_date
|
||||
<< " my_int is: " << my_int;
|
||||
date_list::const_iterator i = my_dates.begin();
|
||||
os << " Important dates: ";
|
||||
while (i != my_dates.end()) {
|
||||
os << (*i) << " ";
|
||||
i++;
|
||||
}
|
||||
os << std::endl;
|
||||
}
|
||||
private:
|
||||
friend class boost::serialization::access;
|
||||
|
||||
// is a type of input archive the & operator is defined similar to >>.
|
||||
template<class Archive>
|
||||
void serialize(Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & my_date;
|
||||
ar & my_int;
|
||||
ar & my_dates;
|
||||
}
|
||||
|
||||
date my_date;
|
||||
int my_int;
|
||||
date_list my_dates;
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
try {
|
||||
date d(2004, Apr, 5);
|
||||
std::cout << "Date: " << to_iso_string(d) << std::endl;
|
||||
std::cout << "Date: " << d << std::endl;
|
||||
std::ofstream ofs("date_demo.txt");
|
||||
boost::archive::text_oarchive oa(ofs);
|
||||
oa << d;
|
||||
|
||||
std::cout << "Construct a foo" << std::endl;
|
||||
foo f(d, 1);
|
||||
f.insert_date(d+days(1));
|
||||
f.insert_date(d+days(2));
|
||||
f.insert_date(d+days(3));
|
||||
f.print(std::cout);
|
||||
oa << f;
|
||||
|
||||
date_set dates;
|
||||
dates.insert(date(2004, Apr,1));
|
||||
dates.insert(date(2004, Apr,10));
|
||||
dates.insert(date(2004, Apr,15));
|
||||
print(std::cout, dates);
|
||||
|
||||
oa << dates;
|
||||
ofs.close();
|
||||
|
||||
std::cout << "Now do the input streaming" << std::endl;
|
||||
date d2(not_a_date_time);
|
||||
std::ifstream ifs("date_demo.txt");
|
||||
boost::archive::text_iarchive ia(ifs);
|
||||
ia >> d2;
|
||||
|
||||
std::cout << "New date is: " << d2 << std::endl;
|
||||
|
||||
foo f2;
|
||||
ia >> f2;
|
||||
f2.print(std::cout);
|
||||
|
||||
date_set dates2;
|
||||
ia >> dates2; //exception here
|
||||
print(std::cout, dates2);
|
||||
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
std::cout << "Caught Exception: " << e.what() << std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
63
libs/date_time/example/gregorian/dates_as_strings.cpp
Normal file
63
libs/date_time/example/gregorian/dates_as_strings.cpp
Normal file
@@ -0,0 +1,63 @@
|
||||
/* The following is a simple example that shows conversion of dates
|
||||
* to and from a std::string.
|
||||
*
|
||||
* Expected output:
|
||||
* 2001-Oct-09
|
||||
* 2001-10-09
|
||||
* Tuesday October 9, 2001
|
||||
* An expected exception is next:
|
||||
* Exception: Month number is out of range 1..12
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
try {
|
||||
// The following date is in ISO 8601 extended format (CCYY-MM-DD)
|
||||
std::string s("2001-10-9"); //2001-October-09
|
||||
date d(from_simple_string(s));
|
||||
std::cout << to_simple_string(d) << std::endl;
|
||||
|
||||
//Read ISO Standard(CCYYMMDD) and output ISO Extended
|
||||
std::string ud("20011009"); //2001-Oct-09
|
||||
date d1(from_undelimited_string(ud));
|
||||
std::cout << to_iso_extended_string(d1) << std::endl;
|
||||
|
||||
//Output the parts of the date - Tuesday October 9, 2001
|
||||
date::ymd_type ymd = d1.year_month_day();
|
||||
greg_weekday wd = d1.day_of_week();
|
||||
std::cout << wd.as_long_string() << " "
|
||||
<< ymd.month.as_long_string() << " "
|
||||
<< ymd.day << ", " << ymd.year
|
||||
<< std::endl;
|
||||
|
||||
//Let's send in month 25 by accident and create an exception
|
||||
std::string bad_date("20012509"); //2001-??-09
|
||||
std::cout << "An expected exception is next: " << std::endl;
|
||||
date wont_construct(from_undelimited_string(bad_date));
|
||||
//use wont_construct so compiler doesn't complain, but you wont get here!
|
||||
std::cout << "oh oh, you shouldn't reach this line: "
|
||||
<< to_iso_string(wont_construct) << std::endl;
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
std::cout << " Exception: " << e.what() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
47
libs/date_time/example/gregorian/days_alive.cpp
Normal file
47
libs/date_time/example/gregorian/days_alive.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
/* Short example that calculates the number of days since user was born.
|
||||
* Demonstrates comparisons of durations, use of the day_clock,
|
||||
* and parsing a date from a string.
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
||||
using namespace boost::gregorian;
|
||||
std::string s;
|
||||
std::cout << "Enter birth day YYYY-MM-DD (eg: 2002-02-01): ";
|
||||
std::cin >> s;
|
||||
try {
|
||||
date birthday(from_simple_string(s));
|
||||
date today = day_clock::local_day();
|
||||
days days_alive = today - birthday;
|
||||
days one_day(1);
|
||||
if (days_alive == one_day) {
|
||||
std::cout << "Born yesterday, very funny" << std::endl;
|
||||
}
|
||||
else if (days_alive < days(0)) {
|
||||
std::cout << "Not born yet, hmm: " << days_alive.days()
|
||||
<< " days" <<std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "Days alive: " << days_alive.days() << std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
catch(...) {
|
||||
std::cout << "Bad date entered: " << s << std::endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
38
libs/date_time/example/gregorian/days_between_new_years.cpp
Normal file
38
libs/date_time/example/gregorian/days_between_new_years.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
/* Provides a simple example of using a date_generator, and simple
|
||||
* mathematical operatorations, to calculate the days since
|
||||
* New Years day of this year, and days until next New Years day.
|
||||
*
|
||||
* Expected results:
|
||||
* Adding together both durations will produce 365 (366 in a leap year).
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
date today = day_clock::local_day();
|
||||
partial_date new_years_day(1,Jan);
|
||||
//Subtract two dates to get a duration
|
||||
days days_since_year_start = today - new_years_day.get_date(today.year());
|
||||
std::cout << "Days since Jan 1: " << days_since_year_start.days()
|
||||
<< std::endl;
|
||||
|
||||
days days_until_year_start = new_years_day.get_date(today.year()+1) - today;
|
||||
std::cout << "Days until next Jan 1: " << days_until_year_start.days()
|
||||
<< std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
25
libs/date_time/example/gregorian/days_since_year_start.cpp
Normal file
25
libs/date_time/example/gregorian/days_since_year_start.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
date today = day_clock::local_day();
|
||||
//Subtract two dates to get a duration
|
||||
date_duration days_since_year_start = today - date(today.year(),Jan,1);
|
||||
std::cout << "Days since Jan 1: " << days_since_year_start.days()
|
||||
<< std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
26
libs/date_time/example/gregorian/days_till_new_year.cpp
Normal file
26
libs/date_time/example/gregorian/days_till_new_year.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
// This example displays the amount of time until new year's in days
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
date::ymd_type today = day_clock::local_day_ymd();
|
||||
date new_years_day(today.year + 1,1,1);
|
||||
date_duration dd = new_years_day - date(today);
|
||||
|
||||
std::cout << "Days till new year: " << dd.days() << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
46
libs/date_time/example/gregorian/end_of_month_day.cpp
Normal file
46
libs/date_time/example/gregorian/end_of_month_day.cpp
Normal file
@@ -0,0 +1,46 @@
|
||||
/* Simple program that uses the gregorian calendar to find the last
|
||||
* day of the month and then display the last day of every month left
|
||||
* in the year.
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
|
||||
std::cout << " Enter Year(ex: 2002): ";
|
||||
int year, month;
|
||||
std::cin >> year;
|
||||
std::cout << " Enter Month(1..12): ";
|
||||
std::cin >> month;
|
||||
try {
|
||||
int day = gregorian_calendar::end_of_month_day(year,month);
|
||||
date end_of_month(year,month,day);
|
||||
|
||||
//Iterate thru by months --
|
||||
month_iterator mitr(end_of_month,1);
|
||||
date start_of_next_year(year+1, Jan, 1);
|
||||
//loop thru the days and print each one
|
||||
while (mitr < start_of_next_year){
|
||||
std::cout << to_simple_string(*mitr) << std::endl;
|
||||
++mitr;
|
||||
}
|
||||
|
||||
}
|
||||
catch(...) {
|
||||
std::cout << "Invalid Date Entered" << std::endl;
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
53
libs/date_time/example/gregorian/find_last_day_of_months.cpp
Normal file
53
libs/date_time/example/gregorian/find_last_day_of_months.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
/* Simple program that finds the last day of the given month,
|
||||
* then displays the last day of every month left in the given year.
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
|
||||
greg_year year(1400);
|
||||
greg_month month(1);
|
||||
|
||||
// get a month and a year from the user
|
||||
try {
|
||||
int y, m;
|
||||
std::cout << " Enter Year(ex: 2002): ";
|
||||
std::cin >> y;
|
||||
year = greg_year(y);
|
||||
std::cout << " Enter Month(1..12): ";
|
||||
std::cin >> m;
|
||||
month = greg_month(m);
|
||||
}
|
||||
catch(bad_year by) {
|
||||
std::cout << "Invalid Year Entered: " << by.what() << '\n'
|
||||
<< "Using minimum values for month and year." << std::endl;
|
||||
}
|
||||
catch(bad_month bm) {
|
||||
std::cout << "Invalid Month Entered" << bm.what() << '\n'
|
||||
<< "Using minimum value for month. " << std::endl;
|
||||
}
|
||||
|
||||
date start_of_next_year(year+1, Jan, 1);
|
||||
date d(year, month, 1);
|
||||
|
||||
// add another month to d until we enter the next year.
|
||||
while (d < start_of_next_year){
|
||||
std::cout << to_simple_string(d.end_of_month()) << std::endl;
|
||||
d += months(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2005: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
100
libs/date_time/example/gregorian/localization.cpp
Normal file
100
libs/date_time/example/gregorian/localization.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/* The following shows the creation of a facet for the output of
|
||||
* dates in German (please forgive me for any errors in my German --
|
||||
* I'm not a native speaker).
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
/* Define a series of char arrays for short and long name strings
|
||||
* to be associated with German date output (US names will be
|
||||
* retrieved from the locale). */
|
||||
const char* const de_short_month_names[] =
|
||||
{
|
||||
"Jan", "Feb", "Mar", "Apr", "Mai", "Jun",
|
||||
"Jul", "Aug", "Sep", "Okt", "Nov", "Dez", "NAM"
|
||||
};
|
||||
const char* const de_long_month_names[] =
|
||||
{
|
||||
"Januar", "Februar", "Marz", "April", "Mai",
|
||||
"Juni", "Juli", "August", "September", "Oktober",
|
||||
"November", "Dezember", "NichtDerMonat"
|
||||
};
|
||||
const char* const de_long_weekday_names[] =
|
||||
{
|
||||
"Sonntag", "Montag", "Dienstag", "Mittwoch",
|
||||
"Donnerstag", "Freitag", "Samstag"
|
||||
};
|
||||
const char* const de_short_weekday_names[] =
|
||||
{
|
||||
"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"
|
||||
};
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
|
||||
// create some gregorian objects to output
|
||||
date d1(2002, Oct, 1);
|
||||
greg_month m = d1.month();
|
||||
greg_weekday wd = d1.day_of_week();
|
||||
|
||||
// create a facet and a locale for German dates
|
||||
date_facet* german_facet = new date_facet();
|
||||
std::cout.imbue(std::locale(std::locale::classic(), german_facet));
|
||||
|
||||
// create the German name collections
|
||||
date_facet::input_collection_type short_months, long_months,
|
||||
short_weekdays, long_weekdays;
|
||||
std::copy(&de_short_month_names[0], &de_short_month_names[11],
|
||||
std::back_inserter(short_months));
|
||||
std::copy(&de_long_month_names[0], &de_long_month_names[11],
|
||||
std::back_inserter(long_months));
|
||||
std::copy(&de_short_weekday_names[0], &de_short_weekday_names[6],
|
||||
std::back_inserter(short_weekdays));
|
||||
std::copy(&de_long_weekday_names[0], &de_long_weekday_names[6],
|
||||
std::back_inserter(long_weekdays));
|
||||
|
||||
// replace the default names with ours
|
||||
// NOTE: date_generators and special_values were not replaced as
|
||||
// they are not used in this example
|
||||
german_facet->short_month_names(short_months);
|
||||
german_facet->long_month_names(long_months);
|
||||
german_facet->short_weekday_names(short_weekdays);
|
||||
german_facet->long_weekday_names(long_weekdays);
|
||||
|
||||
// output the date in German using short month names
|
||||
german_facet->format("%d.%m.%Y");
|
||||
std::cout << d1 << std::endl; //01.10.2002
|
||||
|
||||
german_facet->month_format("%B");
|
||||
std::cout << m << std::endl; //Oktober
|
||||
|
||||
german_facet->weekday_format("%A");
|
||||
std::cout << wd << std::endl; //Dienstag
|
||||
|
||||
|
||||
// Output the same gregorian objects using US names
|
||||
date_facet* us_facet = new date_facet();
|
||||
std::cout.imbue(std::locale(std::locale::classic(), us_facet));
|
||||
|
||||
us_facet->format("%m/%d/%Y");
|
||||
std::cout << d1 << std::endl; // 10/01/2002
|
||||
|
||||
// English names, iso order (year-month-day), '-' separator
|
||||
us_facet->format("%Y-%b-%d");
|
||||
std::cout << d1 << std::endl; // 2002-Oct-01
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/* Copyright 2001-2005: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
58
libs/date_time/example/gregorian/month_add.cpp
Normal file
58
libs/date_time/example/gregorian/month_add.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
/* Simple program that uses the gregorian calendar to progress by exactly
|
||||
* one month, regardless of how many days are in that month.
|
||||
*
|
||||
* This method can be used as an alternative to iterators
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
date d = day_clock::local_day();
|
||||
date d2 = d + months(1);
|
||||
date d3 = d - months(1);
|
||||
std::cout << "Today is: " << to_simple_string(d) << ".\n"
|
||||
<< "One month from today will be: " << to_simple_string(d2) << ".\n"
|
||||
<< "One month ago was: " << to_simple_string(d3)
|
||||
<< std::endl;
|
||||
std::cout << "******** Warning read this ***********************\n";
|
||||
std::cout << "Be aware that adding a month is not exactly like regular numeric math.\n"
|
||||
<< "Addition/Subtraction of months will 'snap to the end' of a month that\n"
|
||||
<< "is shorter than the current month. For example consider "
|
||||
<< "Jan 31, 2004 + (1 month)\n";
|
||||
date d4(2004, Jan, 31);
|
||||
date d5 = d4 + months(1);
|
||||
std::cout << "Result is: " << to_simple_string(d5)
|
||||
<< std::endl;
|
||||
|
||||
std::cout << "\nSo what does this mean? It means the result of adding months is order\n"
|
||||
<< "dependent, non-commutative, and may create problems for applications.\n"
|
||||
<< "Consider: \n"
|
||||
<< "Jan 30, 2004 + (1 month) + (1 month) != Jan 30, 2004 + (2 months)\n"
|
||||
<< "Why not? Because Jan 30, 2004 + 1 month is Feb 29 + 1 month is Mar 31st.\n"
|
||||
<< "while Jan 30, 2004 + 2 months is Mar 30th.\n"
|
||||
<< "All of this clears up as long as all the starting dates before the 28th of\n"
|
||||
<< "the month -- then all the behavior follows classical mathematical rules.\n";
|
||||
|
||||
date d6(2004, Jan, 30);
|
||||
date d7 = d6 + months(1) + months(1);
|
||||
date d8 = d6 + months(2);
|
||||
std::cout << "2004-01-30 + (1 month) + (1 month) is: " << to_simple_string(d7) << ".\n"
|
||||
<< "2004-01-30 + (2 months) is: " << to_simple_string(d8)
|
||||
<< std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2005: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
86
libs/date_time/example/gregorian/period_calc.cpp
Normal file
86
libs/date_time/example/gregorian/period_calc.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
This example demonstrates a simple use of periods for the calculation
|
||||
of date information.
|
||||
|
||||
The example calculates if a given date is a weekend or holiday
|
||||
given an exclusion set. That is, each weekend or holiday is
|
||||
entered into the set as a time interval. Then if a given date
|
||||
is contained within any of the intervals it is considered to
|
||||
be within the exclusion set and hence is a offtime.
|
||||
|
||||
Output:
|
||||
Number Excluded Periods: 5
|
||||
20020202/20020203
|
||||
20020209/20020210
|
||||
20020212/20020212
|
||||
20020216/20020217
|
||||
In Exclusion Period: 20020216 --> 20020216/20020217
|
||||
20020223/20020224
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
|
||||
typedef std::set<boost::gregorian::date_period> date_period_set;
|
||||
|
||||
//Simple population of the exclusion set
|
||||
date_period_set
|
||||
generateExclusion()
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
date_period periods_array[] =
|
||||
{ date_period(date(2002,Feb,2), date(2002,Feb,4)),//weekend of 2nd-3rd
|
||||
date_period(date(2002,Feb,9), date(2002,Feb,11)),
|
||||
date_period(date(2002,Feb,16), date(2002,Feb,18)),
|
||||
date_period(date(2002,Feb,23), date(2002,Feb,25)),
|
||||
date_period(date(2002,Feb,12), date(2002,Feb,13))//a random holiday 2-12
|
||||
};
|
||||
const int num_periods = sizeof(periods_array)/sizeof(date_period);
|
||||
|
||||
date_period_set ps;
|
||||
//insert the periods in the set
|
||||
std::insert_iterator<date_period_set> itr(ps, ps.begin());
|
||||
std::copy(periods_array, periods_array+num_periods, itr );
|
||||
return ps;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
|
||||
date_period_set ps = generateExclusion();
|
||||
std::cout << "Number Excluded Periods: " << ps.size() << std::endl;
|
||||
|
||||
date d(2002,Feb,16);
|
||||
date_period_set::const_iterator i = ps.begin();
|
||||
//print the periods, check for containment
|
||||
for (;i != ps.end(); i++) {
|
||||
std::cout << to_iso_string(*i) << std::endl;
|
||||
//if date is in exclusion period then print it
|
||||
if (i->contains(d)) {
|
||||
std::cout << "In Exclusion Period: "
|
||||
<< to_iso_string(d) << " --> " << to_iso_string(*i)
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
83
libs/date_time/example/gregorian/print_holidays.cpp
Normal file
83
libs/date_time/example/gregorian/print_holidays.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
/* Generate a set of dates using a collection of date generators
|
||||
* Output looks like:
|
||||
* Enter Year: 2002
|
||||
* 2002-Jan-01 [Tue]
|
||||
* 2002-Jan-21 [Mon]
|
||||
* 2002-Feb-12 [Tue]
|
||||
* 2002-Jul-04 [Thu]
|
||||
* 2002-Sep-02 [Mon]
|
||||
* 2002-Nov-28 [Thu]
|
||||
* 2002-Dec-25 [Wed]
|
||||
* Number Holidays: 7
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
|
||||
void
|
||||
print_date(boost::gregorian::date d)
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
#if defined(BOOST_DATE_TIME_NO_LOCALE)
|
||||
std::cout << to_simple_string(d) << " [" << d.day_of_week() << "]\n";
|
||||
#else
|
||||
std::cout << d << " [" << d.day_of_week() << "]\n";
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main() {
|
||||
|
||||
std::cout << "Enter Year: ";
|
||||
int year;
|
||||
std::cin >> year;
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
//define a collection of holidays fixed by month and day
|
||||
std::vector<year_based_generator*> holidays;
|
||||
holidays.push_back(new partial_date(1,Jan)); //Western New Year
|
||||
holidays.push_back(new partial_date(4,Jul)); //US Independence Day
|
||||
holidays.push_back(new partial_date(25, Dec));//Christmas day
|
||||
|
||||
|
||||
//define a shorthand for the nth_day_of_the_week_in_month function object
|
||||
typedef nth_day_of_the_week_in_month nth_dow;
|
||||
|
||||
//US labor day
|
||||
holidays.push_back(new nth_dow(nth_dow::first, Monday, Sep));
|
||||
//MLK Day
|
||||
holidays.push_back(new nth_dow(nth_dow::third, Monday, Jan));
|
||||
//Pres day
|
||||
holidays.push_back(new nth_dow(nth_dow::second, Tuesday, Feb));
|
||||
//Thanksgiving
|
||||
holidays.push_back(new nth_dow(nth_dow::fourth, Thursday, Nov));
|
||||
|
||||
typedef std::set<date> date_set;
|
||||
date_set all_holidays;
|
||||
|
||||
for(std::vector<year_based_generator*>::iterator it = holidays.begin();
|
||||
it != holidays.end(); ++it)
|
||||
{
|
||||
all_holidays.insert((*it)->get_date(year));
|
||||
}
|
||||
|
||||
//print the holidays to the screen
|
||||
std::for_each(all_holidays.begin(), all_holidays.end(), print_date);
|
||||
std::cout << "Number Holidays: " << all_holidays.size() << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
62
libs/date_time/example/gregorian/print_month.cpp
Normal file
62
libs/date_time/example/gregorian/print_month.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
/* This example prints all the dates in a month. It demonstrates
|
||||
* the use of iterators as well as functions of the gregorian_calendar
|
||||
*
|
||||
* Output:
|
||||
* Enter Year: 2002
|
||||
* Enter Month(1..12): 2
|
||||
* 2002-Feb-01 [Fri]
|
||||
* 2002-Feb-02 [Sat]
|
||||
* 2002-Feb-03 [Sun]
|
||||
* 2002-Feb-04 [Mon]
|
||||
* 2002-Feb-05 [Tue]
|
||||
* 2002-Feb-06 [Wed]
|
||||
* 2002-Feb-07 [Thu]
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
std::cout << "Enter Year: ";
|
||||
int year, month;
|
||||
std::cin >> year;
|
||||
std::cout << "Enter Month(1..12): ";
|
||||
std::cin >> month;
|
||||
|
||||
using namespace boost::gregorian;
|
||||
try {
|
||||
//Use the calendar to get the last day of the month
|
||||
int eom_day = gregorian_calendar::end_of_month_day(year,month);
|
||||
date endOfMonth(year,month,eom_day);
|
||||
|
||||
//construct an iterator starting with firt day of the month
|
||||
day_iterator ditr(date(year,month,1));
|
||||
//loop thru the days and print each one
|
||||
for (; ditr <= endOfMonth; ++ditr) {
|
||||
#if defined(BOOST_DATE_TIME_NO_LOCALE)
|
||||
std::cout << to_simple_string(*ditr) << " ["
|
||||
#else
|
||||
std::cout << *ditr << " ["
|
||||
#endif
|
||||
<< ditr->day_of_week() << " week: "
|
||||
<< ditr->week_number() << "]"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
|
||||
std::cout << "Error bad date, check your entry: \n"
|
||||
<< " Details: " << e.what() << std::endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user