summaryrefslogtreecommitdiff
path: root/libs/date_time
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-06-25 22:59:01 +0000
committer <>2013-09-27 11:49:28 +0000
commit8c4528713d907ee2cfd3bfcbbad272c749867f84 (patch)
treec09e2ce80f47b90c85cc720f5139089ad9c8cfff /libs/date_time
downloadboost-tarball-8c4528713d907ee2cfd3bfcbbad272c749867f84.tar.gz
Imported from /home/lorry/working-area/delta_boost-tarball/boost_1_54_0.tar.bz2.boost_1_54_0baserock/morph
Diffstat (limited to 'libs/date_time')
-rw-r--r--libs/date_time/build/Jamfile.v234
-rw-r--r--libs/date_time/data/README.zone_spec_csv_file92
-rw-r--r--libs/date_time/data/date_time_zonespec.csv383
-rw-r--r--libs/date_time/doc/index.html13
-rw-r--r--libs/date_time/doc/time_duration_inherit.pngbin0 -> 5254 bytes
-rw-r--r--libs/date_time/example/Jamfile50
-rw-r--r--libs/date_time/example/gregorian/Jamfile.v220
-rw-r--r--libs/date_time/example/gregorian/date_serialization_demo.cpp127
-rw-r--r--libs/date_time/example/gregorian/dates_as_strings.cpp63
-rw-r--r--libs/date_time/example/gregorian/days_alive.cpp47
-rw-r--r--libs/date_time/example/gregorian/days_between_new_years.cpp38
-rw-r--r--libs/date_time/example/gregorian/days_since_year_start.cpp25
-rw-r--r--libs/date_time/example/gregorian/days_till_new_year.cpp26
-rw-r--r--libs/date_time/example/gregorian/end_of_month_day.cpp46
-rw-r--r--libs/date_time/example/gregorian/find_last_day_of_months.cpp53
-rw-r--r--libs/date_time/example/gregorian/localization.cpp100
-rw-r--r--libs/date_time/example/gregorian/month_add.cpp58
-rw-r--r--libs/date_time/example/gregorian/period_calc.cpp86
-rw-r--r--libs/date_time/example/gregorian/print_holidays.cpp83
-rw-r--r--libs/date_time/example/gregorian/print_month.cpp62
-rw-r--r--libs/date_time/example/local_time/calc_rules.cpp47
-rw-r--r--libs/date_time/example/local_time/flight.cpp60
-rw-r--r--libs/date_time/example/local_time/local_date_time.cpp45
-rw-r--r--libs/date_time/example/local_time/seconds_since_epoch.cpp65
-rw-r--r--libs/date_time/example/local_time/simple_time_zone.cpp86
-rw-r--r--libs/date_time/example/posix_time/Jamfile.v213
-rw-r--r--libs/date_time/example/posix_time/local_utc_conversion.cpp90
-rw-r--r--libs/date_time/example/posix_time/print_hours.cpp53
-rw-r--r--libs/date_time/example/posix_time/time_math.cpp36
-rw-r--r--libs/date_time/example/posix_time/time_periods.cpp58
-rw-r--r--libs/date_time/example/tutorial/io_tutorial.cpp194
-rw-r--r--libs/date_time/index.html13
-rw-r--r--libs/date_time/src/date_time.doc72
-rw-r--r--libs/date_time/src/gregorian/date_generators.cpp38
-rw-r--r--libs/date_time/src/gregorian/greg_month.cpp173
-rw-r--r--libs/date_time/src/gregorian/greg_names.hpp43
-rw-r--r--libs/date_time/src/gregorian/greg_weekday.cpp50
-rw-r--r--libs/date_time/src/gregorian/gregorian_types.cpp62
-rw-r--r--libs/date_time/src/posix_time/posix_time_types.cpp35
-rw-r--r--libs/date_time/test/Jamfile.v2235
-rw-r--r--libs/date_time/test/gregorian/testcurrent_day.cpp37
-rw-r--r--libs/date_time/test/gregorian/testdate.cpp298
-rw-r--r--libs/date_time/test/gregorian/testdate_duration.cpp77
-rw-r--r--libs/date_time/test/gregorian/testdate_facet_new.cpp369
-rw-r--r--libs/date_time/test/gregorian/testdate_input_facet.cpp577
-rw-r--r--libs/date_time/test/gregorian/testdate_iterator.cpp367
-rw-r--r--libs/date_time/test/gregorian/testfacet.cpp342
-rw-r--r--libs/date_time/test/gregorian/testformat_date_parser.cpp363
-rw-r--r--libs/date_time/test/gregorian/testformatters.cpp62
-rw-r--r--libs/date_time/test/gregorian/testgenerators.cpp176
-rw-r--r--libs/date_time/test/gregorian/testgreg_cal.cpp135
-rw-r--r--libs/date_time/test/gregorian/testgreg_day.cpp91
-rw-r--r--libs/date_time/test/gregorian/testgreg_durations.cpp223
-rw-r--r--libs/date_time/test/gregorian/testgreg_month.cpp67
-rw-r--r--libs/date_time/test/gregorian/testgreg_serialize.cpp185
-rw-r--r--libs/date_time/test/gregorian/testgreg_wstream.cpp178
-rw-r--r--libs/date_time/test/gregorian/testgreg_year.cpp48
-rw-r--r--libs/date_time/test/gregorian/testparse_date.cpp367
-rw-r--r--libs/date_time/test/gregorian/testperiod.cpp153
-rw-r--r--libs/date_time/test/local_time/README.poorly_formed_zonespec4
-rw-r--r--libs/date_time/test/local_time/poorly_formed_zonespec.csv2
-rw-r--r--libs/date_time/test/local_time/testclocks.cpp40
-rw-r--r--libs/date_time/test/local_time/testcustom_time_zone.cpp88
-rw-r--r--libs/date_time/test/local_time/testdst_transition_day_rule.cpp65
-rw-r--r--libs/date_time/test/local_time/testlocal_time.cpp370
-rw-r--r--libs/date_time/test/local_time/testlocal_time_facet.cpp195
-rw-r--r--libs/date_time/test/local_time/testlocal_time_input_facet.cpp239
-rw-r--r--libs/date_time/test/local_time/testlocal_time_iterator.cpp95
-rw-r--r--libs/date_time/test/local_time/testlocal_time_period.cpp82
-rw-r--r--libs/date_time/test/local_time/testposix_time_zone.cpp221
-rw-r--r--libs/date_time/test/local_time/testtz_database.cpp138
-rw-r--r--libs/date_time/test/local_time/testwcustom_time_zone.cpp89
-rw-r--r--libs/date_time/test/local_time/testwposix_time_zone.cpp224
-rw-r--r--libs/date_time/test/posix_time/testc_local_adjustor.cpp46
-rw-r--r--libs/date_time/test/posix_time/testclock.cpp42
-rw-r--r--libs/date_time/test/posix_time/testdst_rules.cpp451
-rw-r--r--libs/date_time/test/posix_time/testduration.cpp272
-rw-r--r--libs/date_time/test/posix_time/testfiletime_functions.cpp90
-rw-r--r--libs/date_time/test/posix_time/testformatters.cpp18
-rw-r--r--libs/date_time/test/posix_time/testgreg_duration_operators.cpp85
-rw-r--r--libs/date_time/test/posix_time/testiterator.cpp135
-rw-r--r--libs/date_time/test/posix_time/testlocal_adjustor.cpp177
-rw-r--r--libs/date_time/test/posix_time/testmicrosec_time_clock.cpp112
-rw-r--r--libs/date_time/test/posix_time/testparse_time.cpp224
-rw-r--r--libs/date_time/test/posix_time/testperiod.cpp22
-rw-r--r--libs/date_time/test/posix_time/teststreams.cpp179
-rw-r--r--libs/date_time/test/posix_time/testtime.cpp331
-rw-r--r--libs/date_time/test/posix_time/testtime_facet.cpp458
-rw-r--r--libs/date_time/test/posix_time/testtime_formatters.cpp106
-rw-r--r--libs/date_time/test/posix_time/testtime_input_facet.cpp435
-rw-r--r--libs/date_time/test/posix_time/testtime_period.cpp77
-rw-r--r--libs/date_time/test/posix_time/testtime_serialize.cpp121
-rw-r--r--libs/date_time/test/posix_time/testtime_wstream.cpp89
-rw-r--r--libs/date_time/test/testconstrained_value.cpp77
-rw-r--r--libs/date_time/test/testfrmwk.hpp89
-rw-r--r--libs/date_time/test/testfrom_facet.cpp50
-rw-r--r--libs/date_time/test/testgeneric_period.cpp281
-rw-r--r--libs/date_time/test/testgregorian_calendar.cpp253
-rw-r--r--libs/date_time/test/testint64_range.cpp95
-rw-r--r--libs/date_time/test/testint_adapter.cpp158
-rw-r--r--libs/date_time/test/testtime_resolution_traits.cpp72
-rw-r--r--libs/date_time/test/testwrapping_int.cpp138
-rw-r--r--libs/date_time/xmldoc/Jamfile.v290
-rw-r--r--libs/date_time/xmldoc/README38
-rw-r--r--libs/date_time/xmldoc/acknowledgements.xml16
-rw-r--r--libs/date_time/xmldoc/buildinfo.xml153
-rw-r--r--libs/date_time/xmldoc/calculations.xml96
-rw-r--r--libs/date_time/xmldoc/changes.xml796
-rw-r--r--libs/date_time/xmldoc/conceptual.xml19
-rw-r--r--libs/date_time/xmldoc/custom_time_zone.xml376
-rw-r--r--libs/date_time/xmldoc/date_algorithms.xml202
-rw-r--r--libs/date_time/xmldoc/date_class.xml524
-rw-r--r--libs/date_time/xmldoc/date_duration.xml250
-rw-r--r--libs/date_time/xmldoc/date_facet.xml319
-rw-r--r--libs/date_time/xmldoc/date_input_facet.xml340
-rw-r--r--libs/date_time/xmldoc/date_iterators.xml113
-rw-r--r--libs/date_time/xmldoc/date_period.xml434
-rw-r--r--libs/date_time/xmldoc/date_time.xml70
-rw-r--r--libs/date_time/xmldoc/date_time_docs_howto.html82
-rw-r--r--libs/date_time/xmldoc/date_time_fo_stylesheet.xsl180
-rw-r--r--libs/date_time/xmldoc/date_time_io.xml133
-rw-r--r--libs/date_time/xmldoc/design_concepts.xml22
-rw-r--r--libs/date_time/xmldoc/design_goals.xml126
-rw-r--r--libs/date_time/xmldoc/details.xml22
-rw-r--r--libs/date_time/xmldoc/domain_concepts.xml61
-rw-r--r--libs/date_time/xmldoc/doxy.xml22
-rw-r--r--libs/date_time/xmldoc/ex_calc_rules.xml59
-rw-r--r--libs/date_time/xmldoc/ex_date_period_calc.xml96
-rw-r--r--libs/date_time/xmldoc/ex_dates_as_strings.xml77
-rw-r--r--libs/date_time/xmldoc/ex_days_alive.xml59
-rw-r--r--libs/date_time/xmldoc/ex_days_between_new_years.xml49
-rw-r--r--libs/date_time/xmldoc/ex_end_of_month_day.xml59
-rw-r--r--libs/date_time/xmldoc/ex_find_last_day_of_months.xml66
-rw-r--r--libs/date_time/xmldoc/ex_flight.xml60
-rw-r--r--libs/date_time/xmldoc/ex_local_utc_conversion.xml103
-rw-r--r--libs/date_time/xmldoc/ex_localization.xml115
-rw-r--r--libs/date_time/xmldoc/ex_meeting_planner.xml187
-rw-r--r--libs/date_time/xmldoc/ex_month_add.xml44
-rw-r--r--libs/date_time/xmldoc/ex_print_holidays.xml97
-rw-r--r--libs/date_time/xmldoc/ex_print_hours.xml66
-rw-r--r--libs/date_time/xmldoc/ex_print_month.xml74
-rw-r--r--libs/date_time/xmldoc/ex_seconds_since_epoch.xml77
-rw-r--r--libs/date_time/xmldoc/ex_simple_time_zone.xml100
-rw-r--r--libs/date_time/xmldoc/ex_time_math.xml48
-rw-r--r--libs/date_time/xmldoc/ex_time_periods.xml74
-rw-r--r--libs/date_time/xmldoc/examples.xml34
-rw-r--r--libs/date_time/xmldoc/exclusive_date_time.xml15
-rw-r--r--libs/date_time/xmldoc/format_flags.xml519
-rw-r--r--libs/date_time/xmldoc/gregorian.xml76
-rw-r--r--libs/date_time/xmldoc/gregorian_calendar.xml96
-rw-r--r--libs/date_time/xmldoc/io_objects.xml1101
-rw-r--r--libs/date_time/xmldoc/io_tutorial.xml306
-rw-r--r--libs/date_time/xmldoc/license.xml40
-rw-r--r--libs/date_time/xmldoc/local_date_time.xml463
-rw-r--r--libs/date_time/xmldoc/local_time.xml77
-rw-r--r--libs/date_time/xmldoc/local_time_period.xml383
-rw-r--r--libs/date_time/xmldoc/motivation.xml20
-rw-r--r--libs/date_time/xmldoc/posix_time.xml65
-rw-r--r--libs/date_time/xmldoc/posix_time_zone.xml224
-rw-r--r--libs/date_time/xmldoc/ptime_class.xml565
-rw-r--r--libs/date_time/xmldoc/ref_tag_fix.pl114
-rw-r--r--libs/date_time/xmldoc/references.xml124
-rw-r--r--libs/date_time/xmldoc/serialization.xml116
-rw-r--r--libs/date_time/xmldoc/snap_to_details.xml54
-rw-r--r--libs/date_time/xmldoc/table_template.xml32
-rw-r--r--libs/date_time/xmldoc/terminology.xml60
-rw-r--r--libs/date_time/xmldoc/tests.xml23
-rw-r--r--libs/date_time/xmldoc/time_duration.xml592
-rw-r--r--libs/date_time/xmldoc/time_facet.xml147
-rw-r--r--libs/date_time/xmldoc/time_input_facet.xml163
-rw-r--r--libs/date_time/xmldoc/time_iterators.xml152
-rw-r--r--libs/date_time/xmldoc/time_period.xml396
-rw-r--r--libs/date_time/xmldoc/time_zone_base.xml113
-rw-r--r--libs/date_time/xmldoc/tradeoffs.xml127
-rw-r--r--libs/date_time/xmldoc/tz_database.xml233
-rw-r--r--libs/date_time/xmldoc/usage_examples.xml103
176 files changed, 26051 insertions, 0 deletions
diff --git a/libs/date_time/build/Jamfile.v2 b/libs/date_time/build/Jamfile.v2
new file mode 100644
index 000000000..f294c2e11
--- /dev/null
+++ b/libs/date_time/build/Jamfile.v2
@@ -0,0 +1,34 @@
+# Copyright (c) 2002-2005 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)
+#
+# Boost.date_time build and test Jamfile
+#
+# Based on boost.python Jamfile
+#
+# To run all tests quietly: jam test
+#
+# Declares the following targets:
+# 1. libboost_date_time, a static link library to be linked with all
+# Boost.date_time modules
+#
+
+
+project boost/date_time
+ : requirements
+ <define>DATE_TIME_INLINE
+ <link>shared:<define>BOOST_ALL_DYN_LINK=1
+ <link>static:<define>BOOST_DATE_TIME_STATIC_LINK
+ : usage-requirements
+ <define>DATE_TIME_INLINE
+ <link>shared:<define>BOOST_DATE_TIME_DYN_LINK=1
+ : source-location ../src
+ ;
+
+# Base names of the source files for libboost_date_time
+CPP_SOURCES = greg_month greg_weekday date_generators ;
+
+lib boost_date_time : gregorian/$(CPP_SOURCES).cpp ;
+
+boost-install boost_date_time ;
diff --git a/libs/date_time/data/README.zone_spec_csv_file b/libs/date_time/data/README.zone_spec_csv_file
new file mode 100644
index 000000000..069cac219
--- /dev/null
+++ b/libs/date_time/data/README.zone_spec_csv_file
@@ -0,0 +1,92 @@
+
+The csv file containing the zone_specs used by the
+boost::local_time::tz_database is intended to be customized by the
+library user. When customizing this file (or creating your own) the
+file must follow a specific format.
+
+This first line is expected to contain column headings and is therefore
+not processed by the tz_database.
+
+Each record (line) must have eleven fields. Some of those fields can
+be empty. Every field (even empty ones) must be enclosed in double-quotes.
+Ex:
+ "America/Phoenix" <- string enclosed in quotes
+ "" <- empty field
+
+Some fields represent a length of time. The format of these fields must be:
+ "{+|-}hh:mm[:ss]" <- length-of-time format
+Where the plus or minus is mandatory and the seconds are optional.
+
+Since some time zones do not use daylight savings it is not always necessary
+for every field in a zone_spec to contain a value. All zone_specs must have
+at least ID and GMT offset. Zones that use daylight savings must have all
+fields filled except: STD ABBR, STD NAME, DST NAME. You should take note
+that DST ABBR is mandatory for zones that use daylight savings (see field
+descriptions for further details).
+
+
+********* Fields and their description/details *********
+
+* ID
+ Contains the identifying string for the zone_spec. Any string will
+ do as long as it's unique. No two ID's can be the same.
+
+* STD ABBR
+* STD NAME
+* DST ABBR
+* DST NAME
+ These four are all the names and abbreviations used by the time
+ zone being described. While any string will do in these fields,
+ care should be taken. These fields hold the strings that will be
+ used in the output of many of the local_time classes.
+ Ex:
+ time_zone nyc = tz_db.time_zone_from_region("America/New_York");
+ local_time ny_time(date(2004, Aug, 30), IS_DST, nyc);
+ cout << ny_time.to_long_string() << endl;
+ // 2004-Aug-30 00:00:00 Eastern Daylight Time
+ cout << ny_time.to_short_string() << endl;
+ // 2004-Aug-30 00:00:00 EDT
+
+ NOTE: The exact format/function names may vary - see local_time
+ documentation for further details.
+
+* GMT offset
+ This is the number of hours added to utc to get the local time
+ before any daylight savings adjustments are made. Some examples
+ are: America/New_York offset -5 hours, & Africa/Cairo offset +2 hours.
+ The format must follow the length-of-time format described above.
+
+* DST adjustment
+ The amount of time added to gmt_offset when daylight savings is in
+ effect. The format must follow the length-of-time format described
+ above.
+
+#####################################################################
+##### TODO: more rule capabilities are needed - this portion of #####
+##### the tz_database is incomplete #####
+#####################################################################
+* DST Start Date rule
+ This is a specially formatted string that describes the day of year
+ in which the transition take place. It holds three fields of it's own,
+ separated by semicolons.
+ * The first field indicates the "nth" weekday of the month. The
+ possible values are: 1 (first), 2 (second), 3 (third),
+ 4 (fourth), 5 (fifth), and -1 (last).
+ * The second field indicates the day-of-week from 0-6 (Sun=0).
+ * The third field indicates the month from 1-12 (Jan=1).
+
+ Examples are: "-1;5;9"="Last Friday of September",
+ "2;1;3"="Second Monday of March"
+
+* Start time
+ Start time is the number of hours past midnight, on the day of the
+ start transition, the transition takes place. More simply put, the
+ time of day the transition is made (in 24 hours format). The format
+ must follow the length-of-time format described above with the
+ exception that it must always be positive.
+
+* DST End date rule
+ See DST Start date rule. The difference here is this is the day
+ daylight savings ends (transition to STD).
+* End time
+ Same as Start time.
diff --git a/libs/date_time/data/date_time_zonespec.csv b/libs/date_time/data/date_time_zonespec.csv
new file mode 100644
index 000000000..c54b2ba4e
--- /dev/null
+++ b/libs/date_time/data/date_time_zonespec.csv
@@ -0,0 +1,383 @@
+"ID","STD ABBR","STD NAME","DST ABBR","DST NAME","GMT offset","DST adjustment","DST Start Date rule","Start time","DST End date rule","End time"
+"Africa/Abidjan","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Accra","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Addis_Ababa","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Algiers","CET","CET","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Asmera","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Bamako","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Bangui","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Banjul","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Bissau","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Blantyre","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Brazzaville","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Bujumbura","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Cairo","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;5;4","+00:00:00","-1;5;9","+00:00:00"
+"Africa/Casablanca","WET","WET","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Ceuta","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Africa/Conakry","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Dakar","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Dar_es_Salaam","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Djibouti","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Douala","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/El_Aaiun","WET","WET","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Freetown","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Gaborone","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Harare","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Johannesburg","SAST","SAST","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Kampala","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Khartoum","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Kigali","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Kinshasa","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Lagos","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Libreville","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Lome","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Luanda","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Lubumbashi","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Lusaka","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Malabo","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Maputo","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Maseru","SAST","SAST","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Mbabane","SAST","SAST","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Mogadishu","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Monrovia","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Nairobi","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Ndjamena","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Niamey","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Nouakchott","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Ouagadougou","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Porto-Novo","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Sao_Tome","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Timbuktu","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Tripoli","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Tunis","CET","CET","","","+01:00:00","+00:00:00","","","","+00:00:00"
+"Africa/Windhoek","WAT","WAT","WAST","WAST","+01:00:00","+01:00:00","1;0;9","+02:00:00","1;0;4","+02:00:00"
+"America/Adak","HAST","HAST","HADT","HADT","-10:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Anchorage","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Anguilla","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Antigua","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Araguaina","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
+"America/Aruba","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Asuncion","PYT","PYT","PYST","PYST","-04:00:00","+01:00:00","1;0;10","+00:00:00","1;0;3","+00:00:00"
+"America/Barbados","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Belem","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Belize","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Boa_Vista","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Bogota","COT","COT","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Boise","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Buenos_Aires","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Cambridge_Bay","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Cancun","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Caracas","VET","VET","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Catamarca","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Cayenne","GFT","GFT","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Cayman","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Chicago","CST","Central Standard Time","CDT","Central Daylight Time","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Chihuahua","MST","MST","MDT","MDT","-07:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Cordoba","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Costa_Rica","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Cuiaba","AMT","AMT","AMST","AMST","-04:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
+"America/Curacao","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Danmarkshavn","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"America/Dawson","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Dawson_Creek","MST","MST","","","-07:00:00","+00:00:00","","","","+00:00:00"
+"America/Denver","MST","Mountain Standard Time","MDT","Mountain Daylight Time","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Detroit","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Dominica","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Edmonton","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Eirunepe","ACT","ACT","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/El_Salvador","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Fortaleza","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
+"America/Glace_Bay","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Godthab","WGT","WGT","WGST","WGST","-03:00:00","+01:00:00","-1;6;3","+22:00:00","-1;6;10","+23:00:00"
+"America/Goose_Bay","AST","AST","ADT","ADT","-04:00:00","+01:00:00","1;0;4","+00:01:00","-1;0;10","+00:01:00"
+"America/Grand_Turk","EST","EST","EDT","EDT","-05:00:00","+01:00:00","1;0;4","+00:00:00","-1;0;10","+00:00:00"
+"America/Grenada","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Guadeloupe","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Guatemala","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Guayaquil","ECT","ECT","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Guyana","GYT","GYT","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Halifax","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Havana","CST","CST","CDT","CDT","-05:00:00","+01:00:00","1;0;4","+00:00:00","-1;0;10","+01:00:00"
+"America/Hermosillo","MST","MST","","","-07:00:00","+00:00:00","","","","+00:00:00"
+"America/Indiana/Indianapolis","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
+"America/Indiana/Knox","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
+"America/Indiana/Marengo","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
+"America/Indiana/Vevay","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
+"America/Indianapolis","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
+"America/Inuvik","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Iqaluit","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Jamaica","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Jujuy","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Juneau","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Kentucky/Louisville","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Kentucky/Monticello","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/La_Paz","BOT","BOT","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Lima","PET","PET","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Los_Angeles","PST","Pacific Standard Time","PDT","Pacific Daylight Time","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Louisville","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Maceio","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
+"America/Managua","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Manaus","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Martinique","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Mazatlan","MST","MST","MDT","MDT","-07:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Mendoza","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Menominee","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Merida","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Mexico_City","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Miquelon","PMST","PMST","PMDT","PMDT","-03:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Monterrey","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Montevideo","UYT","UYT","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Montreal","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Montserrat","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Nassau","EST","EST","EDT","EDT","-05:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/New_York","EST","Eastern Standard Time","EDT","Eastern Daylight Time","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Nipigon","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Nome","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Noronha","FNT","FNT","","","-02:00:00","+00:00:00","","","","+00:00:00"
+"America/North_Dakota/Center","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Panama","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Pangnirtung","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Paramaribo","SRT","SRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Phoenix","MST","Mountain Standard Time","","","-07:00:00","+00:00:00","","","","+00:00:00"
+"America/Port-au-Prince","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Port_of_Spain","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Porto_Velho","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Puerto_Rico","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Rainy_River","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Rankin_Inlet","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Recife","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
+"America/Regina","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Rio_Branco","ACT","ACT","","","-05:00:00","+00:00:00","","","","+00:00:00"
+"America/Rosario","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
+"America/Santiago","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;10","+00:00:00","2;0;3","+00:00:00"
+"America/Santo_Domingo","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Sao_Paulo","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
+"America/Scoresbysund","EGT","EGT","EGST","EGST","-01:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+01:00:00"
+"America/Shiprock","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/St_Johns","NST","NST","NDT","NDT","-03:30:00","+01:00:00","1;0;4","+00:01:00","-1;0;10","+00:01:00"
+"America/St_Kitts","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/St_Lucia","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/St_Thomas","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/St_Vincent","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Swift_Current","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Tegucigalpa","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"America/Thule","AST","AST","","","-04:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
+"America/Thunder_Bay","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Tijuana","PST","PST","PDT","PDT","-08:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"America/Tortola","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
+"America/Vancouver","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Whitehorse","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Winnipeg","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+03:00:00"
+"America/Yakutat","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"America/Yellowknife","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
+"Antarctica/Casey","WST","WST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Antarctica/Davis","DAVT","DAVT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Antarctica/DumontDUrville","DDUT","DDUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Antarctica/Mawson","MAWT","MAWT","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Antarctica/McMurdo","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","1;0;10","+02:00:00","3;0;3","+03:00:00"
+"Antarctica/Palmer","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;10","+00:00:00","2;0;3","+00:00:00"
+"Antarctica/South_Pole","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","1;0;10","+02:00:00","3;0;3","+03:00:00"
+"Antarctica/Syowa","SYOT","SYOT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Antarctica/Vostok","VOST","VOST","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Arctic/Longyearbyen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Aden","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Almaty","ALMT","ALMT","ALMST","ALMST","+06:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
+"Asia/Amman","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;4;3","+00:00:00","-1;4;9","+01:00:00"
+"Asia/Anadyr","ANAT","ANAT","ANAST","ANAST","+12:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Aqtau","AQTT","AQTT","AQTST","AQTST","+04:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
+"Asia/Aqtobe","AQTT","AQTT","AQTST","AQTST","+05:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
+"Asia/Ashgabat","TMT","TMT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Baghdad","AST","AST","ADT","ADT","+03:00:00","+01:00:00","1;0;4","+03:00:00","1;0;10","+04:00:00"
+"Asia/Bahrain","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Baku","AZT","AZT","AZST","AZST","+04:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+01:00:00"
+"Asia/Bangkok","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Beirut","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
+"Asia/Bishkek","KGT","KGT","KGST","KGST","+05:00:00","+01:00:00","-1;0;3","+02:30:00","-1;0;10","+02:30:00"
+"Asia/Brunei","BNT","BNT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Calcutta","IST","IST","","","+05:30:00","+00:00:00","","","","+00:00:00"
+"Asia/Choibalsan","CHOT","CHOT","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Chongqing","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Colombo","LKT","LKT","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Damascus","EET","EET","EEST","EEST","+02:00:00","+01:00:00","1;0;4","+00:00:00","1;0;10","+00:00:00"
+"Asia/Dhaka","BDT","BDT","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Dili","TPT","TPT","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Dubai","GST","GST","","","+04:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Dushanbe","TJT","TJT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Gaza","EET","EET","EEST","EEST","+02:00:00","+01:00:00","3;5;4","+00:00:00","3;5;10","+00:00:00"
+"Asia/Harbin","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Hong_Kong","HKT","HKT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Hovd","HOVT","HOVT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Irkutsk","IRKT","IRKT","IRKST","IRKST","+08:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Istanbul","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Asia/Jakarta","WIT","WIT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Jayapura","EIT","EIT","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Jerusalem","IST","IST","IDT","IDT","+02:00:00","+01:00:00","1;0;4","+01:00:00","1;0;10","+01:00:00"
+"Asia/Kabul","AFT","AFT","","","+04:30:00","+00:00:00","","","","+00:00:00"
+"Asia/Kamchatka","PETT","PETT","PETST","PETST","+12:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Karachi","PKT","PKT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Kashgar","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Katmandu","NPT","NPT","","","+05:45:00","+00:00:00","","","","+00:00:00"
+"Asia/Krasnoyarsk","KRAT","KRAT","KRAST","KRAST","+07:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Kuala_Lumpur","MYT","MYT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Kuching","MYT","MYT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Kuwait","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Macao","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Macau","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Magadan","MAGT","MAGT","MAGST","MAGST","+11:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Makassar","CIT","CIT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Manila","PHT","PHT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Muscat","GST","GST","","","+04:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Nicosia","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Asia/Novosibirsk","NOVT","NOVT","NOVST","NOVST","+06:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Omsk","OMST","OMST","OMSST","OMSST","+06:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Oral","WST","WST","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Phnom_Penh","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Pontianak","WIT","WIT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Pyongyang","KST","KST","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Qyzylorda","KST","KST","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Qatar","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Rangoon","MMT","MMT","","","+06:30:00","+00:00:00","","","","+00:00:00"
+"Asia/Riyadh","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Saigon","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Sakhalin","SAKT","SAKT","SAKST","SAKST","+10:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Samarkand","UZT","UZT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Seoul","KST","KST","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Shanghai","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Singapore","SGT","SGT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Taipei","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Tashkent","UZT","UZT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Tbilisi","GET","GET","GEST","GEST","+04:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
+"Asia/Tehran","IRT","IRT","","","+03:30:00","+00:00:00","","","","+00:00:00"
+"Asia/Thimphu","BTT","BTT","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Tokyo","JST","JST","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Ujung_Pandang","CIT","CIT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Ulaanbaatar","ULAT","ULAT","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Urumqi","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Vientiane","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Asia/Vladivostok","VLAT","VLAT","VLAST","VLAST","+10:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Yakutsk","YAKT","YAKT","YAKST","YAKST","+09:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Yekaterinburg","YEKT","YEKT","YEKST","YEKST","+05:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Asia/Yerevan","AMT","AMT","AMST","AMST","+04:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Atlantic/Azores","AZOT","AZOT","AZOST","AZOST","-01:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+01:00:00"
+"Atlantic/Bermuda","AST","AST","ADT","ADT","-04:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
+"Atlantic/Canary","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Atlantic/Cape_Verde","CVT","CVT","","","-01:00:00","+00:00:00","","","","+00:00:00"
+"Atlantic/Faeroe","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Atlantic/Jan_Mayen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Atlantic/Madeira","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Atlantic/Reykjavik","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Atlantic/South_Georgia","GST","GST","","","-02:00:00","+00:00:00","","","","+00:00:00"
+"Atlantic/St_Helena","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
+"Atlantic/Stanley","FKT","FKT","FKST","FKST","-04:00:00","+01:00:00","1;0;9","+02:00:00","3;0;4","+02:00:00"
+"Australia/Adelaide","CST","CST","CST","CST","+09:30:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
+"Australia/Brisbane","EST","EST","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Australia/Broken_Hill","CST","CST","CST","CST","+09:30:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
+"Australia/Darwin","CST","CST","","","+09:30:00","+00:00:00","","","","+00:00:00"
+"Australia/Eucla","CWST","CWST","","","+08:45:00","+00:00:00","","","","+00:00:00"
+"Australia/Hobart","EST","EST","EST","EST","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
+"Australia/Lindeman","EST","EST","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Australia/Lord_Howe","LHST","LHST","LHST","LHST","+10:30:00","+00:30:00","1;0;10","+02:00:00","1;0;4","+02:30:00"
+"Australia/Melbourne","EST","EST","EST","EST","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
+"Australia/Perth","WST","WST","","","+08:00:00","+00:00:00","","","","+00:00:00"
+"Australia/Sydney","EST","EST","EST","EST","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
+"Europe/Amsterdam","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Andorra","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Athens","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Belfast","GMT","GMT","BST","BST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Europe/Belgrade","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Berlin","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Bratislava","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Brussels","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Bucharest","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Budapest","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Chisinau","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Copenhagen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Dublin","GMT","GMT","IST","IST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Europe/Gibraltar","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Helsinki","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Istanbul","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Kaliningrad","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Kiev","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Lisbon","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Europe/Ljubljana","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/London","GMT","GMT","BST","BST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
+"Europe/Luxembourg","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Madrid","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Malta","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Minsk","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Monaco","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Moscow","MSK","MSK","MSD","MSD","+03:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Nicosia","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Oslo","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Paris","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Prague","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Riga","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Rome","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Samara","SAMT","SAMT","SAMST","SAMST","+04:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/San_Marino","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Sarajevo","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Simferopol","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Skopje","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Sofia","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Stockholm","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Tallinn","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Europe/Tirane","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Uzhgorod","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Vaduz","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Vatican","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Vienna","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Vilnius","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
+"Europe/Warsaw","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Zagreb","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Europe/Zaporozhye","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
+"Europe/Zurich","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
+"Indian/Antananarivo","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Chagos","IOT","IOT","","","+06:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Christmas","CXT","CXT","","","+07:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Cocos","CCT","CCT","","","+06:30:00","+00:00:00","","","","+00:00:00"
+"Indian/Comoro","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Kerguelen","TFT","TFT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Mahe","SCT","SCT","","","+04:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Maldives","MVT","MVT","","","+05:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Mauritius","MUT","MUT","","","+04:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Mayotte","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
+"Indian/Reunion","RET","RET","","","+04:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Apia","WST","WST","","","-11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Auckland","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","1;0;10","+02:00:00","3;0;3","+03:00:00"
+"Pacific/Chatham","CHAST","CHAST","CHADT","CHADT","+12:45:00","+01:00:00","1;0;10","+02:45:00","3;0;3","+03:45:00"
+"Pacific/Easter","EAST","EAST","EASST","EASST","-06:00:00","+01:00:00","2;6;10","+22:00:00","2;6;3","+22:00:00"
+"Pacific/Efate","VUT","VUT","","","+11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Enderbury","PHOT","PHOT","","","+13:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Fakaofo","TKT","TKT","","","-10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Fiji","FJT","FJT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Funafuti","TVT","TVT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Galapagos","GALT","GALT","","","-06:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Gambier","GAMT","GAMT","","","-09:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Guadalcanal","SBT","SBT","","","+11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Guam","ChST","ChST","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Honolulu","HST","HST","","","-10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Johnston","HST","HST","","","-10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Kiritimati","LINT","LINT","","","+14:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Kosrae","KOST","KOST","","","+11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Kwajalein","MHT","MHT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Majuro","MHT","MHT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Marquesas","MART","MART","","","-09:30:00","+00:00:00","","","","+00:00:00"
+"Pacific/Midway","SST","SST","","","-11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Nauru","NRT","NRT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Niue","NUT","NUT","","","-11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Norfolk","NFT","NFT","","","+11:30:00","+00:00:00","","","","+00:00:00"
+"Pacific/Noumea","NCT","NCT","","","+11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Pago_Pago","SST","SST","","","-11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Palau","PWT","PWT","","","+09:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Pitcairn","PST","PST","","","-08:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Ponape","PONT","PONT","","","+11:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Port_Moresby","PGT","PGT","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Rarotonga","CKT","CKT","","","-10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Saipan","ChST","ChST","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Tahiti","TAHT","TAHT","","","-10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Tarawa","GILT","GILT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Tongatapu","TOT","TOT","","","+13:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Truk","TRUT","TRUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Wake","WAKT","WAKT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Wallis","WFT","WFT","","","+12:00:00","+00:00:00","","","","+00:00:00"
+"Pacific/Yap","YAPT","YAPT","","","+10:00:00","+00:00:00","","","","+00:00:00"
diff --git a/libs/date_time/doc/index.html b/libs/date_time/doc/index.html
new file mode 100644
index 000000000..12c4c299e
--- /dev/null
+++ b/libs/date_time/doc/index.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0; URL=../../../doc/html/date_time.html">
+</head>
+<body>
+Automatic redirection failed, please go to
+<a href="../../../doc/html/date_time.html">../../../doc/html/date_time.html</a>
+<p>© Copyright CrystalClear Software, Inc 2003-2006</p>
+<p> Use, modification, and distribution are subject to the Boost Software
+License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+www.boost.org/LICENSE_1_0.txt</a>)</p>
+</body>
+</html>
diff --git a/libs/date_time/doc/time_duration_inherit.png b/libs/date_time/doc/time_duration_inherit.png
new file mode 100644
index 000000000..29788a9b2
--- /dev/null
+++ b/libs/date_time/doc/time_duration_inherit.png
Binary files differ
diff --git a/libs/date_time/example/Jamfile b/libs/date_time/example/Jamfile
new file mode 100644
index 000000000..1fb13ce25
--- /dev/null
+++ b/libs/date_time/example/Jamfile
@@ -0,0 +1,50 @@
+project libs/date_time/example
+ : requirements
+ <link>static:<define>BOOST_DATE_TIME_STATIC_LINK
+ <library>../build//boost_date_time
+ ;
+
+exe dates_as_strings : gregorian/dates_as_strings.cpp ;
+exe days_alive : gregorian/days_alive.cpp ;
+exe days_till_new_year : gregorian/days_till_new_year.cpp ;
+
+exe days_between_new_years : gregorian/days_between_new_years.cpp ;
+exe find_last_day_of_months : gregorian/find_last_day_of_months.cpp ;
+
+exe month_add : gregorian/month_add.cpp ;
+
+exe localization : gregorian/localization.cpp ;
+exe print_holidays : gregorian/print_holidays.cpp ;
+exe print_month : gregorian/print_month.cpp ;
+exe period_calc : gregorian/period_calc.cpp ;
+
+exe days_since_year_start : gregorian/days_since_year_start.cpp ;
+
+exe local_utc_conversion : posix_time/local_utc_conversion.cpp
+ : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ ;
+
+exe print_hours : posix_time/print_hours.cpp
+ : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ ;
+
+exe time_math : posix_time/time_math.cpp
+ : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ ;
+
+exe time_periods : posix_time/time_periods.cpp
+ : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ ;
+
+exe simple_time_zone : local_time/simple_time_zone.cpp ;
+exe calc_rules : local_time/calc_rules.cpp ;
+exe seconds_since_epoch : local_time/seconds_since_epoch.cpp ;
+exe flight : local_time/flight.cpp ;
+exe io_tutorial : tutorial/io_tutorial.cpp ;
+
+# Copyright (c) 2002-2005
+# CrystalClear Software, Inc.
+# 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)
+
diff --git a/libs/date_time/example/gregorian/Jamfile.v2 b/libs/date_time/example/gregorian/Jamfile.v2
new file mode 100644
index 000000000..39a6c219f
--- /dev/null
+++ b/libs/date_time/example/gregorian/Jamfile.v2
@@ -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 ;
+ \ No newline at end of file
diff --git a/libs/date_time/example/gregorian/date_serialization_demo.cpp b/libs/date_time/example/gregorian/date_serialization_demo.cpp
new file mode 100644
index 000000000..3c22129c4
--- /dev/null
+++ b/libs/date_time/example/gregorian/date_serialization_demo.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/dates_as_strings.cpp b/libs/date_time/example/gregorian/dates_as_strings.cpp
new file mode 100644
index 000000000..097fffbc8
--- /dev/null
+++ b/libs/date_time/example/gregorian/dates_as_strings.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/days_alive.cpp b/libs/date_time/example/gregorian/days_alive.cpp
new file mode 100644
index 000000000..83068ecfd
--- /dev/null
+++ b/libs/date_time/example/gregorian/days_alive.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/days_between_new_years.cpp b/libs/date_time/example/gregorian/days_between_new_years.cpp
new file mode 100644
index 000000000..d1d1d3897
--- /dev/null
+++ b/libs/date_time/example/gregorian/days_between_new_years.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/days_since_year_start.cpp b/libs/date_time/example/gregorian/days_since_year_start.cpp
new file mode 100644
index 000000000..50e08d0fc
--- /dev/null
+++ b/libs/date_time/example/gregorian/days_since_year_start.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/days_till_new_year.cpp b/libs/date_time/example/gregorian/days_till_new_year.cpp
new file mode 100644
index 000000000..96dacbd5d
--- /dev/null
+++ b/libs/date_time/example/gregorian/days_till_new_year.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/end_of_month_day.cpp b/libs/date_time/example/gregorian/end_of_month_day.cpp
new file mode 100644
index 000000000..ecb3919a6
--- /dev/null
+++ b/libs/date_time/example/gregorian/end_of_month_day.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/find_last_day_of_months.cpp b/libs/date_time/example/gregorian/find_last_day_of_months.cpp
new file mode 100644
index 000000000..3d082fc84
--- /dev/null
+++ b/libs/date_time/example/gregorian/find_last_day_of_months.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/localization.cpp b/libs/date_time/example/gregorian/localization.cpp
new file mode 100644
index 000000000..25856f638
--- /dev/null
+++ b/libs/date_time/example/gregorian/localization.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/month_add.cpp b/libs/date_time/example/gregorian/month_add.cpp
new file mode 100644
index 000000000..ee3f05ef8
--- /dev/null
+++ b/libs/date_time/example/gregorian/month_add.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/period_calc.cpp b/libs/date_time/example/gregorian/period_calc.cpp
new file mode 100644
index 000000000..31875fe95
--- /dev/null
+++ b/libs/date_time/example/gregorian/period_calc.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/print_holidays.cpp b/libs/date_time/example/gregorian/print_holidays.cpp
new file mode 100644
index 000000000..0e1c946f0
--- /dev/null
+++ b/libs/date_time/example/gregorian/print_holidays.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/gregorian/print_month.cpp b/libs/date_time/example/gregorian/print_month.cpp
new file mode 100644
index 000000000..1293f6e3c
--- /dev/null
+++ b/libs/date_time/example/gregorian/print_month.cpp
@@ -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)
+ */
+
diff --git a/libs/date_time/example/local_time/calc_rules.cpp b/libs/date_time/example/local_time/calc_rules.cpp
new file mode 100644
index 000000000..f8a21ed49
--- /dev/null
+++ b/libs/date_time/example/local_time/calc_rules.cpp
@@ -0,0 +1,47 @@
+/* A simple example for creating various dst_calc_rule instances
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+
+int
+main()
+{
+ using namespace boost;
+ using namespace local_time;
+ using namespace gregorian;
+
+ /***** create the necessary date_generator objects *****/
+ // starting generators
+ first_day_of_the_week_in_month fd_start(Sunday, May);
+ last_day_of_the_week_in_month ld_start(Sunday, May);
+ nth_day_of_the_week_in_month nkd_start(nth_day_of_the_week_in_month::third,
+ Sunday, May);
+ partial_date pd_start(1, May);
+ // ending generators
+ first_day_of_the_week_in_month fd_end(Sunday, Oct);
+ last_day_of_the_week_in_month ld_end(Sunday, Oct);
+ nth_day_of_the_week_in_month nkd_end(nth_day_of_the_week_in_month::third,
+ Sunday, Oct);
+ partial_date pd_end(31, Oct);
+
+ /***** create the various dst_calc_rule objects *****/
+ dst_calc_rule_ptr pdr(new partial_date_dst_rule(pd_start, pd_end));
+ dst_calc_rule_ptr flr(new first_last_dst_rule(fd_start, ld_end));
+ dst_calc_rule_ptr llr(new last_last_dst_rule(ld_start, ld_end));
+ dst_calc_rule_ptr nlr(new nth_last_dst_rule(nkd_start, ld_end));
+ dst_calc_rule_ptr ndr(new nth_day_of_the_week_in_month_dst_rule(nkd_start, nkd_end));
+
+ std::cout << "Program run successfully" << 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)
+ */
+
diff --git a/libs/date_time/example/local_time/flight.cpp b/libs/date_time/example/local_time/flight.cpp
new file mode 100644
index 000000000..df688feac
--- /dev/null
+++ b/libs/date_time/example/local_time/flight.cpp
@@ -0,0 +1,60 @@
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+
+/* This example shows a program that calculates the arrival time of a plane
+ * that flys from Phoenix to New York. During the flight New York shifts
+ * into daylight savings time (Phoenix doesn't because Arizona doesn't use
+ * DST).
+ *
+ *
+ */
+
+int main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+
+
+ //setup some timezones for creating and adjusting local times
+ //This user editable file can be found in libs/date_time/data.
+ tz_database tz_db;
+ try {
+ tz_db.load_from_file("../../data/date_time_zonespec.csv");
+ }catch(data_not_accessible dna) {
+ std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }catch(bad_field_count bfc) {
+ std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ time_zone_ptr nyc_tz = tz_db.time_zone_from_region("America/New_York");
+ //Use a newly created time zone rule
+ time_zone_ptr phx_tz(new posix_time_zone("MST-07:00:00"));
+
+ //local departure time in Phoenix is 11 pm on March 13 2010
+ // (NY changes to DST on March 14 at 2 am)
+ local_date_time phx_departure(date(2010, Mar, 13), hours(23),
+ phx_tz,
+ local_date_time::NOT_DATE_TIME_ON_ERROR);
+ local_date_time nyc_departure = phx_departure.local_time_in(nyc_tz);
+
+ time_duration flight_length = hours(4) + minutes(30);
+ local_date_time phx_arrival = phx_departure + flight_length;
+ local_date_time nyc_arrival = phx_arrival.local_time_in(nyc_tz);
+
+ std::cout << "departure PHX time: " << phx_departure << std::endl;
+ std::cout << "departure NYC time: " << nyc_departure << std::endl;
+ std::cout << "arrival PHX time: " << phx_arrival << std::endl;
+ std::cout << "arrival NYC time: " << nyc_arrival << std::endl;
+
+}
+
+
+/* Copyright 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)
+ */
diff --git a/libs/date_time/example/local_time/local_date_time.cpp b/libs/date_time/example/local_time/local_date_time.cpp
new file mode 100644
index 000000000..8e1669526
--- /dev/null
+++ b/libs/date_time/example/local_time/local_date_time.cpp
@@ -0,0 +1,45 @@
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+#include <locale>
+
+int main() {
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ tz_database tz_db;
+ try {
+ tz_db.load_from_file("../../data/date_time_zonespec.csv");
+ }catch(data_not_accessible dna) {
+ std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }catch(bad_field_count bfc) {
+ std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }
+
+ time_zone_ptr nyc = tz_db.time_zone_from_region("America/New_York");
+ local_date_time ny_time(date(2004, Aug, 30), hours(10), nyc, true);
+
+ typedef boost::date_time::time_facet<local_date_time, char> ldt_facet;
+ ldt_facet* timefacet = new ldt_facet("%Y-%b-%d %H:%M:%S""%F %Z");
+ std::locale loc(std::locale::classic(), timefacet);
+
+ std::cout << ny_time << std::endl;
+ // 2004-Aug-30 10:00:00 EDT
+ std::cout.imbue(loc);
+ std::cout << ny_time << std::endl;
+ // 2004-Aug-30 10:00:00 Eastern Daylight Time
+
+ return 0;
+}
+
+
+/* Copyright 2004-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)
+ */
diff --git a/libs/date_time/example/local_time/seconds_since_epoch.cpp b/libs/date_time/example/local_time/seconds_since_epoch.cpp
new file mode 100644
index 000000000..7de79517c
--- /dev/null
+++ b/libs/date_time/example/local_time/seconds_since_epoch.cpp
@@ -0,0 +1,65 @@
+/* This example demonstrates the use of the time zone database and
+ * local time to calculate the number of seconds since the UTC
+ * time_t epoch 1970-01-01 00:00:00. Note that the selected timezone
+ * could be any timezone supported in the time zone database file which
+ * can be modified and updated as needed by the user.
+ *
+ * To solve this problem the following steps are required:
+ * 1) Get a timezone from the tz database for the local time
+ * 2) Construct a local time using the timezone
+ * 3) Construct a posix_time::ptime for the time_t epoch time
+ * 4) Convert the local_time to utc and subtract the epoch time
+ *
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+
+int main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+
+ tz_database tz_db;
+ try {
+ tz_db.load_from_file("../data/date_time_zonespec.csv");
+ }catch(data_not_accessible dna) {
+ std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }catch(bad_field_count bfc) {
+ std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }
+
+ time_zone_ptr nyc_tz = tz_db.time_zone_from_region("America/New_York");
+ date in_date(2004,10,04);
+ time_duration td(12,14,32);
+ // construct with local time value
+ // create not-a-date-time if invalid (eg: in dst transition)
+ local_date_time nyc_time(in_date,
+ td,
+ nyc_tz,
+ local_date_time::NOT_DATE_TIME_ON_ERROR);
+
+ std::cout << nyc_time << std::endl;
+
+ ptime time_t_epoch(date(1970,1,1));
+ std::cout << time_t_epoch << std::endl;
+
+ // first convert nyc_time to utc via the utc_time()
+ // call and subtract the ptime.
+ time_duration diff = nyc_time.utc_time() - time_t_epoch;
+
+ //Expected 1096906472
+ std::cout << "Seconds diff: " << diff.total_seconds() << std::endl;
+
+}
+
+
+/* Copyright 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)
+ */
diff --git a/libs/date_time/example/local_time/simple_time_zone.cpp b/libs/date_time/example/local_time/simple_time_zone.cpp
new file mode 100644
index 000000000..6675774bf
--- /dev/null
+++ b/libs/date_time/example/local_time/simple_time_zone.cpp
@@ -0,0 +1,86 @@
+/* A simple example for using a custom_time_zone and a posix_time_zone.
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+
+int
+main()
+{
+ using namespace boost;
+ using namespace local_time;
+ using namespace gregorian;
+ using posix_time::time_duration;
+
+ /***** custom_time_zone *****/
+
+ // create the dependent objects for a custom_time_zone
+ time_zone_names tzn("Eastern Standard Time", "EST",
+ "Eastern Daylight Time", "EDT");
+ time_duration utc_offset(-5,0,0);
+ dst_adjustment_offsets adj_offsets(time_duration(1,0,0),
+ time_duration(2,0,0),
+ time_duration(2,0,0));
+ // rules for this zone are:
+ // start on first Sunday of April at 2 am
+ // end on last Sunday of October at 2 am
+ // so we use a first_last_dst_rule
+ first_day_of_the_week_in_month start_rule(Sunday, Apr);
+ last_day_of_the_week_in_month end_rule(Sunday, Oct);
+ shared_ptr<dst_calc_rule> nyc_rules(new first_last_dst_rule(start_rule,
+ end_rule));
+ // create more dependent objects for a non-dst custom_time_zone
+ time_zone_names tzn2("Mountain Standard Time", "MST",
+ "", ""); // no dst means empty dst strings
+ time_duration utc_offset2(-7,0,0);
+ dst_adjustment_offsets adj_offsets2(time_duration(0,0,0),
+ time_duration(0,0,0),
+ time_duration(0,0,0));
+ // no dst means we need a null pointer to the rules
+ shared_ptr<dst_calc_rule> phx_rules;
+
+ // create the custom_time_zones
+ time_zone_ptr nyc_1(new custom_time_zone(tzn, utc_offset, adj_offsets, nyc_rules));
+ time_zone_ptr phx_1(new custom_time_zone(tzn2, utc_offset2, adj_offsets2, phx_rules));
+
+ /***** posix_time_zone *****/
+
+ // create posix_time_zones that are the duplicates of the
+ // custom_time_zones created above. See posix_time_zone documentation
+ // for details on full zone names.
+ std::string nyc_string, phx_string;
+ nyc_string = "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00";
+ // nyc_string = "EST-05EDT,M4.1.0,M10.5.0"; // shorter when defaults used
+ phx_string = "MST-07"; // no-dst
+ time_zone_ptr nyc_2(new posix_time_zone(nyc_string));
+ time_zone_ptr phx_2(new posix_time_zone(phx_string));
+
+
+ /***** show the sets are equal *****/
+
+ std::cout << "The first zone is in daylight savings from:\n "
+ << nyc_1->dst_local_start_time(2004) << " through "
+ << nyc_1->dst_local_end_time(2004) << std::endl;
+
+ std::cout << "The second zone is in daylight savings from:\n "
+ << nyc_2->dst_local_start_time(2004) << " through "
+ << nyc_2->dst_local_end_time(2004) << std::endl;
+
+ std::cout << "The third zone (no daylight savings):\n "
+ << phx_1->std_zone_abbrev() << " and "
+ << phx_1->base_utc_offset() << std::endl;
+
+ std::cout << "The fourth zone (no daylight savings):\n "
+ << phx_2->std_zone_abbrev() << " and "
+ << phx_2->base_utc_offset() << 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)
+ */
+
diff --git a/libs/date_time/example/posix_time/Jamfile.v2 b/libs/date_time/example/posix_time/Jamfile.v2
new file mode 100644
index 000000000..b7bf07e6c
--- /dev/null
+++ b/libs/date_time/example/posix_time/Jamfile.v2
@@ -0,0 +1,13 @@
+# Copyright (c) 2002-2005 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 time_math : time_math.cpp ;
+exe local_utc_conversion : local_utc_conversion.cpp ;
+exe print_hours : print_hours.cpp ;
+exe time_periods : time_periods.cpp ;
diff --git a/libs/date_time/example/posix_time/local_utc_conversion.cpp b/libs/date_time/example/posix_time/local_utc_conversion.cpp
new file mode 100644
index 000000000..5e712e88e
--- /dev/null
+++ b/libs/date_time/example/posix_time/local_utc_conversion.cpp
@@ -0,0 +1,90 @@
+/* Demonstrate conversions between a local time and utc
+ * Output:
+ *
+ * UTC <--> New York while DST is NOT active (5 hours)
+ * 2001-Dec-31 19:00:00 in New York is 2002-Jan-01 00:00:00 UTC time
+ * 2002-Jan-01 00:00:00 UTC is 2001-Dec-31 19:00:00 New York time
+ *
+ * UTC <--> New York while DST is active (4 hours)
+ * 2002-May-31 20:00:00 in New York is 2002-Jun-01 00:00:00 UTC time
+ * 2002-Jun-01 00:00:00 UTC is 2002-May-31 20:00:00 New York time
+ *
+ * UTC <--> Arizona (7 hours)
+ * 2002-May-31 17:00:00 in Arizona is 2002-Jun-01 00:00:00 UTC time
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time_adjustor.hpp"
+#include "boost/date_time/c_local_time_adjustor.hpp"
+#include <iostream>
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ //This local adjustor depends on the machine TZ settings-- highly dangerous!
+ typedef boost::date_time::c_local_adjustor<ptime> local_adj;
+ ptime t10(date(2002,Jan,1), hours(7));
+ ptime t11 = local_adj::utc_to_local(t10);
+ std::cout << "UTC <--> Zone base on TZ setting" << std::endl;
+ std::cout << to_simple_string(t11) << " in your TZ is "
+ << to_simple_string(t10) << " UTC time "
+ << std::endl;
+ time_duration td = t11 - t10;
+ std::cout << "A difference of: "
+ << to_simple_string(td) << std::endl;
+
+
+ //eastern timezone is utc-5
+ typedef boost::date_time::local_adjustor<ptime, -5, us_dst> us_eastern;
+
+ ptime t1(date(2001,Dec,31), hours(19)); //5 hours b/f midnight NY time
+
+ std::cout << "\nUTC <--> New York while DST is NOT active (5 hours)"
+ << std::endl;
+ ptime t2 = us_eastern::local_to_utc(t1);
+ std::cout << to_simple_string(t1) << " in New York is "
+ << to_simple_string(t2) << " UTC time "
+ << std::endl;
+
+ ptime t3 = us_eastern::utc_to_local(t2);//back should be the same
+ std::cout << to_simple_string(t2) << " UTC is "
+ << to_simple_string(t3) << " New York time "
+ << "\n\n";
+
+ ptime t4(date(2002,May,31), hours(20)); //4 hours b/f midnight NY time
+ std::cout << "UTC <--> New York while DST is active (4 hours)" << std::endl;
+ ptime t5 = us_eastern::local_to_utc(t4);
+ std::cout << to_simple_string(t4) << " in New York is "
+ << to_simple_string(t5) << " UTC time "
+ << std::endl;
+
+ ptime t6 = us_eastern::utc_to_local(t5);//back should be the same
+ std::cout << to_simple_string(t5) << " UTC is "
+ << to_simple_string(t6) << " New York time "
+ << "\n" << std::endl;
+
+
+ //Arizona timezone is utc-7 with no dst
+ typedef boost::date_time::local_adjustor<ptime, -7, no_dst> us_arizona;
+
+ ptime t7(date(2002,May,31), hours(17));
+ std::cout << "UTC <--> Arizona (7 hours)" << std::endl;
+ ptime t8 = us_arizona::local_to_utc(t7);
+ std::cout << to_simple_string(t7) << " in Arizona is "
+ << to_simple_string(t8) << " UTC time "
+ << 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)
+ */
+
diff --git a/libs/date_time/example/posix_time/print_hours.cpp b/libs/date_time/example/posix_time/print_hours.cpp
new file mode 100644
index 000000000..3877a3c73
--- /dev/null
+++ b/libs/date_time/example/posix_time/print_hours.cpp
@@ -0,0 +1,53 @@
+/* Print the remaining hours of the day
+ * Uses the clock to get the local time
+ * Use an iterator to iterate over the remaining hours
+ * Retrieve the date part from a time
+ *
+ * Expected Output something like:
+ *
+ * 2002-Mar-08 16:30:59
+ * 2002-Mar-08 17:30:59
+ * 2002-Mar-08 18:30:59
+ * 2002-Mar-08 19:30:59
+ * 2002-Mar-08 20:30:59
+ * 2002-Mar-08 21:30:59
+ * 2002-Mar-08 22:30:59
+ * 2002-Mar-08 23:30:59
+ * Time left till midnight: 07:29:01
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include <iostream>
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ //get the current time from the clock -- one second resolution
+ ptime now = second_clock::local_time();
+ //Get the date part out of the time
+ date today = now.date();
+ date tomorrow = today + days(1);
+ ptime tomorrow_start(tomorrow); //midnight
+
+ //iterator adds by one hour
+ time_iterator titr(now,hours(1));
+ for (; titr < tomorrow_start; ++titr) {
+ std::cout << to_simple_string(*titr) << std::endl;
+ }
+
+ time_duration remaining = tomorrow_start - now;
+ std::cout << "Time left till midnight: "
+ << to_simple_string(remaining) << 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)
+ */
+
diff --git a/libs/date_time/example/posix_time/time_math.cpp b/libs/date_time/example/posix_time/time_math.cpp
new file mode 100644
index 000000000..99793ebc7
--- /dev/null
+++ b/libs/date_time/example/posix_time/time_math.cpp
@@ -0,0 +1,36 @@
+/* Some simple examples of constructing and calculating with times
+ * Output:
+ * 2002-Feb-01 00:00:00 - 2002-Feb-01 05:04:02.001000000 = -5:04:02.001000000
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include <iostream>
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date d(2002,Feb,1); //an arbitrary date
+ //construct a time by adding up some durations
+ ptime t1(d, hours(5)+minutes(4)+seconds(2)+milliseconds(1));
+ //construct a new time by subtracting some times
+ ptime t2 = t1 - hours(5)- minutes(4)- seconds(2)- milliseconds(1);
+ //construct a duration by taking the difference between times
+ time_duration td = t2 - t1;
+
+ std::cout << to_simple_string(t2) << " - "
+ << to_simple_string(t1) << " = "
+ << to_simple_string(td) << 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)
+ */
+
diff --git a/libs/date_time/example/posix_time/time_periods.cpp b/libs/date_time/example/posix_time/time_periods.cpp
new file mode 100644
index 000000000..28e38708b
--- /dev/null
+++ b/libs/date_time/example/posix_time/time_periods.cpp
@@ -0,0 +1,58 @@
+/* Some simple examples of constructing and calculating with times
+ * Returns:
+ * [2002-Feb-01 00:00:00/2002-Feb-01 23:59:59.999999999] contains 2002-Feb-01 03:00:05
+ * [2002-Feb-01 00:00:00/2002-Feb-01 23:59:59.999999999] intersected with
+ * [2002-Feb-01 00:00:00/2002-Feb-01 03:00:04.999999999] is
+ * [2002-Feb-01 00:00:00/2002-Feb-01 03:00:04.999999999]
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include <iostream>
+
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+//Create a simple period class to contain all the times in a day
+class day_period : public time_period
+{
+public:
+ day_period(date d) : time_period(ptime(d),//midnight
+ ptime(d,hours(24)))
+ {}
+
+};
+
+int
+main()
+{
+
+ date d(2002,Feb,1); //an arbitrary date
+ //a period that represents a day
+ day_period dp(d);
+ ptime t(d, hours(3)+seconds(5)); //an arbitray time on that day
+ if (dp.contains(t)) {
+ std::cout << to_simple_string(dp) << " contains "
+ << to_simple_string(t) << std::endl;
+ }
+ //a period that represents part of the day
+ time_period part_of_day(ptime(d, hours(0)), t);
+ //intersect the 2 periods and print the results
+ if (part_of_day.intersects(dp)) {
+ time_period result = part_of_day.intersection(dp);
+ std::cout << to_simple_string(dp) << " intersected with\n"
+ << to_simple_string(part_of_day) << " is \n"
+ << to_simple_string(result) << 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)
+ */
+
diff --git a/libs/date_time/example/tutorial/io_tutorial.cpp b/libs/date_time/example/tutorial/io_tutorial.cpp
new file mode 100644
index 000000000..165a53f93
--- /dev/null
+++ b/libs/date_time/example/tutorial/io_tutorial.cpp
@@ -0,0 +1,194 @@
+#include <iostream>
+#include <boost/date_time/local_time/local_time.hpp>
+
+int main(){
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+ using namespace std;
+
+ /****** basic use ******/
+ date d(2004, Feb, 29);
+ time_duration td(12,34,56,789);
+ stringstream ss;
+ ss << d << ' ' << td;
+ ptime pt(not_a_date_time);
+ cout << pt << endl; // "not-a-date-time"
+ ss >> pt;
+ cout << pt << endl; // "2004-Feb-29 12:34:56.000789"
+ ss.str("");
+ ss << pt << " EDT-05EDT,M4.1.0,M10.5.0";
+ local_date_time ldt(not_a_date_time);
+ ss >> ldt;
+ cout << ldt << endl; // " 2004-Feb-29 12:34:56.000789 EDT"
+
+
+ /****** format strings ******/
+ local_time_facet* output_facet = new local_time_facet();
+ local_time_input_facet* input_facet = new local_time_input_facet();
+ ss.imbue(locale(locale::classic(), output_facet));
+ ss.imbue(locale(ss.getloc(), input_facet));
+ output_facet->format("%a %b %d, %H:%M %z");
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "Sun Feb 29, 12:34 EDT"
+
+ output_facet->format(local_time_facet::iso_time_format_specifier);
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "20040229T123456.000789-0500"
+ output_facet->format(local_time_facet::iso_time_format_extended_specifier);
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "2004-02-29 12:34:56.000789-05:00"
+
+ // extra words in format
+ string my_format("The extended ordinal time %Y-%jT%H:%M can also be represented as %A %B %d, %Y");
+ output_facet->format(my_format.c_str());
+ input_facet->format(my_format.c_str());
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl;
+
+ // matching extra words in input
+ ss.str("The extended ordinal time 2005-128T12:15 can also be represented as Sunday May 08, 2005");
+ ss >> ldt;
+ cout << ldt << endl; // cout is using default format "2005-May-08 12:15:00 UTC"
+
+ /****** content strings ******/
+ // set up the collections of custom strings.
+ // only the full names are altered for the sake of brevity
+ string month_names[12] = { "january", "february", "march",
+ "april", "may", "june",
+ "july", "august", "september",
+ "october", "november", "december" };
+ vector<string> long_months(&month_names[0], &month_names[12]);
+ string day_names[7] = { "sunday", "monday", "tuesday", "wednesday",
+ "thursday", "friday", "saturday" };
+ vector<string> long_days(&day_names[0], &day_names[7]);
+
+ // create date_facet and date_input_facet using all defaults
+ date_facet* date_output = new date_facet();
+ date_input_facet* date_input = new date_input_facet();
+ ss.imbue(locale(ss.getloc(), date_output));
+ ss.imbue(locale(ss.getloc(), date_input));
+
+ // replace names in the output facet
+ date_output->long_month_names(long_months);
+ date_output->long_weekday_names(long_days);
+
+ // replace names in the input facet
+ date_input->long_month_names(long_months);
+ date_input->long_weekday_names(long_days);
+
+ // customize month, weekday and date formats
+ date_output->format("%Y-%B-%d");
+ date_input->format("%Y-%B-%d");
+ date_output->month_format("%B"); // full name
+ date_input->month_format("%B"); // full name
+ date_output->weekday_format("%A"); // full name
+ date_input->weekday_format("%A"); // full name
+
+ ss.str("");
+ ss << greg_month(3);
+ cout << ss.str() << endl; // "march"
+ ss.str("");
+ ss << greg_weekday(3);
+ cout << ss.str() << endl; // "tuesday"
+ ss.str("");
+ ss << date(2005,Jul,4);
+ cout << ss.str() << endl; // "2005-july-04"
+
+
+ /****** special values ******/
+ // reset the formats to defaults
+ output_facet->format(local_time_facet::default_time_format);
+ input_facet->format(local_time_input_facet::default_time_input_format);
+
+ // create custom special_values parser and formatter objects
+ // and add them to the facets
+ string sv[5] = {"nadt","neg_inf", "pos_inf", "min_dt", "max_dt" };
+ vector<string> sv_names(&sv[0], &sv[5]);
+ special_values_parser sv_parser(sv_names.begin(), sv_names.end());
+ special_values_formatter sv_formatter(sv_names.begin(), sv_names.end());
+ output_facet->special_values_formatter(sv_formatter);
+ input_facet->special_values_parser(sv_parser);
+
+ ss.str("");
+ ldt = local_date_time(not_a_date_time);
+ ss << ldt;
+ cout << ss.str() << endl; // "nadt"
+
+ ss.str("min_dt");
+ ss >> ldt;
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "1400-Jan-01 00:00:00 UTC"
+
+ /****** date/time periods ******/
+ // reset all formats to defaults
+ date_output->format(date_facet::default_date_format);
+ date_input->format(date_facet::default_date_format);
+ date_output->month_format("%b"); // abbrev
+ date_input->month_format("%b"); // abbrev
+ date_output->weekday_format("%a"); // abbrev
+ date_input->weekday_format("%a"); // abbrev
+
+ // create our date_period
+ date_period dp(date(2005,Mar,1), days(31)); // month of march
+
+ // custom period formatter and parser
+ period_formatter per_formatter(period_formatter::AS_OPEN_RANGE,
+ " to ", "from ", " exclusive", " inclusive" );
+ period_parser per_parser(period_parser::AS_OPEN_RANGE,
+ " to ", "from ", " exclusive" , " inclusive" );
+
+ // default output
+ ss.str("");
+ ss << dp;
+ cout << ss.str() << endl; // "[2005-Mar-01/2005-Mar-31]"
+
+ // add out custom parser and formatter to the facets
+ date_output->period_formatter(per_formatter);
+ date_input->period_parser(per_parser);
+
+ // custom output
+ ss.str("");
+ ss << dp;
+ cout << ss.str() << endl; // "from 2005-Feb-01 to 2005-Apr-01 exclusive"
+
+
+ /****** date generators ******/
+ // custom date_generator phrases
+ string dg_phrases[9] = { "1st", "2nd", "3rd", "4th", "5th",
+ "final", "prior to", "following", "in" };
+ vector<string> phrases(&dg_phrases[0], &dg_phrases[9]);
+
+ // create our date_generator
+ first_day_of_the_week_before d_gen(Monday);
+
+ // default output
+ ss.str("");
+ ss << d_gen;
+ cout << ss.str() << endl; // "Mon before"
+
+ // add our custom strings to the date facets
+ date_output->date_gen_phrase_strings(phrases);
+ date_input->date_gen_element_strings(phrases);
+
+ // custom output
+ ss.str("");
+ ss << d_gen;
+ cout << ss.str() << endl; // "Mon prior to"
+
+ return 0;
+}
+
+
+/* Copyright 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)
+ */
+
diff --git a/libs/date_time/index.html b/libs/date_time/index.html
new file mode 100644
index 000000000..e68c1cfe8
--- /dev/null
+++ b/libs/date_time/index.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0; URL=../../doc/html/date_time.html">
+</head>
+<body>
+Automatic redirection failed, please go to
+<a href="../../doc/html/date_time.html">../../doc/html/date_time.html</a>
+<p>© Copyright CrystalClear Software, 2003</p>
+<p> Use, modification, and distribution are subject to the Boost Software
+License, Version 1.0. (See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+www.boost.org/LICENSE_1_0.txt</a>)</p>
+</body>
+</html>
diff --git a/libs/date_time/src/date_time.doc b/libs/date_time/src/date_time.doc
new file mode 100644
index 000000000..dfce9f16f
--- /dev/null
+++ b/libs/date_time/src/date_time.doc
@@ -0,0 +1,72 @@
+/* Copyright (c) 2001-2004 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)
+ * Author: Jeff Garland
+ * $Date: 2008-03-26 14:16:15 -0700 (Wed, 26 Mar 2008) $
+ */
+
+
+/*! @mainpage Boost Date-Time Library Reference Documentation
+ *
+ *
+ *@section intro Introduction
+ *
+ * The Boost Date-Time Library (originally the Generic Date-Time Library or GDTL)
+ * is a set of C++ date-time libraries based on the concepts of generic programming.
+ * This is an online reference guide generated from the source code
+ * that provides a handy way to learn about the details of the
+ * library. If you are a user you should start with the
+ * <a href="../user_docs/index.html">User Documentation</a>.
+ *
+ *@section using Using This Documentation
+ *
+ * The online documentation provides extensive information about the details
+ * of the library including:
+ * - <A href="inherits.html">Class hierarchy</A>
+ * - <A href="namespaces.html">Namespace Documentation</A>
+ * - List of <A href="files.html">source files</A>
+ * - Annotated list of classes and structs
+ * <A href="annotated.html">(Compound List)</A>
+ *
+ * For example, suppose you wanted to learn more about the
+ * gregorian::greg_month class.
+ * You could alternatively browse the
+ * - <A href="classboost_1_1gregorian_1_1greg__month.html">Class documentation page</A>
+ * - Include dependencies for greg_month.hpp
+ * - Hyperlinked and colorized source files: <A href="greg__month_8hpp-source.html">[hpp file]</A> <A href="greg__month_8cpp-source.html">[cpp file]</A>
+ *
+ * The main navigation bar at the top provides that access to many
+ * different modes of naviation through the library.
+
+ *
+ */
+
+//! Overall boost namespace -- library does not put any symbols here
+namespace boost {
+
+//! Namespace for basic templates and components used to construct date-time systems
+/*!
+ This namespace encapsulates various types of templates and classes used
+ to construct coherent date-time systems including date, time, etc. These
+ components should be considered helper components to be utilized in the
+ construction of specific date-time system implementations. See namespace
+ gregorian for one such example.
+*/
+namespace date_time {}
+
+}
+/*! Namespace for the c++ standard library. Library does not define any symbols in the namespace, but uses some classes from this namespace.
+*/
+namespace std {}
+
+/*!\class std::out_of_range
+ \brief Exception class defined in c++ standard library.
+ A derivative of std::logic_error and std::exception and base class for
+ many exceptions in the library. See also:
+
+ <a href="http://docs.mandragor.org/files/Programming_languages/Cpp/libstdcpp_v3_Source_Documentation/classstd_1_1out__of__range.html">Mandragor docs for libstdcpp_v3 std::out_of_range</a>
+*/
+
+
+
diff --git a/libs/date_time/src/gregorian/date_generators.cpp b/libs/date_time/src/gregorian/date_generators.cpp
new file mode 100644
index 000000000..4669065be
--- /dev/null
+++ b/libs/date_time/src/gregorian/date_generators.cpp
@@ -0,0 +1,38 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-09-24 11:08:16 -0700 (Mon, 24 Sep 2012) $
+ */
+
+
+
+#ifndef BOOST_DATE_TIME_SOURCE
+#define BOOST_DATE_TIME_SOURCE
+#endif
+#include "boost/date_time/date_generators.hpp"
+
+namespace boost {
+namespace date_time {
+
+ const char* const _nth_as_str[] = {"out of range", "first", "second",
+ "third", "fourth", "fifth"};
+
+ //! Returns nth arg as string. 1 -> "first", 2 -> "second", max is 5.
+ BOOST_DATE_TIME_DECL const char* nth_as_str(int ele)
+ {
+ if(ele >= 1 && ele <= 5) {
+ return _nth_as_str[ele];
+ }
+ else {
+ return _nth_as_str[0];
+ }
+ }
+
+} } //namespace date_time
+
+
+
+
+
diff --git a/libs/date_time/src/gregorian/greg_month.cpp b/libs/date_time/src/gregorian/greg_month.cpp
new file mode 100644
index 000000000..cce04f008
--- /dev/null
+++ b/libs/date_time/src/gregorian/greg_month.cpp
@@ -0,0 +1,173 @@
+/* Copyright (c) 2002-2005 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-09-30 16:25:22 -0700 (Sun, 30 Sep 2012) $
+ */
+
+
+
+#ifndef BOOST_DATE_TIME_SOURCE
+#define BOOST_DATE_TIME_SOURCE
+#endif
+#include "boost/date_time/gregorian/greg_month.hpp"
+#include "boost/date_time/gregorian/greg_facet.hpp"
+#include "boost/date_time/date_format_simple.hpp"
+#include "boost/date_time/compiler_config.hpp"
+#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+#include "boost/date_time/gregorian/formatters_limited.hpp"
+#else
+#include "boost/date_time/gregorian/formatters.hpp"
+#endif
+#include "boost/date_time/date_parsing.hpp"
+#include "boost/date_time/gregorian/parsers.hpp"
+
+#include "greg_names.hpp"
+namespace boost {
+namespace gregorian {
+
+ /*! Returns a shared pointer to a map of Month strings & numbers.
+ * Strings are both full names and abbreviations.
+ * Ex. ("jan",1), ("february",2), etc...
+ * Note: All characters are lowercase - for case insensitivity
+ */
+ greg_month::month_map_ptr_type greg_month::get_month_map_ptr()
+ {
+ static month_map_ptr_type month_map_ptr(new greg_month::month_map_type());
+
+ if(month_map_ptr->empty()) {
+ std::string s("");
+ for(unsigned short i = 1; i <= 12; ++i) {
+ greg_month m(static_cast<month_enum>(i));
+ s = m.as_long_string();
+ s = date_time::convert_to_lower(s);
+ month_map_ptr->insert(std::make_pair(s, i));
+ s = m.as_short_string();
+ s = date_time::convert_to_lower(s);
+ month_map_ptr->insert(std::make_pair(s, i));
+ }
+ }
+ return month_map_ptr;
+ }
+
+
+ //! Returns 3 char english string for the month ex: Jan, Feb, Mar, Apr
+ const char*
+ greg_month::as_short_string() const
+ {
+ return short_month_names[value_-1];
+ }
+
+ //! Returns full name of month as string in english ex: January, February
+ const char*
+ greg_month::as_long_string() const
+ {
+ return long_month_names[value_-1];
+ }
+
+ //! Return special_value from string argument
+ /*! Return special_value from string argument. If argument is
+ * not one of the special value names (defined in names.hpp),
+ * return 'not_special' */
+ special_values special_value_from_string(const std::string& s) {
+ short i = date_time::find_match(special_value_names,
+ special_value_names,
+ date_time::NumSpecialValues,
+ s);
+ if(i >= date_time::NumSpecialValues) { // match not found
+ return not_special;
+ }
+ else {
+ return static_cast<special_values>(i);
+ }
+ }
+
+
+#ifndef BOOST_NO_STD_WSTRING
+ //! Returns 3 wchar_t english string for the month ex: Jan, Feb, Mar, Apr
+ const wchar_t*
+ greg_month::as_short_wstring() const
+ {
+ return w_short_month_names[value_-1];
+ }
+
+ //! Returns full name of month as wchar_t string in english ex: January, February
+ const wchar_t*
+ greg_month::as_long_wstring() const
+ {
+ return w_long_month_names[value_-1];
+ }
+#endif // BOOST_NO_STD_WSTRING
+
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+ /*! creates an all_date_names_put object with the correct set of names.
+ * This function is only called in the event of an exception where
+ * the imbued locale containing the needed facet is for some reason
+ * unreachable.
+ */
+ BOOST_DATE_TIME_DECL
+ boost::date_time::all_date_names_put<greg_facet_config, char>*
+ create_facet_def(char /*type*/)
+ {
+ typedef
+ boost::date_time::all_date_names_put<greg_facet_config, char> facet_def;
+
+ return new facet_def(short_month_names,
+ long_month_names,
+ special_value_names,
+ short_weekday_names,
+ long_weekday_names);
+ }
+
+ //! generates a locale with the set of gregorian name-strings of type char*
+ BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, char /*type*/){
+ typedef boost::date_time::all_date_names_put<greg_facet_config, char> facet_def;
+ return std::locale(loc, new facet_def(short_month_names,
+ long_month_names,
+ special_value_names,
+ short_weekday_names,
+ long_weekday_names)
+ );
+ }
+
+#ifndef BOOST_NO_STD_WSTRING
+ /*! creates an all_date_names_put object with the correct set of names.
+ * This function is only called in the event of an exception where
+ * the imbued locale containing the needed facet is for some reason
+ * unreachable.
+ */
+ BOOST_DATE_TIME_DECL
+ boost::date_time::all_date_names_put<greg_facet_config, wchar_t>*
+ create_facet_def(wchar_t /*type*/)
+ {
+ typedef
+ boost::date_time::all_date_names_put<greg_facet_config,wchar_t> facet_def;
+
+ return new facet_def(w_short_month_names,
+ w_long_month_names,
+ w_special_value_names,
+ w_short_weekday_names,
+ w_long_weekday_names);
+ }
+
+ //! generates a locale with the set of gregorian name-strings of type wchar_t*
+ BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, wchar_t /*type*/){
+ typedef boost::date_time::all_date_names_put<greg_facet_config, wchar_t> facet_def;
+ return std::locale(loc, new facet_def(w_short_month_names,
+ w_long_month_names,
+ w_special_value_names,
+ w_short_weekday_names,
+ w_long_weekday_names)
+ );
+ }
+#endif // BOOST_NO_STD_WSTRING
+#endif // BOOST_DATE_TIME_NO_LOCALE
+
+} } //namespace gregorian
+
+
+
+
+
+
diff --git a/libs/date_time/src/gregorian/greg_names.hpp b/libs/date_time/src/gregorian/greg_names.hpp
new file mode 100644
index 000000000..44aa8b88a
--- /dev/null
+++ b/libs/date_time/src/gregorian/greg_names.hpp
@@ -0,0 +1,43 @@
+/* Copyright (c) 2002-2004 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $
+ */
+
+
+
+#ifndef DATE_TIME_SRC_GREG_NAMES_HPP___
+#define DATE_TIME_SRC_GREG_NAMES_HPP___
+
+#include "boost/date_time/gregorian/greg_month.hpp"
+#include "boost/date_time/special_defs.hpp"
+namespace boost {
+namespace gregorian {
+
+
+ const char* const short_month_names[NumMonths]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec", "NAM"};
+ const char* const long_month_names[NumMonths]={"January","February","March","April","May","June","July","August","September","October","November","December","NotAMonth"};
+ const char* const special_value_names[date_time::NumSpecialValues]={"not-a-date-time","-infinity","+infinity","min_date_time","max_date_time","not_special"};
+
+
+ const char* const short_weekday_names[]={"Sun", "Mon", "Tue",
+ "Wed", "Thu", "Fri", "Sat"};
+ const char* const long_weekday_names[]= {"Sunday","Monday","Tuesday",
+ "Wednesday", "Thursday",
+ "Friday", "Saturday"};
+
+#ifndef BOOST_NO_STD_WSTRING
+ const wchar_t* const w_short_month_names[NumMonths]={L"Jan",L"Feb",L"Mar",L"Apr",L"May",L"Jun",L"Jul",L"Aug",L"Sep",L"Oct",L"Nov",L"Dec",L"NAM"};
+ const wchar_t* const w_long_month_names[NumMonths]={L"January",L"February",L"March",L"April",L"May",L"June",L"July",L"August",L"September",L"October",L"November",L"December",L"NotAMonth"};
+ const wchar_t* const w_special_value_names[date_time::NumSpecialValues]={L"not-a-date-time",L"-infinity",L"+infinity",L"min_date_time",L"max_date_time",L"not_special"};
+
+ const wchar_t* const w_short_weekday_names[]={L"Sun", L"Mon", L"Tue",
+ L"Wed", L"Thu", L"Fri", L"Sat"};
+ const wchar_t* const w_long_weekday_names[]= {L"Sunday",L"Monday",L"Tuesday",
+ L"Wednesday", L"Thursday",
+ L"Friday", L"Saturday"};
+#endif // BOOST_NO_STD_WSTRING
+} } // boost::gregorian
+#endif // DATE_TIME_SRC_GREG_NAMES_HPP___
diff --git a/libs/date_time/src/gregorian/greg_weekday.cpp b/libs/date_time/src/gregorian/greg_weekday.cpp
new file mode 100644
index 000000000..fe83c157a
--- /dev/null
+++ b/libs/date_time/src/gregorian/greg_weekday.cpp
@@ -0,0 +1,50 @@
+/* Copyright (c) 2002-2004 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $
+ */
+
+
+
+#ifndef BOOST_DATE_TIME_SOURCE
+#define BOOST_DATE_TIME_SOURCE
+#endif
+#include "boost/date_time/gregorian/greg_weekday.hpp"
+
+#include "greg_names.hpp"
+
+namespace boost {
+namespace gregorian {
+
+ //! Return a 3 digit english string of the day of week (eg: Sun)
+ const char*
+ greg_weekday::as_short_string() const
+ {
+ return short_weekday_names[value_];
+ }
+ //! Return a point to a long english string representing day of week
+ const char*
+ greg_weekday::as_long_string() const
+ {
+ return long_weekday_names[value_];
+ }
+
+#ifndef BOOST_NO_STD_WSTRING
+ //! Return a 3 digit english wchar_t string of the day of week (eg: Sun)
+ const wchar_t*
+ greg_weekday::as_short_wstring() const
+ {
+ return w_short_weekday_names[value_];
+ }
+ //! Return a point to a long english wchar_t string representing day of week
+ const wchar_t*
+ greg_weekday::as_long_wstring() const
+ {
+ return w_long_weekday_names[value_];
+ }
+#endif // BOOST_NO_STD_WSTRING
+
+} } //namespace gregorian
+
diff --git a/libs/date_time/src/gregorian/gregorian_types.cpp b/libs/date_time/src/gregorian/gregorian_types.cpp
new file mode 100644
index 000000000..341731f25
--- /dev/null
+++ b/libs/date_time/src/gregorian/gregorian_types.cpp
@@ -0,0 +1,62 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $
+ */
+
+
+/** @defgroup date_basics Date Basics
+ This page summarizes some of the key user types and functions needed
+ to write programs using the gregorian date system. This is not a
+ comprehensive list, but rather some key types to start exploring.
+
+
+**/
+
+/** @defgroup date_alg Date Algorithms / Generators
+ Date algorithms or generators are tools for generating other dates or
+ schedules of dates. A generator function starts with some part of a
+ date such as a month and day and is supplied another part to then
+ generate a final date.
+
+**/
+
+/** @defgroup date_format Date Formatting
+ The functions on these page are some of the key formatting functions
+ for dates.
+**/
+
+
+//File doesn't have a current purpose except to generate docs
+//and keep it changeable without recompiles
+/*! @example days_alive.cpp
+ Calculate the number of days you have been living using durations and dates.
+*/
+/*! @example days_till_new_year.cpp
+ Calculate the number of days till new years
+*/
+/*! @example print_month.cpp
+ Simple utility to print out days of the month with the days of a month. Demontstrates date iteration (date_time::date_itr).
+*/
+/*! @example localization.cpp
+ An example showing localized stream-based I/O.
+*/
+/*! @example dates_as_strings.cpp
+ Various parsing and output of strings (mostly supported for
+ compilers that do not support localized streams).
+*/
+/*! @example period_calc.cpp
+ Calculates if a date is in an 'irregular' collection of periods using
+ period calculation functions.
+*/
+/*! @example print_holidays.cpp
+ This is an example of using functors to define a holiday schedule
+ */
+/*! @example localization.cpp
+ Demonstrates the use of facets to localize date output for Gregorian dates.
+ */
+
+
+
diff --git a/libs/date_time/src/posix_time/posix_time_types.cpp b/libs/date_time/src/posix_time/posix_time_types.cpp
new file mode 100644
index 000000000..4916d36f9
--- /dev/null
+++ b/libs/date_time/src/posix_time/posix_time_types.cpp
@@ -0,0 +1,35 @@
+
+/* Copyright (c) 2002-2004 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)
+ * Author: Jeff Garland
+ * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $
+ */
+
+
+//File doesn't have a current purpose except to generate docs
+//and keep it changeable without recompiles
+
+/** @defgroup time_basics Time Basics
+
+**/
+
+/** @defgroup time_format Time Formatting
+
+**/
+
+
+
+/*! @example local_utc_conversion.cpp
+ Demonstrate utc to local and local to utc calculations including dst.
+*/
+/*! @example time_periods.cpp Demonstrate some simple uses of time periods.
+*/
+/*! @example print_hours.cpp Demonstrate time iteration, clock retrieval, and simple calculation.
+ */
+/*! @example time_math.cpp Various types of calculations with times and time durations.
+ */
+
+
+
diff --git a/libs/date_time/test/Jamfile.v2 b/libs/date_time/test/Jamfile.v2
new file mode 100644
index 000000000..16317b24a
--- /dev/null
+++ b/libs/date_time/test/Jamfile.v2
@@ -0,0 +1,235 @@
+
+
+local DATE_TIME_DYNAMIC_PROPERTIES = <define>BOOST_ALL_DYN_LINK <runtime-link>shared <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_ALL_NO_LIB ;
+local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_DATE_TIME_STATIC_LINK
+ # FIXME
+ #std::locale-support
+ <define>BOOST_ALL_NO_LIB ;
+
+
+test-suite date_time_core
+ :
+ [ run testint_adapter.cpp ]
+ [ run testtime_resolution_traits.cpp ]
+ [ run testwrapping_int.cpp ]
+ [ run testconstrained_value.cpp ]
+ [ run testgregorian_calendar.cpp ]
+ [ run testgeneric_period.cpp ]
+ ;
+
+ test-suite date_time_gregorian
+ :
+ [ run gregorian/testdate.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testdate_duration.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testgreg_durations.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testperiod.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testdate_iterator.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testformatters.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+### streaming
+ [ run gregorian/testdate_facet_new.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testdate_input_facet.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+###
+ [ run gregorian/testgenerators.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testgreg_cal.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testgreg_day.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testgreg_month.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ [ run gregorian/testgreg_year.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
+ ;
+test-suite date_time_gregorian_dll
+ :
+ [ run gregorian/testdate.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_dll ]
+ [ run gregorian/testdate_duration.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_duration_dll ]
+ [ run gregorian/testperiod.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testperiod_dll ]
+ [ run gregorian/testdate_iterator.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_iterator_dll ]
+ [ run gregorian/testformatters.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testformatters_dll ]
+### streaming
+ [ run gregorian/testdate_facet_new.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_facet_new_dll ]
+ [ run gregorian/testdate_input_facet.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_input_facet_dll ]
+###
+ [ run gregorian/testgenerators.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgenerators_dll ]
+ [ run gregorian/testgreg_cal.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_cal_dll ]
+ [ run gregorian/testgreg_day.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_day_dll ]
+ [ run gregorian/testgreg_month.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_month_dll ]
+ [ run gregorian/testgreg_year.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_year_dll ]
+ [ run gregorian/testgreg_durations.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_durations_dll ]
+ ;
+
+ test-suite date_time_posixtime
+ :
+ [ run posix_time/testfiletime_functions.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testlocal_adjustor.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testc_local_adjustor.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testclock.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testdst_rules.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testduration.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testiterator.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testparse_time.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testtime_period.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testtime.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testmicrosec_time_clock.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testtime_formatters.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testgreg_duration_operators.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+### streaming
+ [ run posix_time/testtime_facet.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run posix_time/testtime_input_facet.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+###
+
+ ;
+
+
+ test-suite date_time_wide_streaming
+ :
+ [ run gregorian/testgreg_wstream.cpp
+ ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testgreg_wstream ]
+ [ run posix_time/testtime_wstream.cpp
+ ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testtime_wstream ]
+ ;
+
+ test-suite date_time_pre_133_facet
+ :
+ [ run gregorian/testfacet.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testfacet_dll ]
+ # this next test is commented out because it crashes on VC6 (cause unknown):
+# [ run gregorian/testparse_date.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testparse_date_dll ]
+ [ run gregorian/testfacet.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO ]
+ [ run gregorian/testparse_date.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO ]
+
+ [ run posix_time/teststreams.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO ]
+ ;
+
+local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_DATE_TIME_STATIC_LINK
+ # FIXME
+ #std::locale-support
+ <define>BOOST_ALL_NO_LIB ;
+
+ test-suite date_time_localtime
+ :
+ [ run local_time/testdst_transition_day_rule.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testcustom_time_zone.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testposix_time_zone.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testwcustom_time_zone.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testwposix_time_zone.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testtz_database.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testlocal_time.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testlocal_time_iterator.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testlocal_time_period.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+### streaming
+ [ run local_time/testlocal_time_facet.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ [ run local_time/testlocal_time_input_facet.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+###
+ [ run local_time/testclocks.cpp
+ ../build//boost_date_time/<link>static
+ : : : $(DATE_TIME_PROPERTIES) ]
+ ;
+
+ local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_STATIC_LINK <define>BOOST_ALL_NO_LIB <define>USE_DATE_TIME_PRE_1_33_FACET_IO
+ # FIXME
+ # std::locale-support toolset::require-boost-spirit-support
+ ;
+
+ test-suite date_time_serialization
+ :
+ # xml archive tests
+ [ run gregorian/testgreg_serialize.cpp
+ ../build//boost_date_time/<link>static
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_PROPERTIES) <define>DATE_TIME_XML_SERIALIZE
+ : testgreg_serialize_xml ]
+ [ run posix_time/testtime_serialize.cpp
+ ../build//boost_date_time/<link>static
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_PROPERTIES)
+<define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+<define>DATE_TIME_XML_SERIALIZE
+ : testtime_serialize_xml_std_config ]
+ [ run posix_time/testtime_serialize.cpp
+ ../build//boost_date_time/<link>static
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_PROPERTIES) <define>DATE_TIME_XML_SERIALIZE
+ : testtime_serialize_xml ]
+
+ # text archive tests
+ [ run gregorian/testgreg_serialize.cpp
+ ../build//boost_date_time/<link>static
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_PROPERTIES)
+ : testgreg_serialize ]
+ [ run gregorian/testgreg_serialize.cpp
+ ../build//boost_date_time
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_DYNAMIC_PROPERTIES)
+ : testgreg_serialize_dll ]
+ [ run posix_time/testtime_serialize.cpp
+ ../build//boost_date_time/<link>static
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_PROPERTIES)
+<define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testtime_serialize_std_config ]
+ [ run posix_time/testtime_serialize.cpp
+ ../build//boost_date_time/<link>static
+ ../../serialization/build//boost_serialization
+ : : : $(DATE_TIME_PROPERTIES)
+ : testtime_serialize ]
+ ;
+
+
+# Copyright (c) 2000-2005
+# CrystalClear Software, Inc.
+# 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)
+
+
+
+
diff --git a/libs/date_time/test/gregorian/testcurrent_day.cpp b/libs/date_time/test/gregorian/testcurrent_day.cpp
new file mode 100644
index 000000000..e89e32df4
--- /dev/null
+++ b/libs/date_time/test/gregorian/testcurrent_day.cpp
@@ -0,0 +1,37 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ boost::gregorian::date d1(boost::gregorian::day_clock::local_day());
+ std::cout << "Check the printed date by hand: "
+ << boost::gregorian::to_iso_string(d1) << std::endl;
+
+ using namespace boost::gregorian;
+ date::ymd_type ymd = day_clock::local_day_ymd();
+ std::cout << ymd.year << "-"
+ << ymd.month.as_long_string() << "-"
+ << ymd.day << std::endl;
+
+ date d2(day_clock::universal_day());
+ std::cout << "Getting UTC date: "
+ << to_iso_string(d2) << std::endl;
+
+ date::ymd_type ymd2 = day_clock::universal_day_ymd();
+ std::cout << ymd2.year << "-"
+ << ymd2.month.as_long_string() << "-"
+ << ymd2.day << std::endl;
+
+ return 0;
+
+}
+
diff --git a/libs/date_time/test/gregorian/testdate.cpp b/libs/date_time/test/gregorian/testdate.cpp
new file mode 100644
index 000000000..5884c1a87
--- /dev/null
+++ b/libs/date_time/test/gregorian/testdate.cpp
@@ -0,0 +1,298 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include <iostream>
+#include <boost/cstdint.hpp>
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+
+ //various constructors
+#if !defined(DATE_TIME_NO_DEFAULT_CONSTRUCTOR)
+ date def;
+ check("Default constructor", def == date(not_a_date_time));
+#endif
+ date d(2000,1,1);
+ date d1(1900,1,1);
+ date d2 = d;
+ date d3(d2);
+ check("Copy constructor", d3 == d2);
+ date d4(2000,12,31);
+ date d4a(2000,Dec,31);
+ //d4a.print(std::cout); std::cout << std::endl;
+ check("month_rep constructor", d4 == d4a);
+ //std::cout << d3 << std::endl;
+ //retrieval functions
+ check_equal("1900-01-01 day is 01", d1.day(), 1);
+ check_equal("1900-01-01 month is 01", d1.month(), 1);
+ check_equal("1900-01-01 year is 1900", d1.year(), 1900);
+ check_equal("2000-12-31 day is 31", d4.day(), 31);
+ check_equal("2000-12-31 month is 12", d4.month(), 12);
+ check_equal("2000-12-31 year is 2000", d4.year(), 2000);
+ //operator<
+ check("1900-01-01 is less than 2000-01-01", d1 < d2);
+ check("2000-01-01 is NOT less than 2000-01-01", !(d1 < d1));
+ //operator<=
+ check("2000-01-01 is less equal than 2000-01-01", d1 <= d1);
+ //operator>
+ check("2000-01-01 is greater than 1900-01-01", d2 > d1);
+ check("2000-01-01 is NOT greater than 2000-01-01", !(d1 < d1));
+ //operator>=
+ check("2000-01-01 is greater equal than 2000-01-01", d1 >= d1);
+ //operator!=
+ check("2000-01-01 is NOT equal to 1900-01-01", d2 != d1);
+ //operator==
+ check_equal("2000-01-01 is equal 2000-01-01", d3, d2);
+ check("2000-01-01 is greater equal 2000-01-01", d3 >= d2);
+ check("2000-01-01 is greater equal 2000-01-01", d3 <= d2);
+
+ date::ymd_type ymd = d1.year_month_day();
+ check_equal("ymd year", ymd.year, 1900);
+ check_equal("ymd month", ymd.month, 1);
+ check_equal("ymd day", ymd.day, 1);
+
+ //The max function will not compile with Borland 5.5
+ //Complains about must specialize basic_data<limits> ???
+// std::cout << "Max date is " << (date::max)() << std::endl;
+// //std::cout << "Max date is " << (basic_date< date_limits<unsigned int,1900> >::max)() << std::endl;
+// //std::cout << "Max date is " << (date_limits<unsigned int, 1900>::max)() << std::endl;
+
+ const date answers[] = {date(1900,Jan,1),date(1900,Jan,4),date(1900,Jan,7),
+ date(1900,Jan,10),date(1900,Jan,13)};
+ date_duration off(3);
+ date d5(1900,1,1);
+ for (int i=0; i < 5; ++i) {
+ //std::cout << d5 << " ";
+ check(" addition ", d5 == answers[i]);
+ d5 = d5 + off;
+ }
+ std::cout << std::endl;
+
+ const date answers1[] = {date(2000,2,26),date(2000,2,28),date(2000,Mar,1)};
+ date d8(2000,Feb,26);
+ for (int j=0; j < 3; ++j) {
+ //std::cout << d8 << " ";
+ check(" more addition ", d8 == answers1[j]);
+ d8 = d8 + days(2);
+ }
+ // std::cout << std::endl;
+
+ date d6(2000,2,28);
+ date d7(2000,3,1);
+ date_duration twoDays(2);
+ date_duration negtwoDays(-2);
+ date_duration zeroDays(0);
+ check_equal("2000-03-01 - 2000-02-28 == 2 days", twoDays, (d7-d6));
+ check_equal("2000-02-28 - 2000-03-01 == - 2 days", negtwoDays, (d6-d7));
+ check_equal("2000-02-28 - 2000-02-28 == 0 days", zeroDays, (d6-d6));
+ check_equal("2000-02-28 + 2 days == 2000-03-01 ", d6 + twoDays, d7);
+ check_equal("2000-03-01 - 2 days == 2000-02-28 ", d7 - twoDays, d6);
+ check_equal("Add duration to date", date(1999,1,1) + date_duration(365), date(2000,1,1));
+ check_equal("Add zero days", date(1999,1,1) + zeroDays, date(1999,1,1));
+ //can't do this...
+ //check("Add date to duration", date_duration(365) + date(1999,1,1) == date(2000,1,1));
+
+ {
+ date d(2003,Oct,31);
+ date_duration dd(55);
+ d += dd;
+ check("date += date_duration", d == date(2003,Dec,25));
+ d -= dd;
+ check("date -= date_duration", d == date(2003,Oct,31));
+ /* special_values is more thoroughly tested later,
+ * this is just a test of += & -= with special values */
+ d += date_duration(pos_infin);
+ check("date += inf_dur", d == date(pos_infin));
+ d -= dd;
+ check("inf_date -= dur", d == date(pos_infin));
+ }
+ {
+ date d(2003,Oct,31);
+ date_duration dd1(pos_infin), dd2(neg_infin), dd3(not_a_date_time);
+ check_equal("date + inf_dur", d + dd1, date(pos_infin));
+ check_equal("date + inf_dur", d + dd2, date(neg_infin));
+ check_equal("date + nan_dur", d + dd3, date(not_a_date_time));
+ check_equal("date - inf_dur", d - dd1, date(neg_infin));
+ check_equal("date - inf_dur", d - dd2, date(pos_infin));
+ check_equal("date - nan_dur", d - dd3, date(not_a_date_time));
+ check_equal("inf_date + inf_dur", date(pos_infin) + dd1, date(pos_infin));
+ check_equal("inf_date - inf_dur", date(pos_infin) - dd1, date(not_a_date_time));
+ check_equal("inf_date + inf_dur", date(neg_infin) + dd1, date(not_a_date_time));
+ check_equal("inf_date - inf_dur", date(neg_infin) - dd1, date(neg_infin));
+ }
+
+
+ try {
+ date d9(2000, Jan, 32);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d9) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+ try {
+ date d9(2000, Jan, 0);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d9) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ try {
+ date d20(2000, Feb, 31);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d20) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ //more subtle -- one day past in a leap year
+ try {
+ date d21(2000, Feb, 30);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d21) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ //more subtle -- one day past in a leap year
+ try {
+ date d22(2000, Feb, 29);
+ check("last day of month ok", true);
+ std::cout << to_iso_string(d22) << std::endl; //stop compiler warning
+ }
+ catch (bad_day_of_month&) {
+ check("last day of month -- oops bad exception", false);
+ }
+
+ //Not a leap year -- now Feb 29 is bad
+ try {
+ date d23(1999, Feb, 29);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d23) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ //check out some special values
+ check("check not a date - false", !d7.is_not_a_date());
+ check("check positive infinity - false", !d7.is_pos_infinity());
+ check("check negative infinity - false", !d7.is_neg_infinity());
+
+ date d10(neg_infin);
+ check("check negative infinity - true", d10.is_infinity());
+ d10 = d10 + twoDays; //still neg infinity
+ check("check negative infinity - true", d10.is_neg_infinity());
+
+ date d11(pos_infin);
+ check("check positive infinity - true", d11.is_infinity());
+ d11 = d11 + twoDays;
+ check("check positive infinity add - true", d11.is_pos_infinity());
+
+ date d12(not_a_date_time);
+ check("check not a date", d12.is_not_a_date());
+ check("check infinity compare ", d10 != d11);
+ check("check infinity compare ", d10 < d11);
+ check("check infinity nad compare ", d12 != d11);
+ date d13(max_date_time);
+ check("check infinity - max compare ", d13 < d11);
+ check_equal("max date_time value ", d13, date(9999,Dec, 31));
+ std::cout << to_simple_string(d13) << std::endl;
+ date d14(min_date_time);
+ check("check infinity - min compare ", d14 > d10);
+ std::cout << to_simple_string(d14) << std::endl;
+ check_equal("min date_time value ", d14, date(1400,Jan, 1));
+
+
+ date d15(1400,1,1);
+ std::cout << d15.day_of_week().as_long_string() << std::endl;
+ check("check infinity - min compare ", d10 < d15);
+
+ // most of this testing is in the gregorian_calendar tests
+ std::cout << d15.julian_day() << std::endl;
+ check_equal("check julian day ", d15.julian_day(),
+ static_cast<boost::uint32_t>(2232400));
+ check_equal("check modjulian day ", d15.modjulian_day(), -167601);
+ date d16(2004,2,29);
+ check_equal("check julian day ", d16.julian_day(),
+ static_cast<boost::uint32_t>(2453065));
+ check_equal("check modjulian day ", d16.modjulian_day(),
+ static_cast<boost::uint32_t>(53064));
+
+ // most of this testing is in the gregorian_calendar tests
+ date d31(2000, Jun, 1);
+ check_equal("check iso week number ", d31.week_number(), 22);
+ date d32(2000, Aug, 1);
+ check_equal("check iso week number ", d32.week_number(), 31);
+ date d33(2000, Oct, 1);
+ check_equal("check iso week number ", d33.week_number(), 39);
+ date d34(2000, Dec, 1);
+ check_equal("check iso week number ", d34.week_number(), 48);
+ date d35(2000, Dec, 24);
+ check_equal("check iso week number ", d35.week_number(), 51);
+ date d36(2000, Dec, 25);
+ check_equal("check iso week number ", d36.week_number(), 52);
+ date d37(2000, Dec, 31);
+ check_equal("check iso week number ", d37.week_number(), 52);
+ date d38(2001, Jan, 1);
+ check_equal("check iso week number ", d38.week_number(), 1);
+
+ try {
+ int dayofyear1 = d38.day_of_year();
+ check_equal("check day of year number", dayofyear1, 1);
+ check_equal("check day of year number", d37.day_of_year(), 366);
+ date d39(2001,Dec,31);
+ check_equal("check day of year number", d39.day_of_year(), 365);
+ date d40(2000,Feb,29);
+ check_equal("check day of year number", d40.day_of_year(), 60);
+ date d41(1400,Jan,1);
+ check_equal("check day of year number", d41.day_of_year(), 1);
+ date d42(1400,Jan,1);
+ check_equal("check day of year number", d42.day_of_year(), 1);
+ date d43(2002,Nov,17);
+ check_equal("check day of year number", d43.day_of_year(), 321);
+ }
+ catch(std::exception& e) {
+ std::cout << e.what() << std::endl;
+ check("check day of year number", false);
+ }
+
+ //converts to date and back -- should get same result
+ check_equal("tm conversion functions 2000-1-1", date_from_tm(to_tm(d)), d);
+ check_equal("tm conversion functions 1900-1-1", date_from_tm(to_tm(d1)), d1);
+ check_equal("tm conversion functions min date 1400-1-1 ", date_from_tm(to_tm(d14)), d14);
+ check_equal("tm conversion functions max date 9999-12-31", date_from_tm(to_tm(d13)), d13);
+
+ try{
+ date d(neg_infin);
+ tm d_tm = to_tm(d);
+ check("Exception not thrown (special_value to_tm)", false);
+ std::cout << d_tm.tm_sec << std::endl; //does nothing useful but stops compiler from complaining about unused d_tm
+ }catch(std::out_of_range& e){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/gregorian/testdate_duration.cpp b/libs/date_time/test/gregorian/testdate_duration.cpp
new file mode 100644
index 000000000..12bee2dbb
--- /dev/null
+++ b/libs/date_time/test/gregorian/testdate_duration.cpp
@@ -0,0 +1,77 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void test_date_duration()
+{
+ using namespace boost::gregorian;
+
+ date_duration threeDays(3);
+ date_duration twoDays(2);
+ //date_duration zeroDays(0);
+ check("Self equal case", threeDays == threeDays);
+ check("Not equal case", !(threeDays == twoDays));
+ check("Less case succeed", twoDays < threeDays);
+ check("Not less case", !(threeDays < twoDays));
+ check("Not less case - equal", !(threeDays < threeDays));
+ check("Greater than ", !(threeDays > threeDays));
+ check("Greater equal ", threeDays >= threeDays);
+ check("Greater equal - false", !(twoDays >= threeDays));
+ check("add", twoDays + threeDays == date_duration(5));
+ date_duration fiveDays = threeDays;
+ fiveDays += twoDays;
+ check("add", fiveDays == date_duration(5));
+ date_duration tenDays = fiveDays;
+ tenDays += date_duration(5);
+ check("add", tenDays.days() == 10);
+
+ date_duration derivedOneDay = threeDays - twoDays;
+ check("Subtraction - neg result", twoDays - threeDays == date_duration(-1));
+ date_duration oneDay(1);
+ check("Subtraction", oneDay == derivedOneDay);
+ date_duration fiveDaysDerived = tenDays;
+ fiveDaysDerived -= fiveDays;
+ check("Subtraction", fiveDaysDerived == fiveDays);
+
+ oneDay = twoDays / 2;
+ check("Division", oneDay.days() == 1);
+ date_duration oneDayDivide = threeDays / 2;
+ check("Division", oneDayDivide.days() == 1);
+ date_duration hundred(100);
+ hundred /= -10;
+ check("Division", hundred.days() == -10 && hundred.is_negative());
+
+ date_duration pos_dur(123);
+ date_duration neg_dur(-pos_dur);
+ check("unary-", neg_dur.days() == -123);
+
+ // special values tests
+ date_duration pi_dur(pos_infin);
+ date_duration ni_dur(neg_infin);
+ date_duration nd_dur(not_a_date_time);
+ check("pos_inf + neg_inf", (pi_dur + ni_dur) == nd_dur);
+ //check("inf * integer", (pi_dur * 2) == pi_dur); // not implemented
+ check("neg_inf / integer", (ni_dur / 3) == ni_dur);
+ check("inf + dur", (pi_dur + hundred) == pi_dur);
+ check("unary-", date_duration(-pi_dur) == ni_dur);
+
+// date_duration dd(1);
+// dd++;
+// check("Increment", dd == twoDays);
+
+}
+
+int main() {
+ test_date_duration();
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/gregorian/testdate_facet_new.cpp b/libs/date_time/test/gregorian/testdate_facet_new.cpp
new file mode 100644
index 000000000..7a0b23c13
--- /dev/null
+++ b/libs/date_time/test/gregorian/testdate_facet_new.cpp
@@ -0,0 +1,369 @@
+
+
+/* Copyright (c) 2004 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2009-06-04 01:24:49 -0700 (Thu, 04 Jun 2009) $
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/date_facet.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+
+
+template<class temporal_type, typename charT>
+inline
+void
+teststreaming(std::string testname,
+ temporal_type value,
+ std::basic_string<charT> expected_result,
+ const std::locale& locale = std::locale::classic())
+{
+ std::basic_stringstream<charT> ss;
+ ss.imbue(locale);
+ ss << value;
+ check_equal(testname, ss.str(), expected_result);
+}
+
+
+// collections for adding to facet
+const char* const month_short_names[]={"*jan*","*feb*","*mar*",
+ "*apr*","*may*","*jun*",
+ "*jul*","*aug*","*sep*",
+ "*oct*","*nov*","*dec*"};
+
+const char* const month_long_names[]={"**January**","**February**","**March**",
+ "**April**","**May**","**June**",
+ "**July**","**August**","**September**",
+ "**October**","**November**","**December**"};
+
+const char* const weekday_short_names[]={"day1", "day2","day3","day4",
+ "day5","day6","day7"};
+
+const char* const weekday_long_names[]= {"Sun-0", "Mon-1", "Tue-2",
+ "Wed-3", "Thu-4",
+ "Fri-5", "Sat-6"};
+
+std::vector<std::basic_string<char> > short_weekday_names;
+std::vector<std::basic_string<char> > long_weekday_names;
+std::vector<std::basic_string<char> > short_month_names;
+std::vector<std::basic_string<char> > long_month_names;
+
+#if !defined(BOOST_NO_STD_WSTRING)
+// collections of test results
+const std::wstring full_months[]={L"January",L"February",L"March",
+ L"April",L"May",L"June",
+ L"July",L"August",L"September",
+ L"October",L"November",L"December"};
+const std::wstring short_months[]={L"Jan",L"Feb",L"Mar",
+ L"Apr",L"May",L"Jun",
+ L"Jul",L"Aug",L"Sep",
+ L"Oct",L"Nov",L"Dec"};
+
+const std::wstring full_weekdays[]= {L"Sunday", L"Monday",L"Tuesday",
+ L"Wednesday", L"Thursday",
+ L"Friday", L"Saturday"};
+const std::wstring short_weekdays[]= {L"Sun", L"Mon",L"Tue",
+ L"Wed", L"Thu",
+ L"Fri", L"Sat"};
+
+//const whcar_t const
+#endif // BOOST_NO_STD_WSTRING
+
+int main() {
+ using namespace boost::gregorian;
+
+ std::copy(&month_short_names[0],
+ &month_short_names[12],
+ std::back_inserter(short_month_names));
+
+ std::copy(&month_long_names[0],
+ &month_long_names[12],
+ std::back_inserter(long_month_names));
+
+ std::copy(&weekday_short_names[0],
+ &weekday_short_names[7],
+ std::back_inserter(short_weekday_names));
+
+ std::copy(&weekday_long_names[0],
+ &weekday_long_names[7],
+ std::back_inserter(long_weekday_names));
+
+ {
+ std::stringstream ss;
+ date d(2004,Oct,31);
+ date_period dp(d, d + days(7));
+ ss << d;
+ check("to_string & default formats match",
+ to_simple_string(d) == ss.str());
+ ss.str("");
+ ss << dp;
+ check("to_string & default formats match",
+ to_simple_string(dp) == ss.str());
+ }
+
+ {
+ date d(2004,Oct, 13);
+ date_period dp(d, d + days(7));
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->format(date_facet::standard_format_specifier);
+ std::cout.imbue(std::locale(std::locale::classic(), datefacet));
+ teststreaming("default classic date", d, std::string("10/13/04"),
+ std::locale(std::locale::classic(), datefacet));
+ std::cout << "default classic date output: " << d << std::endl;
+
+ }
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->format(date_facet::standard_format_specifier);
+ teststreaming("default classic date period", dp,
+ std::string("[10/13/04/10/19/04]"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->format("%Y-%d-%b %a");
+ teststreaming("custom date facet date period", dp,
+ std::string("[2004-13-Oct Wed/2004-19-Oct Tue]"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->set_iso_format();
+ teststreaming("custom date facet date", d,
+ std::string("20041013"),
+ std::locale(std::locale::classic(), datefacet));
+
+ }
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->set_iso_format();
+ teststreaming("custom date facet date period", dp,
+ std::string("[20041013/20041019]"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->set_iso_extended_format();
+ teststreaming("custom date facet date", d,
+ std::string("2004-10-13"),
+ std::locale(std::locale::classic(), datefacet));
+
+ }
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->set_iso_extended_format();
+ teststreaming("custom date facet date period", dp,
+ std::string("[2004-10-13/2004-10-19]"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->set_iso_extended_format();
+ period_formatter pf(period_formatter::AS_OPEN_RANGE, " / ", "[ ", " )", " ]");
+ datefacet->period_formatter(pf);
+ teststreaming("custom date facet date period - open range custom delimeters", dp,
+ std::string("[ 2004-10-13 / 2004-10-20 )"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet("%A %b %d, %Y");
+ datefacet->short_month_names(short_month_names);
+ teststreaming("custom date facet -- custom short month names", d,
+ std::string("Wednesday *oct* 13, 2004"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet("%B %A %d, %Y");
+ datefacet->long_month_names(long_month_names);
+ teststreaming("custom date facet -- custom long month names", d,
+ std::string("**October** Wednesday 13, 2004"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet("%a - %b %d, %Y");
+ datefacet->short_weekday_names(short_weekday_names);
+ std::cout.imbue(std::locale(std::locale::classic(), datefacet));
+ std::cout << d << std::endl;
+ teststreaming("custom date facet -- custom short weekday names", d,
+ std::string("day4 - Oct 13, 2004"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {
+ date_facet* datefacet = new date_facet("%b %d, %Y ++ %A");
+ datefacet->long_weekday_names(long_weekday_names);
+ teststreaming("custom date facet -- custom short weekday names", d,
+ std::string("Oct 13, 2004 ++ Wed-3"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+ {//date
+ date_facet* datefacet = new date_facet("%Y-%b-%d %%d");
+ teststreaming("Literal '%' in date format", d,
+ std::string("2004-Oct-13 %d"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+ {
+ date_facet* datefacet = new date_facet("%Y-%b-%d %%%d");
+ teststreaming("Multiple literal '%'s in date format", d,
+ std::string("2004-Oct-13 %13"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+ {//month
+ date_facet* datefacet = new date_facet();
+ datefacet->month_format("%b %%b");
+ teststreaming("Literal '%' in month format", d.month(),
+ std::string("Oct %b"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->month_format("%b %%%b");
+ teststreaming("Multiple literal '%'s in month format", d.month(),
+ std::string("Oct %Oct"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+ {//weekday
+ date_facet* datefacet = new date_facet();
+ datefacet->weekday_format("%a %%a");
+ teststreaming("Literal '%' in weekday format", d.day_of_week(),
+ std::string("Wed %a"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->weekday_format("%a %%%a");
+ teststreaming("Multiple literal '%'s in weekday format", d.day_of_week(),
+ std::string("Wed %Wed"),
+ std::locale(std::locale::classic(), datefacet));
+ }
+
+
+
+ date d_not_date(not_a_date_time);
+ teststreaming("special value, no special facet", d_not_date, std::string("not-a-date-time"));
+
+
+// std::cout.imbue(std::locale(std::locale::classic(), datefacet));
+// std::cout << d << std::endl;
+
+
+ }
+
+ // date_generator tests
+ {
+ partial_date pd(31,Oct);
+ teststreaming("partial date", pd, std::string("31 Oct"));
+ first_kday_of_month fkd(Tuesday, Sep);
+ teststreaming("first kday", fkd, std::string("first Tue of Sep"));
+ nth_kday_of_month nkd2(nth_kday_of_month::second, Tuesday, Sep);
+ teststreaming("nth kday", nkd2, std::string("second Tue of Sep"));
+ nth_kday_of_month nkd3(nth_kday_of_month::third, Tuesday, Sep);
+ teststreaming("nth kday", nkd3, std::string("third Tue of Sep"));
+ nth_kday_of_month nkd4(nth_kday_of_month::fourth, Tuesday, Sep);
+ teststreaming("nth kday", nkd4, std::string("fourth Tue of Sep"));
+ nth_kday_of_month nkd5(nth_kday_of_month::fifth, Tuesday, Sep);
+ teststreaming("nth kday", nkd5, std::string("fifth Tue of Sep"));
+ last_kday_of_month lkd(Tuesday, Sep);
+ teststreaming("last kday", lkd, std::string("last Tue of Sep"));
+ first_kday_before fkb(Wednesday);
+ teststreaming("First before", fkb, std::string("Wed before"));
+ first_kday_after fka(Thursday);
+ teststreaming("First after", fka, std::string("Thu after"));
+ }
+
+#if !defined(BOOST_NO_STD_WSTRING)
+ date d(2004,Oct, 13);
+ date_period dp(d, d + days(7));
+ date d_not_date(not_a_date_time);
+
+ teststreaming("special value, no special facet wide", d_not_date,
+ std::wstring(L"not-a-date-time"));
+ {
+ wdate_facet* wdatefacet = new wdate_facet();
+ wdatefacet->format(wdate_facet::standard_format_specifier);
+ teststreaming("widestream default classic date", d,
+ std::wstring(L"10/13/04"),
+ std::locale(std::locale::classic(), wdatefacet));
+ }
+ {
+ wdate_facet* wdatefacet = new wdate_facet();
+ wdatefacet->format(wdate_facet::standard_format_specifier);
+ teststreaming("widestream default classic date period", dp,
+ std::wstring(L"[10/13/04/10/19/04]"),
+ std::locale(std::locale::classic(), wdatefacet));
+ }
+ {
+ wdate_facet* wdatefacet = new wdate_facet();
+ wdatefacet->format(L"%Y-%d-%b %a");
+ teststreaming("widestream custom date facet", d,
+ std::wstring(L"2004-13-Oct Wed"),
+ std::locale(std::locale::classic(), wdatefacet));
+ }
+ {
+ wdate_facet* wdatefacet = new wdate_facet();
+ wdatefacet->format(L"%Y-%d-%b %a");
+ teststreaming("widestream custom date facet date period", dp,
+ std::wstring(L"[2004-13-Oct Wed/2004-19-Oct Tue]"),
+ std::locale(std::locale::classic(), wdatefacet));
+ }
+ {
+ wdate_facet* wdatefacet = new wdate_facet();
+ wdatefacet->set_iso_extended_format();
+ wperiod_formatter pf(wperiod_formatter::AS_OPEN_RANGE, L" / ", L"[ ", L" )", L" ]");
+ wdatefacet->period_formatter(pf);
+ teststreaming("custom date facet date period - open range custom delimeters", dp,
+ std::wstring(L"[ 2004-10-13 / 2004-10-20 )"),
+ std::locale(std::locale::classic(), wdatefacet));
+ }
+ /************* small gregorian types tests *************/
+ wdate_facet* small_types_facet = new wdate_facet();
+ std::locale loc = std::locale(std::locale::classic(), small_types_facet);
+
+ // greg_year test
+ greg_year gy(2004);
+ teststreaming("greg_year", gy, std::string("2004"));
+
+ // greg_month tests
+ {
+ for(int i = 0; i < 12; ++i) {
+ greg_month m(i+1); // month numbers 1-12
+ teststreaming("greg_month short", m, short_months[i], loc);
+ }
+ small_types_facet->month_format(L"%B"); // full name
+ for(int i = 0; i < 12; ++i) {
+ greg_month m(i+1); // month numbers 1-12
+ teststreaming("greg_month full", m, full_months[i], loc);
+ }
+ }
+
+ // greg_weekday tests
+ {
+ for(int i = 0; i < 7; ++i) {
+ greg_weekday gw(i); // weekday numbers 0-6
+ teststreaming("greg_weekday short", gw, short_weekdays[i], loc);
+ }
+ small_types_facet->weekday_format(L"%A"); // full name
+ for(int i = 0; i < 7; ++i) {
+ greg_weekday gw(i); // weekday numbers 0-6
+ teststreaming("greg_weekday full", gw, full_weekdays[i], loc);
+ }
+ }
+#endif // BOOST_NO_STD_WSTRING
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/gregorian/testdate_input_facet.cpp b/libs/date_time/test/gregorian/testdate_input_facet.cpp
new file mode 100644
index 000000000..83a709df9
--- /dev/null
+++ b/libs/date_time/test/gregorian/testdate_input_facet.cpp
@@ -0,0 +1,577 @@
+/* Copyright (c) 2005 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-09-30 16:25:22 -0700 (Sun, 30 Sep 2012) $
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#ifndef USE_DATE_TIME_PRE_1_33_FACET_IO
+// for tests that are expected to fail and throw exceptions
+template<class temporal_type, class exception_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ exception_type const& /*except*/,
+ boost::gregorian::date_input_facet* facet)
+{
+ using namespace boost::gregorian;
+ bool result = false;
+ std::istringstream iss(input);
+ iss.exceptions(std::ios_base::failbit); // turn on exceptions
+ iss.imbue(std::locale(std::locale::classic(), facet));
+ try {
+ iss >> component;
+ }
+ catch(exception_type& e) {
+ std::cout << "Expected exception caught: \""
+ << e.what() << "\"" << std::endl;
+ result = iss.fail(); // failbit must be set to pass test
+ }
+ catch(...) {
+ result = false;
+ }
+
+ return result;
+}
+
+// for tests that are expected to fail quietly
+template<class temporal_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ boost::gregorian::date_input_facet* facet)
+{
+ using namespace boost::gregorian;
+ std::istringstream iss(input);
+ /* leave exceptions turned off
+ * iss.exceptions(std::ios_base::failbit); */
+ iss.imbue(std::locale(std::locale::classic(), facet));
+ try {
+ iss >> component;
+ }
+ catch(...) {
+ std::cout << "Caught unexpected exception" << std::endl;
+ return false;
+ }
+
+ return iss.fail(); // failbit must be set to pass test
+}
+
+#endif
+
+
+
+int main(){
+#ifndef USE_DATE_TIME_PRE_1_33_FACET_IO
+ using namespace boost::gregorian;
+
+ {
+ // verify no extra character are consumed
+ greg_month m(1);
+ std::stringstream ss("Mar.");
+ std::istreambuf_iterator<char> sitr(ss), str_end;
+
+ date_input_facet* f = new date_input_facet();
+ f->get(sitr, str_end, ss, m);
+ check("No extra characters consumed", m == greg_month(Mar) && *sitr == '.');
+ }
+
+ // set up initial objects
+ date d(not_a_date_time);
+ days dd(not_a_date_time);
+ greg_month m(1);
+ greg_weekday gw(0);
+ greg_day gd(1);
+ greg_year gy(2000);
+ // exceptions for failure_tests
+ std::ios_base::failure e_failure("default");
+ bad_month e_bad_month;
+ bad_year e_bad_year;
+ bad_day_of_month e_bad_day_of_month;
+ bad_weekday e_bad_weekday;
+ bad_day_of_year e_bad_day_of_year;
+
+ // default format tests: date, days, month, weekday, day, year
+ std::istringstream iss("2005-Jan-15 21 Feb Tue 4 2002");
+ iss >> d;
+ check_equal("Default format date", d, date(2005,Jan,15));
+ iss >> dd;
+ check_equal("Default (only) format positive days", dd, days(21));
+ iss >> m;
+ check_equal("Default format month", m, greg_month(2));
+ iss >> gw;
+ check_equal("Default format weekday", gw, greg_weekday(2));
+ iss >> gd;
+ check_equal("Default (only) format day of month", gd, greg_day(4));
+ iss >> gy;
+ check_equal("Default format year", gy, greg_year(2002));
+ // failure tests
+ check("Input Misspelled in year (date) w/exceptions",
+ failure_test(d, "205-Jan-15", e_bad_year, new date_input_facet()));
+ check("Input Misspelled in year (date) no-exceptions",
+ failure_test(d, "205-Jan-15", new date_input_facet()));
+ check("Input Misspelled in month (date) w/exceptions",
+ failure_test(d, "2005-Jsn-15", e_bad_month, new date_input_facet()));
+ check("Input Misspelled in month (date) no-exceptions",
+ failure_test(d, "2005-Jsn-15", new date_input_facet()));
+ check("Input Misspelled in day (date) w/exceptions",
+ failure_test(d, "2005-Jan-51", e_bad_day_of_month, new date_input_facet()));
+ check("Input Misspelled in day (date) no-exceptions",
+ failure_test(d, "2005-Jan-51", new date_input_facet()));
+ check("Input Misspelled greg_weekday w/exceptions",
+ failure_test(gw, "San", e_bad_weekday, new date_input_facet()));
+ check("Input Misspelled greg_weekday no-exceptions",
+ failure_test(gw, "San", new date_input_facet()));
+ check("Input Misspelled month w/exceptions",
+ failure_test(m, "Jsn", e_bad_month, new date_input_facet()));
+ check("Input Misspelled month no-exceptions",
+ failure_test(m, "Jsn", new date_input_facet()));
+ check("Bad Input greg_day w/exceptions",
+ failure_test(gd, "Sun", e_bad_day_of_month, new date_input_facet()));
+ check("Bad Input greg_day no-exceptions",
+ failure_test(gd, "Sun", new date_input_facet()));
+ check("Input Misspelled greg_year w/exceptions",
+ failure_test(gy, "205", e_bad_year, new date_input_facet()));
+ check("Input Misspelled greg_year no-exceptions",
+ failure_test(gy, "205", new date_input_facet()));
+
+ // change to full length names, iso date format, and 2 digit year
+ date_input_facet* facet = new date_input_facet();
+ facet->set_iso_format();
+ facet->month_format("%B");
+ facet->weekday_format("%A");
+ facet->year_format("%y");
+ iss.str("20050115 -55 February Tuesday 02");
+ iss.imbue(std::locale(std::locale::classic(), facet));
+
+ iss >> d;
+ check_equal("ISO format date", d, date(2005,Jan,15));
+ iss >> dd;
+ check_equal("Default (only) format negative days", dd, days(-55));
+ iss >> m;
+ check_equal("Full format month", m, greg_month(2));
+ iss >> gw;
+ check_equal("Full format weekday", gw, greg_weekday(2));
+ iss >> gy;
+ check_equal("2 digit format year", gy, greg_year(2002));
+
+ date_input_facet* f1 = new date_input_facet();
+ date_input_facet* f2 = new date_input_facet();
+ f1->set_iso_format();
+ f2->set_iso_format();
+ check("Missing digit(s) in ISO string", failure_test(d,"2005071", f1));
+ check("Missing digit(s) in ISO string",
+ failure_test(d,"2005071", e_bad_day_of_month, f2));
+
+ { // literal % in format tests
+ date d(not_a_date_time);
+ greg_month m(1);
+ greg_weekday gw(0);
+ greg_year y(1400);
+ date_input_facet* f = new date_input_facet("%%d %Y-%b-%d");
+ std::stringstream ss;
+ ss.imbue(std::locale(ss.getloc(), f));
+
+ ss.str("%d 2005-Jun-14");
+ ss >> d;
+ check_equal("Literal '%' in date format", d, date(2005,Jun,14));
+ f->format("%%%d %Y-%b-%d");
+ ss.str("%14 2005-Jun-14");
+ ss >> d;
+ check_equal("Multiple literal '%'s in date format", d, date(2005,Jun,14));
+
+ f->month_format("%%b %b");
+ ss.str("%b Jun");
+ ss >> m;
+ check_equal("Literal '%' in month format", m, greg_month(6));
+ f->month_format("%%%b");
+ ss.str("%Jun");
+ ss >> m;
+ check_equal("Multiple literal '%'s in month format", m, greg_month(6));
+
+ f->weekday_format("%%a %a");
+ ss.str("%a Tue");
+ ss >> gw;
+ check_equal("Literal '%' in weekday format", gw, greg_weekday(2));
+ f->weekday_format("%%%a");
+ ss.str("%Tue");
+ ss >> gw;
+ check_equal("Multiple literal '%'s in weekday format", gw, greg_weekday(2));
+
+ f->year_format("%%Y %Y");
+ ss.str("%Y 2005");
+ ss >> y;
+ check_equal("Literal '%' in year format", y, greg_year(2005));
+ f->year_format("%%%Y");
+ ss.str("%2005");
+ ss >> y;
+ check_equal("Multiple literal '%'s in year format", y, greg_year(2005));
+ }
+
+ // All days, month, weekday, day, and year formats have been tested
+ // begin testing other date formats
+ facet->set_iso_extended_format();
+ iss.str("2005-01-15");
+ iss >> d;
+ check_equal("ISO Extended format date", d, date(2005,Jan,15));
+
+ facet->format("%B %d, %Y");
+ iss.str("March 15, 2006");
+ iss >> d;
+ check_equal("Custom date format: \"%B %d, %Y\" => 'March 15, 2006'",
+ d, date(2006,Mar,15));
+
+ facet->format("%Y-%j"); // Ordinal format ISO8601(2000 sect 5.2.2.1 extended)
+ iss.str("2006-074");
+ iss >> d;
+ check_equal("Custom date format: \"%Y-%j\" => '2006-074'",
+ d, date(2006,Mar,15));
+ check("Bad input Custom date format: \"%Y-%j\" => '2006-74' (w/exceptions)",
+ failure_test(d, "2006-74", e_bad_day_of_year, facet));
+ check("Bad input Custom date format: \"%Y-%j\" => '2006-74' (no exceptions)",
+ failure_test(d, "2006-74", facet));
+
+ // date_period tests
+
+ // A date_period is constructed with an open range. So the periods
+ // [2000-07--04/2000-07-25) <-- open range
+ // And
+ // [2000-07--04/2000-07-24] <-- closed range
+ // Are equal
+ date begin(2002, Jul, 4);
+ days len(21);
+ date_period dp(date(2000,Jan,1), days(1));
+ iss.str("[2002-07-04/2002-07-24]");
+ facet->set_iso_extended_format();
+ iss >> dp;
+ check_equal("Default period (closed range)", dp, date_period(begin,len));
+ {
+ std::stringstream ss;
+ date d(not_a_date_time);
+ date d2 = day_clock::local_day();
+ date d3(neg_infin);
+ date d4(pos_infin);
+ date_period dp(d2, d); // date/nadt
+ date_period dp2(d, d); // nadt/nadt
+ date_period dp3(d3, d4);
+ ss << dp;
+ ss >> dp2;
+ check_equal("Special values period (reversibility test)", dp, dp2);
+ ss.str("[-infinity/+infinity]");
+ ss >> dp2;
+ check_equal("Special values period (infinities)", dp3, dp2);
+ }
+
+
+ // open range
+ period_parser pp(period_parser::AS_OPEN_RANGE);
+ iss.str("[2002-07-04/2002-07-25)");
+ facet->period_parser(pp);
+ iss >> dp;
+ check_equal("Open range period", dp, date_period(begin,len));
+ // custom period delimiters
+ pp.delimiter_strings(" to ", "from ", " exclusive", " inclusive");
+ iss.str("from 2002-07-04 to 2002-07-25 exclusive");
+ facet->period_parser(pp);
+ iss >> dp;
+ check_equal("Open range period - custom delimiters", dp, date_period(begin,len));
+ pp.range_option(period_parser::AS_CLOSED_RANGE);
+ iss.str("from 2002-07-04 to 2002-07-24 inclusive");
+ facet->period_parser(pp);
+ iss >> dp;
+ check_equal("Closed range period - custom delimiters", dp, date_period(begin,len));
+
+
+ // date_generator tests
+
+ // date_generators use formats contained in the
+ // date_input_facet for weekdays and months
+ // reset month & weekday formats to defaults
+ facet->month_format("%b");
+ facet->weekday_format("%a");
+
+ partial_date pd(1,Jan);
+ nth_kday_of_month nkd(nth_kday_of_month::first, Sunday, Jan);
+ first_kday_of_month fkd(Sunday, Jan);
+ last_kday_of_month lkd(Sunday, Jan);
+ first_kday_before fkb(Sunday);
+ first_kday_after fka(Sunday);
+ // using default date_generator_parser "nth_strings"
+ iss.str("29 Feb");
+ iss >> pd;
+ // Feb-29 is a valid date_generator, get_date() will fail in a non-leap year
+ check_equal("Default strings, partial_date",
+ pd.get_date(2004), date(2004,Feb,29));
+ iss.str("second Mon of Mar");
+ iss >> nkd;
+ check_equal("Default strings, nth_day_of_the_week_in_month",
+ nkd.get_date(2004), date(2004,Mar,8));
+ iss.str("first Tue of Apr");
+ iss >> fkd;
+ check_equal("Default strings, first_day_of_the_week_in_month",
+ fkd.get_date(2004), date(2004,Apr,6));
+ iss.str("last Wed of May");
+ iss >> lkd;
+ check_equal("Default strings, last_day_of_the_week_in_month",
+ lkd.get_date(2004), date(2004,May,26));
+ iss.str("Thu before");
+ iss >> fkb;
+ check_equal("Default strings, first_day_of_the_week_before",
+ fkb.get_date(date(2004,Feb,8)), date(2004,Feb,5));
+ iss.str("Fri after");
+ iss >> fka;
+ check_equal("Default strings, first_day_of_the_week_after",
+ fka.get_date(date(2004,Feb,1)), date(2004,Feb,6));
+ // failure tests
+ check("Incorrect elements (date_generator) w/exceptions", // after/before type mixup
+ failure_test(fkb, "Fri after", e_failure, new date_input_facet()));
+ check("Incorrect elements (date_generator) no exceptions", // after/before type mixup
+ failure_test(fkb, "Fri after", new date_input_facet()));
+ check("Incorrect elements (date_generator) w/exceptions", // first/last type mixup
+ failure_test(lkd, "first Tue of Apr", e_failure, new date_input_facet()));
+ check("Incorrect elements (date_generator) no exceptions", // first/last type mixup
+ failure_test(lkd, "first Tue of Apr", new date_input_facet()));
+ check("Incorrect elements (date_generator) w/exceptions", // 'in' is wrong
+ failure_test(nkd, "second Mon in Mar", e_failure, new date_input_facet()));
+ check("Incorrect elements (date_generator) no exceptions", // 'in' is wrong
+ failure_test(nkd, "second Mon in Mar", new date_input_facet()));
+
+ // date_generators - custom element strings
+ facet->date_gen_element_strings("1st","2nd","3rd","4th","5th","final","prior to","past","in");
+ iss.str("3rd Sat in Jul");
+ iss >> nkd;
+ check_equal("Custom strings, nth_day_of_the_week_in_month",
+ nkd.get_date(2004), date(2004,Jul,17));
+ iss.str("1st Wed in May");
+ iss >> fkd;
+ check_equal("Custom strings, first_day_of_the_week_in_month",
+ fkd.get_date(2004), date(2004,May,5));
+ iss.str("final Tue in Apr");
+ iss >> lkd;
+ check_equal("Custom strings, last_day_of_the_week_in_month",
+ lkd.get_date(2004), date(2004,Apr,27));
+ iss.str("Fri prior to");
+ iss >> fkb;
+ check_equal("Custom strings, first_day_of_the_week_before",
+ fkb.get_date(date(2004,Feb,8)), date(2004,Feb,6));
+ iss.str("Thu past");
+ iss >> fka;
+ check_equal("Custom strings, first_day_of_the_week_after",
+ fka.get_date(date(2004,Feb,1)), date(2004,Feb,5));
+
+ // date_generators - special case with empty element string
+ /* Doesn't work. Empty string returns -1 from string_parse_tree
+ * because it attempts to match the next set of characters in the
+ * stream to the wrong element. Ex. It attempts to match "Mar" to
+ * the 'of' element in the test below.
+ *
+ facet->date_gen_element_strings("1st","2nd","3rd","4th","5th","final","prior to","past",""); // the 'of' string is an empty string
+ iss.str("final Mon Mar");
+ iss >> lkd;
+ check_equal("Special case, empty element string",
+ lkd.get_date(2005), date(2005,Mar,28));
+ */
+
+
+ // special values tests (date and days only)
+ iss.str("minimum-date-time +infinity");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, default strings, min_date_time date",
+ d, date(min_date_time));
+ check_equal("Special values, default strings, pos_infin days",
+ dd, days(pos_infin));
+ iss.str("-infinity maximum-date-time");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, default strings, neg_infin date",
+ d, date(neg_infin));
+ check_equal("Special values, default strings, max_date_time days",
+ dd, days(max_date_time));
+ iss.str("not-a-date-time");
+ iss >> d;
+ check_equal("Special values, default strings, not_a_date_time date",
+ d, date(not_a_date_time));
+
+ // in addition check that special_value_from_string also works correctly for other special values
+ check_equal("Special values, default strings, not_special test",
+ special_value_from_string("not_special"), not_special);
+ check_equal("Special values, default strings, junk test",
+ special_value_from_string("junk"), not_special);
+
+ // special values custom, strings
+ special_values_parser svp("NADT", "MINF", "INF", "MINDT", "MAXDT");
+ facet->special_values_parser(svp);
+ iss.str("MINDT INF");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, custom strings, min_date_time date",
+ d, date(min_date_time));
+ check_equal("Special values, custom strings, pos_infin days",
+ dd, days(pos_infin));
+ iss.str("MINF MAXDT");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, custom strings, neg_infin date",
+ d, date(neg_infin));
+ check_equal("Special values, custom strings, max_date_time days",
+ dd, days(max_date_time));
+ iss.str("NADT");
+ iss >> dd;
+ check_equal("Special values, custom strings, not_a_date_time days",
+ dd, days(not_a_date_time));
+ // failure test
+ check("Misspelled input, special_value date w/exceptions",
+ failure_test(d, "NSDT", e_bad_year, new date_input_facet()));
+ check("Misspelled input, special_value date no exceptions",
+ failure_test(d, "NSDT", new date_input_facet()));
+ check("Misspelled input, special_value days w/exceptions",
+ failure_test(dd, "NSDT", e_failure, new date_input_facet()));
+ check("Misspelled input, special_value days no exceptions",
+ failure_test(dd, "NSDT", new date_input_facet()));
+
+ {
+ // German names. Please excuse any errors, I don't speak German and
+ // had to rely on an on-line translation service.
+ // These tests check one of each (at least) from all sets of custom strings
+
+ // create a custom format_date_parser
+ std::string m_a[] = {"Jan","Feb","Mar","Apr","Mai",
+ "Jun","Jul","Aug","Sep","Okt","Nov","Dez"};
+ std::string m_f[] = {"Januar","Februar","Marz","April",
+ "Mai","Juni","Juli","August",
+ "September","Oktober","November","Dezember"};
+ std::string w_a[] = {"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"};
+ std::string w_f[] = {"Sonntag", "Montag", "Dienstag","Mittwoch",
+ "Donnerstag", "Freitag", "Samstag"};
+ typedef boost::date_time::format_date_parser<date, char> date_parser;
+ date_parser::input_collection_type months_abbrev;
+ date_parser::input_collection_type months_full;
+ date_parser::input_collection_type wkdays_abbrev;
+ date_parser::input_collection_type wkdays_full;
+ months_abbrev.assign(m_a, m_a+12);
+ months_full.assign(m_f, m_f+12);
+ wkdays_abbrev.assign(w_a, w_a+7);
+ wkdays_full.assign(w_f, w_f+7);
+ date_parser d_parser("%B %d %Y",
+ months_abbrev, months_full,
+ wkdays_abbrev, wkdays_full);
+
+ // create a special_values parser
+ special_values_parser sv_parser("NichtDatumzeit",
+ "Negativ Unendlichkeit",
+ "Positiv Unendlichkeit",
+ "Wenigstes Datum",
+ "Maximales Datum");
+
+ // create a period_parser
+ period_parser p_parser; // default will do
+ // create date_generator_parser
+ typedef boost::date_time::date_generator_parser<date,char> date_gen_parser;
+ date_gen_parser dg_parser("Zuerst","Zweitens","Dritt","Viert",
+ "Fünft","Letzt","Vor","Nach","Von");
+
+ // create the date_input_facet
+ date_input_facet* de_facet =
+ new date_input_facet("%B %d %Y",
+ d_parser,
+ sv_parser,
+ p_parser,
+ dg_parser);
+ std::istringstream iss;
+ iss.imbue(std::locale(std::locale::classic(), de_facet));
+ // June 06 2005, Dec, minimum date, Tues
+ iss.str("Juni 06 2005 Dez Wenigstes Datum Die");
+ iss >> d;
+ iss >> m;
+ check_equal("German names: date", d, date(2005, Jun, 6));
+ check_equal("German names: month", m, greg_month(Dec));
+ iss >> d;
+ iss >> gw;
+ check_equal("German names: special value date", d, date(min_date_time));
+ check_equal("German names: short weekday", gw, greg_weekday(Tuesday));
+ de_facet->weekday_format("%A"); // long weekday
+ // Tuesday, Second Tuesday of Mar
+ iss.str("Dienstag Zweitens Dienstag von Mar");
+ iss >> gw;
+ iss >> nkd;
+ check_equal("German names: long weekday", gw, greg_weekday(Tuesday));
+ check_equal("German names, nth_day_of_the_week_in_month",
+ nkd.get_date(2005), date(2005,Mar,8));
+ // Tuesday after
+ iss.str("Dienstag Nach");
+ iss >> fka;
+ check_equal("German names, first_day_of_the_week_after",
+ fka.get_date(date(2005,Apr,5)), date(2005,Apr,12));
+ }
+
+ {
+ // test name replacement functions
+
+ // collections for adding to facet
+ const char* const month_short_names[]={"*jan*","*feb*","*mar*",
+ "*apr*","*may*","*jun*",
+ "*jul*","*aug*","*sep*",
+ "*oct*","*nov*","*dec*"};
+ const char* const month_long_names[]={"**January**","**February**","**March**",
+ "**April**","**May**","**June**",
+ "**July**","**August**","**September**",
+ "**October**","**November**","**December**"};
+ const char* const weekday_short_names[]={"day1", "day2","day3","day4",
+ "day5","day6","day7"};
+ const char* const weekday_long_names[]= {"Sun-0", "Mon-1", "Tue-2",
+ "Wed-3", "Thu-4",
+ "Fri-5", "Sat-6"};
+
+ std::vector<std::basic_string<char> > short_weekday_names;
+ std::vector<std::basic_string<char> > long_weekday_names;
+ std::vector<std::basic_string<char> > short_month_names;
+ std::vector<std::basic_string<char> > long_month_names;
+
+ std::copy(&weekday_short_names[0],
+ &weekday_short_names[7],
+ std::back_inserter(short_weekday_names));
+ std::copy(&weekday_long_names[0],
+ &weekday_long_names[7],
+ std::back_inserter(long_weekday_names));
+ std::copy(&month_short_names[0],
+ &month_short_names[12],
+ std::back_inserter(short_month_names));
+ std::copy(&month_long_names[0],
+ &month_long_names[12],
+ std::back_inserter(long_month_names));
+
+ date d(not_a_date_time);
+ date_input_facet* facet = new date_input_facet();
+ std::stringstream ss;
+ ss.imbue(std::locale(std::locale::classic(), facet));
+ facet->short_month_names(short_month_names);
+ facet->short_weekday_names(short_weekday_names);
+ facet->long_month_names(long_month_names);
+ facet->long_weekday_names(long_weekday_names);
+ facet->format("%a %b %d, %Y");
+ ss.str("day7 *apr* 23, 2005");
+ ss >> d;
+ check_equal("Short custom names, set via accessor function", d.day_of_week(), greg_weekday(6));
+ check_equal("Short custom names, set via accessor function", d.month(), greg_month(4));
+ ss.str("");
+ ss.str("Sun-0 **April** 24, 2005");
+ facet->format("%A %B %d, %Y");
+ ss >> d;
+ check_equal("Long custom names, set via accessor function", d.day_of_week(), greg_weekday(0));
+ check_equal("Long custom names, set via accessor function", d.month(), greg_month(4));
+
+ }
+#else
+ check("This test is a nop for platforms with USE_DATE_TIME_PRE_1_33_FACET_IO",
+ true);
+#endif
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/gregorian/testdate_iterator.cpp b/libs/date_time/test/gregorian/testdate_iterator.cpp
new file mode 100644
index 000000000..f82e3d22f
--- /dev/null
+++ b/libs/date_time/test/gregorian/testdate_iterator.cpp
@@ -0,0 +1,367 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void test_month_decrement_iterator(const boost::gregorian::date *Answers, int array_len){
+ using namespace boost::gregorian;
+ typedef boost::date_time::month_functor<date> mfg;
+
+ boost::date_time::date_itr<mfg, date> ditr(Answers[array_len-1]);
+ int i = array_len-1;
+ std::cout << "month iter decrement test..." << std::endl;
+ try {
+ for (; ditr > Answers[0] - date_duration(1); --ditr) {
+ check("month iterator: " + to_iso_string(*ditr), Answers[i] == *ditr);
+ i--;
+ }
+ check("month iterator iteration count", i == -1);
+ }
+ catch(std::exception& e)
+ {
+ check("month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+}
+
+void test_base_iterator(boost::gregorian::date end,
+ boost::gregorian::date_iterator& di,
+ std::string& data)
+{
+ using namespace boost::gregorian;
+ for (; di < end; ++di) {
+ data += to_iso_string(*di) + " ";
+ }
+}
+
+int
+main()
+{
+ using namespace boost::gregorian;
+
+ day_iterator di(date(2002,Jan,1));
+ std::string data;
+ test_base_iterator(date(2002,Jan,3),di,data);
+ month_iterator di2(date(2002,Jan,3));
+ test_base_iterator(date(2002,Mar,1),di2,data);
+ std::string result("20020101 20020102 20020103 20020203 ");
+ check("base iterator", data == result);
+ std::cout << data << std::endl;
+
+
+ typedef boost::date_time::day_functor<date> dfg;
+
+ {
+ const date DayAnswers[] = {date(2000,Jan,20),date(2000,Jan,22),date(2000,Jan,24)};
+ boost::date_time::date_itr<dfg,date> ditr(date(2000,Jan,20),2);
+ int i=0;
+ for (; ditr < date(2000,Jan,25); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("day iterator -- 2 days", DayAnswers[i] == *ditr);
+ i++;
+ }
+ check("day iterator -- 2 days", i == 3); // check the number of iterations
+ // decrement
+ i = 2;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("day iterator decrement -- 2 days", DayAnswers[i] == *ditr);
+ i--;
+ }
+ check("day iterator decrement -- 2 days", i == -1); // check the number of iterations
+ }
+
+ typedef boost::date_time::week_functor<date> wfg;
+ {
+ const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Jan,27),date(2000,Feb,3)};
+ boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20));
+ int i=0;
+ for (; ditr < date(2000,Feb,6); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i++;
+ }
+ check("week iterator", i == 3);
+ // decrement
+ i=2;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i--;
+ }
+ check("week iterator", i == -1);
+ }
+
+ {
+ const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Feb,3)};
+ boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20),2);
+ int i=0;
+ for (; ditr < date(2000,Feb,6); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i++;
+ }
+ check("week iterator", i == 2);
+ // decrement
+ i=1;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i--;
+ }
+ check("week iterator", i == -1);
+ }
+
+ {
+ const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Feb,3), date(2000,Feb,17)};
+ boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20),2);
+ int i=0;
+ for (; ditr < date(2000,Feb,20); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator -- 2 weeks", WeekAnswers[i] == *ditr);
+ i++;
+ }
+ check("week iterator -- 2 weeks", i == 3);
+ // decrement
+ i=2;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator -- 2 weeks", WeekAnswers[i] == *ditr);
+ i--;
+ }
+ check("week iterator -- 2 weeks", i == -1);
+ }
+
+ typedef boost::date_time::month_functor<date> mfg;
+ {
+ const date MonthAnswers[] = {
+ date(2000,Jan,1),date(2000,Feb,1),date(2000,Mar,1),date(2000,Apr,1),
+ date(2000,May,1),date(2000,Jun,1),date(2000,Jul,1),date(2000,Aug,1),
+ date(2000,Sep,1),date(2000,Oct,1),date(2000,Nov,1),date(2000,Dec,1),
+ date(2001,Jan,1)
+ };
+ test_month_decrement_iterator(MonthAnswers, 13);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Jan,1));
+ int i = 0;
+ try {
+ for (; ditr < date(2001,Jan,2); ++ditr) {
+ check("month iterator: " + to_iso_string(*ditr), MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("month iterator iteration count", i == 13);
+ }
+ catch(std::exception& e)
+ {
+ check("month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ {
+ const date MonthAnswers[] = {
+ date(2000,Jan,31),date(2000,Feb,29),date(2000,Mar,31),date(2000,Apr,30),
+ date(2000,May,31),date(2000,Jun,30),date(2000,Jul,31),date(2000,Aug,31),
+ date(2000,Sep,30),date(2000,Oct,31),date(2000,Nov,30),date(2000,Dec,31),
+ date(2001,Jan,31)
+ };
+ test_month_decrement_iterator(MonthAnswers, 13);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Jan,31));
+ int i = 0;
+ try {
+ for (; ditr < date(2001,Feb,1); ++ditr) {
+ // std::cout << *ditr << " ";
+ check("last day of month iterator: " + to_iso_string(*ditr),
+ MonthAnswers[i] == *ditr);
+ //check("last day of month iterator", MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("last day of month iterator", i == 13);
+ }
+ catch(std::exception& e)
+ {
+ check("last day of month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ {
+ const date MonthAnswers[] = {
+ date(2000,Feb,29),date(2000,Mar,31),date(2000,Apr,30),
+ date(2000,May,31),date(2000,Jun,30),date(2000,Jul,31),date(2000,Aug,31),
+ date(2000,Sep,30),date(2000,Oct,31),date(2000,Nov,30),date(2000,Dec,31),
+ date(2001,Jan,31),date(2001,Feb,28)
+ };
+ test_month_decrement_iterator(MonthAnswers, 13);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Feb,29));
+ int i = 0;
+ try {
+ for (; ditr < date(2001,Mar,1); ++ditr) {
+ // std::cout << *ditr << " ";
+ check("last day of month iterator2: " + to_iso_string(*ditr),
+ MonthAnswers[i] == *ditr);
+ //check("last day of month iterator", MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("last day of month iterator2", i == 13);
+ }
+ catch(std::exception& e)
+ {
+ check("last day of month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ { // running a span of 5 years to verify snap to end doesn't occur at next leap year
+ const date MonthAnswers[] = {
+ date(2000,Feb,28),date(2000,Mar,28),date(2000,Apr,28),date(2000,May,28),
+ date(2000,Jun,28),date(2000,Jul,28),date(2000,Aug,28),date(2000,Sep,28),
+ date(2000,Oct,28),date(2000,Nov,28),date(2000,Dec,28),date(2001,Jan,28),
+ date(2001,Feb,28),date(2001,Mar,28),date(2001,Apr,28),date(2001,May,28),
+ date(2001,Jun,28),date(2001,Jul,28),date(2001,Aug,28),date(2001,Sep,28),
+ date(2001,Oct,28),date(2001,Nov,28),date(2001,Dec,28),date(2002,Jan,28),
+ date(2002,Feb,28),date(2002,Mar,28),date(2002,Apr,28),date(2002,May,28),
+ date(2002,Jun,28),date(2002,Jul,28),date(2002,Aug,28),date(2002,Sep,28),
+ date(2002,Oct,28),date(2002,Nov,28),date(2002,Dec,28),date(2003,Jan,28),
+ date(2003,Feb,28),date(2003,Mar,28),date(2003,Apr,28),date(2003,May,28),
+ date(2003,Jun,28),date(2003,Jul,28),date(2003,Aug,28),date(2003,Sep,28),
+ date(2003,Oct,28),date(2003,Nov,28),date(2003,Dec,28),date(2004,Jan,28),
+ date(2004,Feb,28),date(2004,Mar,28),date(2004,Apr,28),date(2004,May,28),
+ date(2004,Jun,28),date(2004,Jul,28),date(2004,Aug,28),date(2004,Sep,28),
+ date(2004,Oct,28),date(2004,Nov,28),date(2004,Dec,28),date(2005,Jan,28),
+ };
+ test_month_decrement_iterator(MonthAnswers, 60);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Feb,28));
+ int i = 0;
+ try {
+ for (; ditr < date(2005,Feb,1); ++ditr) {
+ // std::cout << *ditr << " ";
+ check("last day of month iterator3: " + to_iso_string(*ditr),
+ MonthAnswers[i] == *ditr);
+ //check("last day of month iterator", MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("last day of month iterator3", i == 60);
+ }
+ catch(std::exception& e)
+ {
+ check("last day of month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ typedef boost::date_time::year_functor<date> yfg;
+ {
+ const date YearAnswers[] = {
+ date(2000,Jan,1),date(2001,Jan,1),date(2002,Jan,1),date(2003,Jan,1),
+ date(2004,Jan,1),date(2005,Jan,1),date(2006,Jan,1),date(2007,Jan,1),
+ date(2008,Jan,1),date(2009,Jan,1),date(2010,Jan,1)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Jan,1));
+ int i = 0;
+ for (; d3 < date(2010,Jan,2); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ std::cout << "Decrementing...." << std::endl;
+ i = 10;
+ --d3;
+ for (; d3 > date(1999,Dec,31); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+ { // WON'T snap top end of month
+ const date YearAnswers[] = {
+ date(2000,Feb,28),date(2001,Feb,28),date(2002,Feb,28),date(2003,Feb,28),
+ date(2004,Feb,28),date(2005,Feb,28),date(2006,Feb,28),date(2007,Feb,28),
+ date(2008,Feb,28),date(2009,Feb,28),date(2010,Feb,28)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Feb,28));
+ int i = 0;
+ for (; d3 < date(2010,Mar,1); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ std::cout << "Decrementing...." << std::endl;
+ i = 10;
+ --d3;
+ for (; d3 > date(2000,Feb,27); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+ {// WILL snap top end of month
+ const date YearAnswers[] = {
+ date(2000,Feb,29),date(2001,Feb,28),date(2002,Feb,28),date(2003,Feb,28),
+ date(2004,Feb,29),date(2005,Feb,28),date(2006,Feb,28),date(2007,Feb,28),
+ date(2008,Feb,29),date(2009,Feb,28),date(2010,Feb,28)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Feb,29));
+ int i = 0;
+ for (; d3 < date(2010,Mar,1); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ std::cout << "Decrementing...." << std::endl;
+ i = 10;
+ --d3;
+ for (; d3 > date(2000,Feb,27); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+
+ {
+ std::cout << "Increment by 2 years...." << std::endl;
+ const date YearAnswers[] = {
+ date(2000,Jan,1),date(2002,Jan,1),
+ date(2004,Jan,1),date(2006,Jan,1),
+ date(2008,Jan,1),date(2010,Jan,1)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Jan,1),2);
+ int i = 0;
+ for (; d3 < date(2010,Jan,2); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ // decrement
+ std::cout << "Decrementing...." << std::endl;
+ i = 5;
+ --d3;
+ for (; d3 > date(1999,Dec,31); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/gregorian/testfacet.cpp b/libs/date_time/test/gregorian/testfacet.cpp
new file mode 100644
index 000000000..7139a9851
--- /dev/null
+++ b/libs/date_time/test/gregorian/testfacet.cpp
@@ -0,0 +1,342 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include <sstream>
+#include <iostream>
+#include <fstream>
+
+#include "boost/date_time/gregorian/greg_month.hpp"
+#include "boost/date_time/gregorian/greg_facet.hpp"
+#include "boost/date_time/date_format_simple.hpp"
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+#ifndef BOOST_DATE_TIME_NO_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_special_value_names[]={"NichtDatumzeit","-unbegrenztheit", "+unbegrenztheit"};
+
+const char* const de_short_weekday_names[]={"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"};
+
+ const char* const de_long_weekday_names[]={"Sonntag", "Montag", "Dienstag","Mittwoch", "Donnerstag", "Freitag", "Samstag"};
+
+#endif
+
+/** Not used for now
+ const char* const es_short_month_names[]={"Ene","Feb","Mar","Abr","Pue","Jun","Jul","Ago","Sep","Oct","Nov","Dic", "NAM"};
+
+ const char* const es_long_month_names[]={"Enero","Febrero","Marcha","Abril","Pueda","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre","NoAMes"};
+ const char* const es_special_value_names[]={"NoUnRatoDeLaFacha","-infinito", "+infinito"};
+**/
+int
+main()
+{
+// std::locale native("");
+// std::cout << "native: " << native.name() << std::endl;
+//#ifndef BOOST_NO_STD_LOCALE
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+
+ using namespace boost::gregorian;
+
+ typedef greg_facet_config facet_config;
+ typedef boost::date_time::all_date_names_put<facet_config> date_facet;
+ typedef boost::date_time::date_names_put<facet_config> date_facet_base;
+ typedef boost::date_time::ostream_month_formatter<date_facet_base> month_formatter;
+
+ {
+ // special_values tests
+ std::stringstream ss;
+ date_facet_base* f = new date_facet_base();
+ std::locale loc(std::locale::classic(), f);
+ ss.imbue(loc);
+ date d(not_a_date_time);
+ ss << d;
+ check("Special value, stream out nadt" , ss.str() == std::string("not-a-date-time"));
+ ss.str("");
+ d = date(neg_infin);
+ ss << d;
+ check("Special value, stream out neg_infin" , ss.str() == std::string("-infinity"));
+ ss.str("");
+ d = date(pos_infin);
+ ss << d;
+ check("Special value, stream out pos_infin" , ss.str() == std::string("+infinity"));
+ }
+
+ date_facet gdnp(de_short_month_names, de_long_month_names,
+ de_special_value_names, de_long_weekday_names,
+ de_long_weekday_names,
+ '.',
+ boost::date_time::ymd_order_dmy);
+
+ std::stringstream ss;
+ std::ostreambuf_iterator<char> coi(ss);
+ gdnp.put_month_short(coi, Oct);
+ check("check german short month: " + ss.str(),
+ ss.str() == std::string("Okt"));
+
+ ss.str(""); //reset string stream
+ greg_month m(Oct);
+ month_formatter::format_month(m, ss, gdnp);
+ check("check german short month: " + ss.str(),
+ ss.str() == std::string("Okt"));
+ ss.str(""); //reset string stream
+// month_formatter::format_month(m, ss, gdnp);
+// check("check german long month: " + ss.str(),
+// ss.str() == std::string("Oktober"));
+
+
+ greg_year_month_day ymd(2002,Oct,1);
+ typedef boost::date_time::ostream_ymd_formatter<greg_year_month_day, date_facet_base> ymd_formatter;
+ ss.str(""); //reset string stream
+ ymd_formatter::ymd_put(ymd, ss, gdnp);
+ check("check ymd: " + ss.str(),
+ ss.str() == std::string("01.Okt.2002"));
+
+
+ typedef boost::date_time::ostream_date_formatter<date, date_facet_base> datef;
+
+ std::stringstream os;
+ date d1(2002, Oct, 1);
+ datef::date_put(d1, os, gdnp);
+ check("ostream low level check string:"+os.str(),
+ os.str() == std::string("01.Okt.2002"));
+
+// //Locale tests
+ std::locale global;
+ std::cout << "global: " << global.name() << std::endl;
+
+ // put a facet into a locale
+ //check for a facet p319
+ check("no registered facet here",
+ !std::has_facet<date_facet>(global));
+
+ std::locale global2(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_long_weekday_names,
+ de_long_weekday_names));
+
+ check("facet registered here",
+ std::has_facet<boost::date_time::date_names_put<facet_config> >(global2));
+
+ std::stringstream os2;
+ os2.imbue(global2);
+ datef::date_put(d1, os2);
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("2002-Okt-01"));
+
+ date infin(pos_infin);
+ os2.str(""); //clear stream
+ datef::date_put(infin, os2);
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("+unbegrenztheit"));
+
+ os2.str(""); //clear stream
+ os2 << infin;
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("+unbegrenztheit"));
+
+
+ date nadt(not_a_date_time);
+ os2.str(""); //clear stream
+ datef::date_put(nadt, os2);
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("NichtDatumzeit"));
+
+
+ std::stringstream os3;
+ os3 << d1;
+ check("check any old ostream: "+os3.str(),
+ os3.str() == std::string("2002-Oct-01"));
+
+ std::ofstream f("test_facet_file.out");
+ f << d1 << std::endl;
+
+// // date formatter that takes locale and gets facet from locale
+ std::locale german_dates1(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ '.',
+ boost::date_time::ymd_order_dmy,
+ boost::date_time::month_as_integer));
+
+ os3.imbue(german_dates1);
+ os3.str("");
+ os3 << d1;
+ check("check date order: "+os3.str(),
+ os3.str() == std::string("01.10.2002"));
+
+ std::locale german_dates2(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ ' ',
+ boost::date_time::ymd_order_iso,
+ boost::date_time::month_as_short_string));
+
+ os3.imbue(german_dates2);
+ os3.str("");
+ os3 << d1;
+ check("check date order: "+os3.str(),
+ os3.str() == std::string("2002 Okt 01"));
+
+ std::locale german_dates3(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ ' ',
+ boost::date_time::ymd_order_us,
+ boost::date_time::month_as_long_string));
+
+ os3.imbue(german_dates3);
+ os3.str("");
+ os3 << d1;
+ check("check date order: "+os3.str(),
+ os3.str() == std::string("Oktober 01 2002"));
+
+ date_period dp(d1, date_duration(3));
+ os3.str("");
+ os3 << dp;
+ check("check date period: "+os3.str(),
+ os3.str() == std::string("[Oktober 01 2002/Oktober 03 2002]"));
+
+
+ /*******************************************************************/
+ /* Streaming operations for date durations */
+ /*******************************************************************/
+
+ date_duration dur(26);
+ std::stringstream ss2;
+ ss2 << dur;
+ check("date_duration stream out", ss2.str() == std::string("26"));
+
+ dur = date_duration(boost::date_time::pos_infin);
+ ss2.str("");
+ ss2 << dur;
+ check("date_duration stream out", ss2.str() == std::string("+infinity"));
+
+ /*******************************************************************/
+ /* Streaming operations for date generator functions */
+ /*******************************************************************/
+
+ partial_date pd(26, Jun);
+ //std::stringstream ss2;
+ ss2.str("");
+ ss2 << pd;
+ check("partial date stream out", ss2.str() == std::string("26 Jun"));
+
+ ss2.str("");
+ nth_kday_of_month nkm(nth_kday_of_month::second, Friday, Sep);
+ ss2 << nkm;
+ check("nth kday of month", ss2.str() == std::string("second Fri of Sep"));
+
+ ss2.str("");
+ first_kday_of_month fkm(Saturday, May);
+ ss2 << fkm;
+ check("first kday of month", ss2.str() == std::string("first Sat of May"));
+
+ ss2.str("");
+ last_kday_of_month lkm(Monday, Aug);
+ ss2 << lkm;
+ check("last kday of month", ss2.str() == std::string("last Mon of Aug"));
+
+ ss2.str("");
+ first_kday_after fka(Thursday);//fkb.get_date(d)
+ ss2 << fka;
+ check("first kday after", ss2.str() == std::string("Thu after"));
+
+ ss2.str("");
+ first_kday_before fkb(Tuesday); // same ^
+ ss2 << fkb;
+ check("first kday after", ss2.str() == std::string("Tue before"));
+
+ std::cout << pd << '\n'
+ << nkm << '\n'
+ << fkm << '\n'
+ << lkm << '\n'
+ << fka << '\n'
+ << fkb << '\n'
+ << std::endl;
+
+ /*******************************************************************/
+ /* Input Streaming for greg_month */
+ /*******************************************************************/
+ {
+ std::stringstream ss1("January");
+ std::stringstream ss2("dec"); // misspelled
+ std::stringstream german("Okt");
+ german.imbue(global2);
+ greg_month m(3);
+ ss1 >> m;
+ check("Stream in month", m == greg_month(Jan));
+#ifndef BOOST_NO_STD_WSTRING
+ std::wstringstream ws1(L"Dec");
+ ws1 >> m;
+ check("Wide Stream in month", m == greg_month(Dec));
+#else
+ check("Wide Stream in not supported by this compiler", false);
+#endif // BOOST_NO_STD_WSTRING
+ german >> m;
+ check("Stream in German month", m == greg_month(Oct));
+ try{
+ ss2 >> m; // misspelled
+ check("Bad month exception NOT thrown (misspelled name)", false);
+ }catch(bad_month&){
+ check("Bad month exception caught (misspelled name)", true);
+ }catch(...){
+ check("Bad month exception NOT caught (misspelled name)", false);
+ }
+ }
+ /*******************************************************************/
+ /* Input Streaming for greg_weekday */
+ /*******************************************************************/
+ {
+ std::stringstream ss1("Sun");
+ std::stringstream ss2("Wensday"); // misspelled
+ std::stringstream german("Mittwoch"); // Wednesday
+ german.imbue(global2);
+ greg_weekday wd(Friday); //something not Sunday...
+ ss1 >> wd;
+ check("Stream in weekday", wd == greg_weekday(Sunday));
+#ifndef BOOST_NO_STD_WSTRING
+ std::wstringstream ws1(L"Saturday");
+ ws1 >> wd;
+ check("Wide Stream in weekday", wd == greg_weekday(Saturday));
+#else
+ check("Wide Stream in not supported by this compiler", false);
+#endif // BOOST_NO_STD_WSTRING
+ german >> wd;
+ check("Stream in German weekday", wd == greg_weekday(Wednesday));
+ try{
+ ss2 >> wd;
+ check("Bad weekday exception NOT thrown (misspelled name)", false);
+ }catch(bad_weekday&){
+ check("Bad weekday exception caught (misspelled name)", true);
+ }catch(...){
+ check("Bad weekday exception NOT caught (misspelled name)", false);
+ }
+ }
+
+#else
+ check("No tests executed - Locales not supported by this compiler", false);
+
+#endif //BOOST_DATE_TIME_NO_LOCALE
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/gregorian/testformat_date_parser.cpp b/libs/date_time/test/gregorian/testformat_date_parser.cpp
new file mode 100644
index 000000000..f29ab4ed2
--- /dev/null
+++ b/libs/date_time/test/gregorian/testformat_date_parser.cpp
@@ -0,0 +1,363 @@
+
+/* Copyright (c) 2004 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)
+ * Author: Jeff Garland
+ */
+
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include "boost/date_time/format_date_parser.hpp"
+#include <sstream>
+#include <algorithm>
+#include <iostream>
+
+const wchar_t* const wmonth_short_names[]={L"Jan",L"Feb",L"Mar",
+ L"Apr",L"May",L"Jun",
+ L"Jul",L"Aug",L"Sep",
+ L"Oct",L"Nov",L"Dec"};
+
+const char* const month_short_names[]={"Jan","Feb","Mar",
+ "Apr","May","Jun",
+ "Jul","Aug","Sep",
+ "Oct","Nov","Dec"};
+
+const char* const month_long_names[]={"January","February","March",
+ "April","May","June",
+ "July","August","September",
+ "October","November","December"};
+
+const wchar_t* const wmonth_long_names[]={L"January",L"February",L"March",
+ L"April",L"May",L"June",
+ L"July",L"August",L"September",
+ L"October",L"Novomber",L"December"};
+
+const wchar_t* const wweek_short_names[]= {L"Sun", L"Mon", L"Tue", L"Wed",
+ L"Thu", L"Fri", L"Sat"};
+
+const char* const week_short_names[]={"Sun", "Mon","Tue","Wed",
+ "Thu","Fri","Sat"};
+
+const wchar_t* const wweek_long_names[]= {L"Sunday", L"Monday", L"Tuesday",
+ L"Wednesday", L"Thursday",
+ L"Friday", L"Saturday"};
+
+const char* const week_long_names[]= {"Sunday", "Monday", "Tuesday",
+ "Wednesday", "Thursday",
+ "Friday", "Saturday"};
+
+
+
+
+std::vector<std::basic_string<char> > short_month_names;
+std::vector<std::basic_string<wchar_t> > wshort_month_names;
+std::vector<std::basic_string<char> > long_month_names;
+std::vector<std::basic_string<wchar_t> > wlong_month_names;
+std::vector<std::basic_string<char> > short_week_names;
+std::vector<std::basic_string<wchar_t> > wshort_week_names;
+std::vector<std::basic_string<char> > long_week_names;
+std::vector<std::basic_string<wchar_t> > wlong_week_names;
+
+
+using namespace boost::gregorian;
+
+void
+wtest_format(const std::basic_string<wchar_t>& format,
+ const std::basic_string<wchar_t>& value,
+ const std::string& testname,
+ boost::gregorian::date expected_res)
+{
+ typedef boost::date_time::format_date_parser<date, wchar_t> parser_type;
+ typedef std::basic_string<wchar_t> string_type;
+ typedef std::istreambuf_iterator<wchar_t> iter_type;
+ try {
+ // string_type format(format);
+ std::basic_stringstream<wchar_t> ws;
+ ws << value;
+ iter_type sitr(ws);
+ iter_type stream_end;
+
+ parser_type p(format, wshort_month_names, wlong_month_names,
+ wshort_week_names, wlong_week_names);
+ date d = p.parse_date(sitr, stream_end, format);
+ check_equal(testname, d, expected_res);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an exception: " << e.what() << std::endl;
+ check(testname, false);
+ }
+}
+
+
+void
+test_format(const std::basic_string<char>& format,
+ const std::basic_string<char>& value,
+ const std::string& testname,
+ boost::gregorian::date expected_res)
+{
+ typedef boost::date_time::format_date_parser<date, char> parser_type;
+ typedef std::basic_string<char> string_type;
+ typedef std::istreambuf_iterator<char> iter_type;
+ try {
+ string_type format(format);
+ std::basic_stringstream<char> ws;
+ ws << value;
+ iter_type sitr(ws);
+ iter_type stream_end;
+
+ parser_type pt(format, short_month_names, long_month_names,
+ short_week_names, long_week_names);
+ date d = pt.parse_date(sitr, stream_end, format);
+ check_equal(testname, d, expected_res);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an exception: " << e.what() << std::endl;
+ check(testname, false);
+ }
+}
+
+
+template<typename charT>
+void
+test_format2(boost::date_time::format_date_parser<date, charT>& parser,
+ const charT* const format,
+ const charT* const value,
+ const std::string& testname,
+ boost::gregorian::date expected_res)
+{
+ try {
+ date d = parser.parse_date(value, format);
+ check_equal(testname, d == expected_res);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an exception: " << e.what() << std::endl;
+ check(testname, false);
+ }
+}
+
+int
+main()
+{
+ std::copy(&wmonth_short_names[0],
+ &wmonth_short_names[12],
+ std::back_inserter(wshort_month_names));
+
+ std::copy(&month_short_names[0],
+ &month_short_names[12],
+ std::back_inserter(short_month_names));
+
+ std::copy(&month_long_names[0],
+ &month_long_names[12],
+ std::back_inserter(long_month_names));
+
+ std::copy(&wmonth_long_names[0],
+ &wmonth_long_names[12],
+ std::back_inserter(wlong_month_names));
+
+
+ std::copy(&wweek_short_names[0],
+ &wweek_short_names[7],
+ std::back_inserter(wshort_week_names));
+
+ std::copy(&week_short_names[0],
+ &week_short_names[7],
+ std::back_inserter(short_week_names));
+
+ std::copy(&wweek_long_names[0],
+ &wweek_long_names[7],
+ std::back_inserter(wlong_week_names));
+
+ std::copy(&week_long_names[0],
+ &week_long_names[7],
+ std::back_inserter(long_week_names));
+
+
+ wtest_format(L"1%%23%Y %m %d", L"1232004 12 31 other stuff...",
+ "wide and weird", date(2004,12,31));
+
+ wtest_format(L"%Y-%m-%d", L"2004-12-31",
+ "%Y-%m-%d wide", date(2004,12,31));
+
+ wtest_format(L"%Y day %j", L"2004 day 001",
+ "%Y day %j wide", date(2004,1,1));
+
+ test_format("%m/%d/%y", "10/31/04",
+ "%m/%d/%y", date(2004,10,31));
+
+
+ wtest_format(L"%Y/%m/%d", L"2004-12-31",
+ "%Y/%m/%d wide 2004-12-31 input", date(2004,12,31));
+
+ test_format("%Y.%d.%m", "2004.31.1",
+ "%Y.%d.%m var length", date(2004,Jan,31));
+
+ test_format("%d.%m.%Y", "1.1.2004",
+ "%d.%m.%Y var length month and day", date(2004,1,1));
+
+ test_format("%Y.%m.%d", "2004.1.31",
+ "%Y.%m.%d var length month", date(2004,Jan,31));
+
+ test_format("%Y.%b.%d", "2004.Jan.1",
+ "%Y.%b.%d var length month", date(2004,Jan,1));
+
+ test_format("%Y%m%d", "20041231",
+ "%Y%m%d undelimited", date(2004,12,31));
+
+ test_format("%Y/%d/%b", "2004/01/Jan",
+ "%Y/%d/%b month at end", date(2004,1,1));
+
+ test_format("%Y/%b/%d", "2004/Jan/01",
+ "%Y/%b/%d named month jan", date(2004,1,1));
+
+ test_format("%Y/%b/%d", "2004/Dec/20",
+ "%Y/%b/%d named month dec", date(2004,12,20));
+
+ wtest_format(L"%Y/%b/%d", L"2004-Jul-31",
+ "%Y/%b/%d wide 2004-Jul-31 input", date(2004,7,31));
+
+ wtest_format(L"%B %d, %Y", L"March 15, 2004",
+ "%B %d, %Y", date(2004,3,15));
+
+ wtest_format(L"%a %B %d, %Y", L"Sun March 15, 2004",
+ "%a %B %d, %Y", date(2004,3,15));
+
+ wtest_format(L"%A %B %d, %Y", L"Sunday March 15, 2004",
+ "%A %B %d, %Y", date(2004,3,15));
+
+ // bad format case...
+
+ {
+ try {
+ std::wstring format(L"%Y-%d");
+ std::wstringstream ws;
+ ws << L"2004-12-31";
+ std::istreambuf_iterator<wchar_t> sitr(ws);
+ std::istreambuf_iterator<wchar_t> stream_end;
+
+ boost::date_time::format_date_parser<date,wchar_t> pt(format,
+ wshort_month_names,
+ wlong_month_names,
+ wshort_week_names,
+ wlong_week_names);
+ date d = pt.parse_date(sitr, stream_end);
+ check("Bad format spec test", false);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an expected exception: " << e.what() << std::endl;
+ check("Bad format spec test -- pass", true);
+
+ }
+ }
+
+ {
+ //some interesting month names
+ const char* const roman_months[]={"I","II","III",
+ "IV","V","VI",
+ "VII","VIII","IX",
+ "X","XI","XII"};
+ std::vector<std::basic_string<char> > roman_month_names;
+ std::copy(&roman_months[0],
+ &roman_months[12],
+ std::back_inserter(roman_month_names));
+
+ std::string format("%Y.%b.%d");
+
+ boost::date_time::format_date_parser<date,char> parser(format,
+ roman_month_names,
+ long_month_names,
+ short_week_names,
+ long_week_names);
+
+
+ test_format2(parser, "%Y.%b.%d", "2004-I-1",
+ "roman I", date(2004,Jan,1));
+ test_format2(parser, "%Y.%b.%d", "2004-II-01",
+ "roman II", date(2004,Feb,1));
+ test_format2(parser, "%Y.%b.%d", "2004-III-01",
+ "roman III", date(2004,Mar,1));
+ test_format2(parser, "%Y.%b.%d", "2004-IV-01",
+ "roman IV", date(2004,Apr,1));
+ test_format2(parser, "%Y.%b.%d", "2004-V-01",
+ "roman V", date(2004,May,1));
+ test_format2(parser, "%Y.%b.%d", "2004-VI-01",
+ "roman VI", date(2004,Jun,1));
+ test_format2(parser, "%Y.%b.%d", "2004-VII-01",
+ "roman VII", date(2004,Jul,1));
+ test_format2(parser, "%Y.%b.%d", "2004-VIII-01",
+ "roman VIII", date(2004,Aug,1));
+ test_format2(parser, "%Y.%b.%d", "2004-IX-01",
+ "roman IX", date(2004,Sep,1));
+ test_format2(parser, "%Y.%b.%d", "2004-X-01",
+ "roman X", date(2004,Oct,1));
+ test_format2(parser, "%Y.%b.%d", "2004-XI-01",
+ "roman XI", date(2004,Nov,1));
+ test_format2(parser, "%Y.%b.%d", "2004 XII 1",
+ "roman XII", date(2004,Dec,1));
+
+ }
+
+ {
+ //alternate constructor that takes month/weekday strings
+ //from a locale
+ std::string format("%Y %m %d");
+ boost::date_time::format_date_parser<date,char> parser(format,
+ std::locale::classic());
+ test_format2(parser, "%a %Y.%b.%d", "Sun 2004 Jan 1",
+ "strings from locale", date(2004,Jan,1));
+ test_format2(parser, "%a %Y.%b.%d", "Mon 2004 Feb 1",
+ "strings from locale", date(2004,Feb,1));
+ test_format2(parser, "%a %Y.%b.%d", "Tue 2004 Mar 1",
+ "strings from locale", date(2004,Mar,1));
+ test_format2(parser, "%a %Y.%b.%d", "Wed 2004 Apr 1",
+ "strings from locale", date(2004,Apr,1));
+ test_format2(parser, "%a %Y.%b.%d", "thu 2004 May 1",
+ "strings from locale", date(2004,May,1));
+ test_format2(parser, "%a %Y.%b.%d", "fri 2004 Jun 1",
+ "strings from locale", date(2004,Jun,1));
+ test_format2(parser, "%a %Y.%b.%d", "sat 2004 Jul 1",
+ "strings from locale", date(2004,Jul,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Aug 1",
+ "strings from locale", date(2004,Aug,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Sep 1",
+ "strings from locale", date(2004,Sep,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Sep 1",
+ "strings from locale", date(2004,Sep,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Oct 1",
+ "strings from locale", date(2004,Oct,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Nov 1",
+ "strings from locale", date(2004,Nov,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Dec 1",
+ "strings from locale", date(2004,Dec,1));
+
+ test_format2(parser, "%A %B %d, %Y", "Sunday January 1, 2004",
+ "long strings from locale", date(2004,Jan,1));
+ test_format2(parser, "%A %B %d, %Y", "Monday February 29, 2004",
+ "long strings from locale", date(2004,Feb,29));
+ test_format2(parser, "%A %B %d, %Y", "Tuesday March 1, 2004",
+ "long strings from locale", date(2004,Mar,1));
+ test_format2(parser, "%A %B %d, %Y", "Wednesday APRIL 1, 2004",
+ "long strings from locale", date(2004,Apr,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday may 15, 2004",
+ "long strings from locale", date(2004,May,15));
+ test_format2(parser, "%A %B %d, %Y", "friday june 15, 2004",
+ "long strings from locale", date(2004,Jun,15));
+ test_format2(parser, "%A %B %d, %Y", "saturday july 30, 2004",
+ "long strings from locale", date(2004,Jul,30));
+ test_format2(parser, "%A %B %d, %Y", "thursday auguST 15, 2004",
+ "long strings from locale", date(2004,Aug,15));
+ test_format2(parser, "%A %B %d, %Y", "thursday september 1, 2004",
+ "long strings from locale", date(2004,Sep,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday october 1, 2004",
+ "long strings from locale", date(2004,Oct,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday november 1, 2004",
+ "long strings from locale", date(2004,Nov,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday december 31, 2004",
+ "long strings from locale", date(2004,Dec,31));
+
+ }
+
+ return printTestStats();
+
+}
diff --git a/libs/date_time/test/gregorian/testformatters.cpp b/libs/date_time/test/gregorian/testformatters.cpp
new file mode 100644
index 000000000..80d778c1f
--- /dev/null
+++ b/libs/date_time/test/gregorian/testformatters.cpp
@@ -0,0 +1,62 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+
+ boost::gregorian::date d1(2002,01,02);
+ std::string ds1 = boost::gregorian::to_simple_string(d1);
+ check("check string: " + ds1, ds1 == "2002-Jan-02");
+
+ std::string ids1(boost::gregorian::to_iso_string(d1));
+ // std::cout << boost::gregorian::to_iso_string(d1) << std::endl;
+ check("check iso normal: " + ids1, ids1 == "20020102");
+
+ std::string sds1 = boost::gregorian::to_sql_string(d1);
+ check("check sql string: "+sds1, sds1 == "2002-01-02");
+
+ boost::gregorian::date d2(2001,12,30);
+ std::string ds2 = boost::gregorian::to_simple_string(d2);
+ check("check string: "+ds2, ds2 == "2001-Dec-30");
+ std::string ids2 = boost::gregorian::to_iso_extended_string(d2);
+ check("check iso extended string: "+ids2, ids2 == "2001-12-30");
+
+ using namespace boost::gregorian;
+ date d3(neg_infin);
+ std::cout << "|" << to_simple_string(d3) << "|" << std::endl;
+ check("check negative infinity",
+ (to_simple_string(d3) == std::string("-infinity")));
+ date d4(pos_infin);
+ check("check positive infinity",
+ (to_simple_string(d4) == std::string("+infinity")));
+ date d5(not_a_date_time);
+ std::cout << to_simple_string(d5) << "|" << std::endl;
+ check("check not a date",
+ (to_simple_string(d5) == std::string("not-a-date-time")));
+
+ date_period p1(date(2000,Jan,1), date(2001,Jan,1));
+ check("check period format",
+ (to_simple_string(p1) == std::string("[2000-Jan-01/2000-Dec-31]")));
+ date_period p2(date(2000,Jan,1), date(pos_infin));
+ check("check period format",
+ (to_simple_string(p2) == std::string("[2000-Jan-01/+infinity]")));
+ std::cout << to_simple_string(p2) << std::endl;
+
+
+
+ // TODO enhance wchar support
+// std::wstringstream wss;
+// wss << d3 << std::endl;
+// std::wcout << d3;
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/gregorian/testgenerators.cpp b/libs/date_time/test/gregorian/testgenerators.cpp
new file mode 100644
index 000000000..8b1992492
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgenerators.cpp
@@ -0,0 +1,176 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <string>
+#include <sstream>
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+
+ partial_date pd1(1,Jan);
+ date d = pd1.get_date(2000);
+ check("Partial date to_string()", pd1.to_string() == std::string("0"));
+ check("Partial date getdate", date(2000,1,1) == d);
+ d = pd1.get_date(2001);
+ check("Partial date getdate", date(2001,1,1) == d);
+ partial_date pd2(1,Feb);
+ check("Partial date to_string()", pd2.to_string() == std::string("31"));
+ check("Partial date operator==", pd1 == pd1);
+ check("Partial date operator==", !(pd1 == pd2));
+ check("Partial date operator==", !(pd2 == pd1));
+ check("Partial date operator<", !(pd1 < pd1));
+ check("Partial date operator<", pd1 < pd2);
+ check("Partial date operator<", !(pd2 < pd1));
+
+ typedef last_day_of_the_week_in_month lastkday;
+
+ //Find last Sunday in Feb
+ lastkday lsif(Sunday, Feb);
+ std::cout << to_simple_string(lsif.get_date(2002)) << std::endl; //24th
+ check("Last kday", date(2002,Feb,24) == lsif.get_date(2002));
+ check("Last kday to_string()", lsif.to_string() == std::string("M2.5.0"));
+ lastkday ltif(Thursday, Feb);
+ check("Last kday", date(2002,Feb,28) == ltif.get_date(2002));
+ check("Last kday to_string()", ltif.to_string() == std::string("M2.5.4"));
+ lastkday lfif(Friday, Feb);
+ check("Last kday", date(2002,Feb,22) == lfif.get_date(2002));
+ check("Last kday to_string()", lfif.to_string() == std::string("M2.5.5"));
+
+ typedef first_day_of_the_week_in_month firstkday;
+
+ firstkday fsif(Sunday, Feb);
+ std::cout << to_simple_string(fsif.get_date(2002)) << std::endl; //24th
+ check("First kday", date(2002,Feb,3) == fsif.get_date(2002));
+ check("First kday to_string()", fsif.to_string() == std::string("M2.1.0"));
+ firstkday ftif(Thursday, Feb);
+ check("First kday", date(2002,Feb,7) == ftif.get_date(2002));
+ check("First kday to_string()", ftif.to_string() == std::string("M2.1.4"));
+ firstkday ffif(Friday, Feb);
+ check("First kday", date(2002,Feb,1) == ffif.get_date(2002));
+ check("First kday to_string()", ffif.to_string() == std::string("M2.1.5"));
+
+ typedef first_day_of_the_week_after firstkdayafter;
+ firstkdayafter fkaf(Monday);
+ std::cout << to_simple_string(fkaf.get_date(date(2002,Feb,1)))
+ << std::endl; //feb 4
+ check("kday after",date(2002,Feb,4) == fkaf.get_date(date(2002,Feb,1)));
+ firstkdayafter fkaf2(Thursday);
+ check("kday after",date(2002,Feb,7) == fkaf2.get_date(date(2002,Feb,1)));
+ check("kday after",date(2002,Feb,28)== fkaf2.get_date(date(2002,Feb,21)));
+
+ typedef first_day_of_the_week_before firstkdaybefore;
+ firstkdaybefore fkbf(Monday);
+ std::cout << to_simple_string(fkaf.get_date(date(2002,Feb,10)))
+ << std::endl; //feb 4
+ check("kday before",date(2002,Feb,4) == fkbf.get_date(date(2002,Feb,10)));
+ firstkdaybefore fkbf2(Thursday);
+ check("kday before",date(2002,Jan,31) == fkbf2.get_date(date(2002,Feb,1)));
+ check("kday before",date(2002,Feb,7)== fkbf2.get_date(date(2002,Feb,14)));
+
+ typedef nth_day_of_the_week_in_month nthkdayofmonth;
+ nthkdayofmonth nkd1(nthkdayofmonth::third, Sunday, Jul);
+ check("nth_kday 1", date(1969, Jul, 20) == nkd1.get_date(1969));
+ check("Nth kday to_string()", nkd1.to_string() == std::string("M7.3.0"));
+ nthkdayofmonth nkd2(nthkdayofmonth::second, Monday, Dec);
+ check("nth_kday 2", date(1980, Dec, 8) == nkd2.get_date(1980));
+ check("Nth kday to_string()", nkd2.to_string() == std::string("M12.2.1"));
+ nthkdayofmonth nkd3(nthkdayofmonth::fifth, Wednesday, Jan);
+ check("nth_kday fifth wed jan 2003 2003-Jan-29",
+ date(2003, Jan, 29) == nkd3.get_date(2003));
+ check("Nth kday to_string()", nkd3.to_string() == std::string("M1.5.3"));
+ nthkdayofmonth nkd4(nthkdayofmonth::fifth, Monday, Jan);
+ check("nth_kday fifth mon jan 2003 (actaully 4th) 2003-Jan-27",
+ date(2003, Jan, 27) == nkd4.get_date(2003));
+ check("Nth kday to_string()", nkd4.to_string() == std::string("M1.5.1"));
+
+ // greg date_generator functions tests
+ {
+ date sunday(2003,Feb,2),tuesday(2003,Feb,4);
+ date friday(2003,Feb,7),saturday(2003,Feb,8);
+ greg_weekday sat(Saturday), tue(Tuesday), fri(Friday), sund(Sunday);
+
+ check("Days until weekday" , days_until_weekday(saturday, sund) == days(1));
+ check("Days until weekday" , days_until_weekday(friday, tue) == days(4));
+ check("Days until weekday" , days_until_weekday(tuesday, fri) == days(3));
+ check("Days until weekday" , days_until_weekday(sunday, sat) == days(6));
+ check("Days until weekday" , days_until_weekday(sunday, sund) == days(0));
+ check("Days until weekday" , days_until_weekday(tuesday, tue) == days(0));
+
+ check("Days before weekday" , days_before_weekday(saturday, sund) == days(6));
+ check("Days before weekday" , days_before_weekday(friday, tue) == days(3));
+ check("Days before weekday" , days_before_weekday(tuesday, fri) == days(4));
+ check("Days before weekday" , days_before_weekday(sunday, sat) == days(1));
+ check("Days before weekday" , days_before_weekday(sunday, sund) == days(0));
+ check("Days before weekday" , days_before_weekday(tuesday, tue) == days(0));
+
+ check("Date of next weekday", next_weekday(saturday, sund)== date(2003,Feb,9));
+ check("Date of next weekday", next_weekday(friday, tue) == date(2003,Feb,11));
+ check("Date of next weekday", next_weekday(tuesday, fri) == date(2003,Feb,7));
+ check("Date of next weekday", next_weekday(sunday, sat) == date(2003,Feb,8));
+ check("Date of next weekday", next_weekday(sunday, sund) == sunday);
+ check("Date of next weekday", next_weekday(tuesday, tue) == tuesday);
+
+ check("Date of previous weekday", previous_weekday(saturday, sund)== date(2003,Feb,2));
+ check("Date of previous weekday", previous_weekday(friday, tue) == date(2003,Feb,4));
+ check("Date of previous weekday", previous_weekday(tuesday, fri) == date(2003,Jan,31));
+ check("Date of previous weekday", previous_weekday(sunday, sat) == date(2003,Feb,1));
+ check("Date of previous weekday", previous_weekday(sunday, sund) == sunday);
+ check("Date of previous weekday", previous_weekday(tuesday, tue) == tuesday);
+
+ }
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+#if !defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
+ //TODO: this is temporary condition -- don't force a failure...
+ // check("no streaming implemented for new facet", false);
+#else
+ // streaming tests...
+ std::stringstream ss("");
+ std::string s("");
+
+ ss.str("");
+ ss << pd1;
+ s = "01 Jan";
+ check("streaming partial_date", ss.str() == s);
+ std::cout << ss.str() << std::endl;
+
+ ss.str("");
+ ss << lsif;
+ s = "last Sun of Feb";
+ check("streaming last_kday_of_month", ss.str() == s);
+
+ ss.str("");
+ ss << fsif;
+ s = "first Sun of Feb";
+ check("streaming first_kday_of_month", ss.str() == s);
+
+ ss.str("");
+ ss << fkaf;
+ s = "Mon after";
+ check("streaming first_kday_after", ss.str() == s);
+
+ ss.str("");
+ ss << fkbf;
+ s = "Mon before";
+ check("streaming first_kday_before", ss.str() == s);
+
+ ss.str("");
+ ss << nkd1;
+ s = "third Sun of Jul";
+ check("streaming nth_kday", ss.str() == s);
+#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
+#endif // NO_LOCAL
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/gregorian/testgreg_cal.cpp b/libs/date_time/test/gregorian/testgreg_cal.cpp
new file mode 100644
index 000000000..43558a20c
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_cal.cpp
@@ -0,0 +1,135 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian/greg_calendar.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void
+test_greg_calendar()
+{
+ using namespace boost::gregorian;
+ check("Day of week 2000-09-24 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,24))==0);
+ check("Day of week 2000-09-25 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,25))==1);
+ check("Day of week 2000-09-26 == 2 (Tue)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,26))==2);
+ check("Day of week 2000-09-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,27))==3);
+ check("Day of week 2000-09-28 == 4 (Thu)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,28))==4);
+ check("Day of week 2000-09-29 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,29))==5);
+ check("Day of week 2000-09-30 == 6 (Sat)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,30))==6);
+ //see calendar FAQ 2.2 for reference
+ check("Day of week 1953-08-02 == 0 (Sun)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,2))==0);
+ check("Day of week 1953-08-03 == 1 (Mon)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,3))==1);
+ check("Day of week 1953-08-04 == 2 (Tue)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,4))==2);
+ check("Day of week 1953-08-05 == 3 (Wed)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,5))==3);
+ check("Day of week 1953-08-06 == 4 (Thu)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,6))==4);
+ check("Day of week 1953-08-07 == 5 (Fri)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,7))==5);
+ check("Day of week 1953-08-08 == 6 (Sat)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,8))==6);
+ check("Day of week 2001-08-31 == 5 (Fri)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2001,8,31))==5);
+
+ //Checked against Caledrical Calc M. Edition p 396 and www site
+ check("Day of week 1400-01-01 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1400,1,1))==3);
+ check("Day of week 1436-02-03 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1436,2,3))==3);
+ check("Day of week 1492-04-9 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1492,4,9))==6);
+ check("Day of week 1560-03-5 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1560,3,5))==6);
+ check("Day of week 1716-07-24 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1716,7,24))==5);
+ check("Day of week 1768-06-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1768,6,19))==0);
+ check("Day of week 1839-03-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1839,3,27))==3);
+ check("Day of week 1819-08-02 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1819,8,2))==1);
+ check("Day of week 1903-04-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1903,4,19))==0);
+ check("Day of week 1929-08-25 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1929,8,25))==0);
+ check("Day of week 2038-11-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2038,11,10))==3);
+ check("Day of week 2094-07-18 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2094,7,18))==0);
+ //verified against website applet
+ check("Day of week 3002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(3002,7,10))==6);
+ //verified against website applet
+ check("Day of week 4002-07-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(4002,7,10))==3);
+ //verified against website applet
+ check("Day of week 5002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(5002,7,10))==6);
+
+ check("1404 is a leap year", gregorian_calendar::is_leap_year(1404));
+ check("2000 is a leap year", gregorian_calendar::is_leap_year(2000));
+ check("2004 is a leap year", gregorian_calendar::is_leap_year(2004));
+ check("2400 is a leap year", gregorian_calendar::is_leap_year(2400));
+ check("4000 is a leap year", gregorian_calendar::is_leap_year(4000));
+ check("1400 is NOT a leap year", !gregorian_calendar::is_leap_year(1400));
+ check("1900 is NOT a leap year", !gregorian_calendar::is_leap_year(1900));
+ check("2100 is NOT a leap year", !gregorian_calendar::is_leap_year(2100));
+ check("1999 is NOT a leap year", !gregorian_calendar::is_leap_year(1999));
+ check("5000 is NOT a leap year", !gregorian_calendar::is_leap_year(5000));
+
+
+ unsigned long jday1 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,1,1));
+ unsigned long jday2 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2001,1,1));
+// unsigned short year, month, day;
+// //2451545 is 2000-1-1
+ check("ToDayNumber 2000-1-1 is day 2451545", jday1 == 2451545);
+ check("ToDayNumber 2001-1-1 is day 2451911", jday2 == 2451911);
+ gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(jday1);
+ check("from_day_number test 2000-1-1", (ymd.year==2000)&&
+ (ymd.month==1) &&
+ (ymd.day==1) );
+
+ unsigned long jday3 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(1999,1,1));
+ check("366 days between 2000-1-1 and 2001-1-1", (jday2-jday1) == 366);
+ check("731 days between 1999-1-1 and 2001-1-1 ",(jday2-jday3) == 731);
+
+ unsigned long jday4 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,2,28));
+ unsigned long jday5 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,3,1));
+ check("2 days between 2000-2-28 and 2000-3-1 ",(jday5-jday4) == 2);
+
+ check("31 days in month Jan 2000", gregorian_calendar::end_of_month_day(2000,1) == 31);
+ check("29 days in month Feb 2000", gregorian_calendar::end_of_month_day(2000,2) == 29);
+ check("28 days in month Feb 1999", gregorian_calendar::end_of_month_day(1999,2) == 28);
+ check("28 days in month Feb 2001", gregorian_calendar::end_of_month_day(2001,2) == 28);
+ check("31 days in month Mar 2000", gregorian_calendar::end_of_month_day(2000,3) == 31);
+ check("30 days in month Apr 2000", gregorian_calendar::end_of_month_day(2000,4) == 30);
+ check("31 days in month May 2000", gregorian_calendar::end_of_month_day(2000,5) == 31);
+ check("30 days in month Jun 2000", gregorian_calendar::end_of_month_day(2000,6) == 30);
+ check("31 days in month Jul 2000", gregorian_calendar::end_of_month_day(2000,7) == 31);
+ check("31 days in month Aug 2000", gregorian_calendar::end_of_month_day(2000,8) == 31);
+ check("30 days in month Sep 2000", gregorian_calendar::end_of_month_day(2000,9) == 30);
+ check("31 days in month Oct 2000", gregorian_calendar::end_of_month_day(2000,10) == 31);
+ check("30 days in month Nov 2000", gregorian_calendar::end_of_month_day(2000,11) == 30);
+ check("31 days in month Dec 2000", gregorian_calendar::end_of_month_day(2000,12) == 31);
+
+
+// unsigned long jday0 = date_limits<>::dayNumber(gregorian_calendar::ymd_type(1900,1,1));
+// std::cout << "Day 0: " << jday0 << std::endl;
+
+ std::cout << gregorian_calendar::epoch().year << std::endl;
+}
+
+
+int
+main()
+{
+ test_greg_calendar();
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/gregorian/testgreg_day.cpp b/libs/date_time/test/gregorian/testgreg_day.cpp
new file mode 100644
index 000000000..1cb5c4470
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_day.cpp
@@ -0,0 +1,91 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian/greg_day.hpp"
+#include "boost/date_time/gregorian/greg_weekday.hpp"
+#include "boost/date_time/gregorian/greg_day_of_year.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void
+test_day()
+{
+ using namespace boost::gregorian;
+ greg_day d1(1);
+ check("Basic test", d1 == 1);
+ try {
+ greg_day bad(0);
+ check("Bad day creation", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(std::exception &) {
+ check("Bad day creation", true); //good
+
+ }
+ try {
+ greg_day bad(32);
+ check("Bad day creation2", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(std::exception&) {
+ check("Bad day creation2", true); //good
+
+ }
+ check("traits min day", (greg_day::min)() == 1);
+ check("traits max day", (greg_day::max)() == 31);
+
+ greg_weekday sunday(0);
+ greg_weekday monday(1);
+
+ check("Weekday 0 short name == Sun",
+ sunday.as_short_string() == std::string("Sun"));
+ check("Weekday 1 short name == Mon",
+ monday.as_short_string() == std::string("Mon"));
+ check("Weekday 2 short name == Tue",
+ greg_weekday(2).as_short_string() == std::string("Tue"));
+ check("Weekday 3 short name == Wed",
+ greg_weekday(3).as_short_string() == std::string("Wed"));
+ check("Weekday 4 short name == Thu",
+ greg_weekday(4).as_short_string() == std::string("Thu"));
+ check("Weekday 5 short name == Fri",
+ greg_weekday(5).as_short_string() == std::string("Fri"));
+ check("Weekday 6 short name == Sat",
+ greg_weekday(6).as_short_string() == std::string("Sat"));
+ try {
+ greg_weekday bad(7);
+ check("Bad weekday creation", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(bad_weekday&) {
+ check("Bad weekday creation", true); //good
+
+ }
+
+ try {
+ greg_day_of_year_rep bad(367);
+ check("Bad day of year", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+
+ }
+ catch(bad_day_of_year&) {
+ check("Bad day of year", true); //good
+ }
+
+}
+
+int
+main()
+{
+ test_day();
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/gregorian/testgreg_durations.cpp b/libs/date_time/test/gregorian/testgreg_durations.cpp
new file mode 100644
index 000000000..67bf99d58
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_durations.cpp
@@ -0,0 +1,223 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+
+int main(){
+
+#if !defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+ // do not set this test to return fail -
+ // this is not necessarily a compiler problem
+ check("Optional gregorian types not selected - no tests run", true);
+#else
+
+ using namespace boost::gregorian;
+
+
+ /*** months ***/
+ {
+ months m1(5), m2(3), m3(1);
+ check("months & months addable", months(8) == m1 + m2);
+ m1 += m2;
+ check("months & months addable", months(8) == m1);
+ check("months & months subtractable", months(-5) == m2 - m1);
+ m2 -= m1;
+ check("months & months subtractable", months(-5) == m2);
+ {
+ // adding and subtracting negative values
+ date d1(2005, Jan, 1);
+ date d2(2005, Feb, 1);
+ check("add neg months (year wrap under)",
+ d1 + months(-1) == date(2004,Dec,1));
+ check("add neg months (no year wrap under)",
+ d2 + months(-1) == date(2005,Jan,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-2) == date(2004,Dec,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-12) == date(2004,Feb,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-13) == date(2004,Jan,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-14) == date(2003,Dec,1));
+ date d3(2005, Dec, 1);
+ date d4(2005, Nov, 1);
+ check("subtract neg months (year wrap over)",
+ d3 - months(-1) == date(2006,Jan,1));
+ check("subtract neg months (no year wrap over)",
+ d4 - months(-1) == date(2005,Dec,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-2) == date(2006,Jan,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-12) == date(2006,Nov,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-13) == date(2006,Dec,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-14) == date(2007,Jan,1));
+ }
+ {
+ months m1(5), m2(3), m3(10);
+ check("months & int multipliable", months(15) == m1 * 3);
+ m1 *= 3;
+ check("months & int multipliable", months(15) == m1);
+ //check("int * months", months(12) == 4 * m2);
+ check("months & int dividable", months(3) == m3 / 3);
+ m3 /= 3;
+ check("months & int dividable", months(3) == m3);
+ }
+ {
+ months m(-5), m_pos(pos_infin), m_neg(neg_infin), m_nadt(not_a_date_time);
+ check("months add special_values", m + m_pos == m_pos);
+ check("months add special_values", m + m_neg == m_neg);
+ check("months add special_values", m_pos + m_neg == m_nadt);
+ check("months add special_values", m_neg + m_neg == m_neg);
+ check("months subtract special_values", m - m_pos == m_neg);
+ check("months subtract special_values", m - m_neg == m_pos);
+ check("months subtract special_values", m_pos - m_neg == m_pos);
+ check("months special_values & int multipliable", m_pos * -1 == m_neg);
+ check("months special_values & int multipliable", m_pos * 0 == m_nadt);
+ check("months special_values & int dividable", m_neg / 3 == m_neg);
+ }
+
+ years y1(2), y2(4);
+ check("months & years addable", months(25) == m3 + y1);
+ m3 += y1;
+ check("months & years addable", months(25) == m3);
+ check("months & years subtractable", months(-23) == m3 - y2);
+ m3 -= y2;
+ check("months & years subtractable", months(-23) == m3);
+
+ {
+ date d(2001, Oct, 31);
+ check("date + months", date(2002, Feb, 28) == d + months(4));
+ d += months(4);
+ check("date += months", date(2002, Feb, 28) == d);
+ }
+ {
+ date d(2001, Oct, 31);
+ check("date - months", date(2001, Apr, 30) == d - months(6));
+ d -= months(6);
+ check("date -= months", date(2001, Apr, 30) == d);
+ }
+ }
+
+ /*** years ***/
+ {
+ years y1(2), y2(4), y3(1);
+ check("years & years addable", years(3) == y3 + y1);
+ y3 += y1;
+ check("years & years addable", years(3) == y3);
+ check("years & years subtractable", years(-1) == y3 - y2);
+ y3 -= y2;
+ check("years & years subtractable", years(-1) == y3);
+ {
+ years y1(5), y2(3), y3(10);
+ check("years & int multipliable", years(15) == y1 * 3);
+ y1 *= 3;
+ check("years & int multipliable", years(15) == y1);
+ //check("int * years", years(12) == 4 * y2);
+ check("years & int dividable", years(3) == y3 / 3);
+ y3 /= 3;
+ check("years & int dividable", years(3) == y3);
+ }
+ {
+ years m(15), y_pos(pos_infin), y_neg(neg_infin), y_nadt(not_a_date_time);
+ check("years add special_values", m + y_pos == y_pos);
+ check("years add special_values", m + y_neg == y_neg);
+ check("years add special_values", y_pos + y_neg == y_nadt);
+ check("years add special_values", y_neg + y_neg == y_neg);
+ check("years subtract special_values", m - y_pos == y_neg);
+ check("years subtract special_values", m - y_neg == y_pos);
+ check("years subtract special_values", y_pos - y_neg == y_pos);
+ check("years special_values & int multipliable", y_pos * -1 == y_neg);
+ check("years special_values & int multipliable", y_pos * 0 == y_nadt);
+ check("years special_values & int dividable", y_neg / 3 == y_neg);
+ }
+
+ months m1(5), m2(3);
+ check("years & months addable", months(51) == y2 + m2);
+ check("years & months subtractable", months(43) == y2 - m1);
+
+ {
+ date d(2001, Feb, 28); // not a leap year
+ check("date + years", date(2004, Feb, 29) == d + years(3));
+ d += years(3);
+ check("date += years", date(2004, Feb, 29) == d);
+ }
+ {
+ date d(2000, Feb, 29);
+ check("date - years", date(1994, Feb, 28) == d - years(6));
+ d -= years(6);
+ check("date -= years", date(1994, Feb, 28) == d);
+ }
+
+ }
+
+ /*** weeks ***/
+ // shouldn't need many tests, it is nothing more than a date_duration
+ // so all date_duration tests should prove this class
+ {
+ weeks w1(2), w2(4), w3(1), pi(pos_infin);
+ check("add special_values", weeks(pos_infin) == w1 + pi);
+ check("weeks & weeks addable", weeks(3) == w3 + w1);
+ w3 += w1;
+ check("weeks & weeks addable", weeks(3) == w3);
+ check("weeks & weeks subtractable", weeks(-1) == w3 - w2);
+ w3 -= w2;
+ check("weeks & weeks subtractable", weeks(-1) == w3);
+ {
+ days d(10);
+ check("days + weeks", days(31) == d + weeks(3));
+ d += weeks(3);
+ check("days += weeks", days(31) == d);
+ }
+ {
+ days d(10);
+ check("days - weeks", days(-32) == d - weeks(6));
+ d -= weeks(6);
+ check("days -= weeks", days(-32) == d);
+ }
+ {
+ date d(2001, Feb, 28);
+ check("date + weeks", date(2001, Mar, 21) == d + weeks(3));
+ d += weeks(3);
+ check("date += weeks", date(2001, Mar, 21) == d);
+ }
+ {
+ date d(2001, Feb, 28);
+ check("date - weeks", date(2001, Jan, 17) == d - weeks(6));
+ d -= weeks(6);
+ check("date -= weeks", date(2001, Jan, 17) == d);
+ }
+ }
+
+ {
+ date d(2000, Oct, 31);
+ date d2 = d + months(4) + years(2);
+ date d3 = d + years(2) + months(4);
+ check("date + years + months", date(2003,Feb,28) == d2);
+ check("date + years + months", date(2003,Feb,28) == d3);
+ months m = years(2) + months(4) - months(4) - years(2);
+ check("sanity check", m.number_of_months() == 0);
+ }
+ /*{
+ date d(2001, Mar, 31);
+ date d1 = (d - months(1)) + months(1); //Mar 28, right? WRONG
+ // Mar31 - 1 month is Feb28 (last day of month) so Feb28 + 1 month
+ // will be Mar31 (last day of month)
+ check("date + 1 months - 1 months", date(2001,Mar,28) == d1);
+ std::cout << d1 << std::endl;
+ //date d2 = (d - months(1)) + d; //compile error, right? RIGHT
+ //weeks w1 = weeks(1) + months(1); //compiler error, right? RIGHT
+ }*/
+
+#endif // BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
+
+ return printTestStats();
+
+}
diff --git a/libs/date_time/test/gregorian/testgreg_month.cpp b/libs/date_time/test/gregorian/testgreg_month.cpp
new file mode 100644
index 000000000..3e5db8fa9
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_month.cpp
@@ -0,0 +1,67 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian/greg_month.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void
+test_month()
+{
+ using namespace boost::gregorian;
+ greg_month m1(Jan), m2(Feb), m3(Mar), m4(Apr), m5(May), m6(Jun);
+ greg_month m7(Jul), m8(Aug), m9(Sep), m10(Oct), m11(Nov),m12(Dec);
+ check("January as_number", m1.as_number() == 1);
+ check("December as_number", m12.as_number() == 12);
+ check("Jan as Short String", m1.as_short_string() == std::string("Jan"));
+ check("Feb as Short String", m2.as_short_string() == std::string("Feb"));
+ check("Mar as Short String", m3.as_short_string() == std::string("Mar"));
+ check("Apr as Short String", m4.as_short_string() == std::string("Apr"));
+ check("May as Short String", m5.as_short_string() == std::string("May"));
+ check("Jun as Short String", m6.as_short_string() == std::string("Jun"));
+ check("Jul as Short String", m7.as_short_string() == std::string("Jul"));
+ check("Aug as Short String", m8.as_short_string() == std::string("Aug"));
+ check("Sep as Short String", m9.as_short_string() == std::string("Sep"));
+ check("Oct as Short String", m10.as_short_string() == std::string("Oct"));
+ check("Nov as Short String", m11.as_short_string() == std::string("Nov"));
+ check("Dec as Short String", m12.as_short_string() == std::string("Dec"));
+ check("Jan as Long String", m1.as_long_string() == std::string("January"));
+ check("Feb as Long String", m2.as_long_string() == std::string("February"));
+ check("Mar as Long String", m3.as_long_string() == std::string("March"));
+ check("Apr as Long String", m4.as_long_string() == std::string("April"));
+ check("May as Long String", m5.as_long_string() == std::string("May"));
+ check("Jun as Long String", m6.as_long_string() == std::string("June"));
+ check("Jul as Long String", m7.as_long_string() == std::string("July"));
+ check("Aug as Long String", m8.as_long_string() == std::string("August"));
+ check("Sep as Long String", m9.as_long_string() == std::string("September"));
+ check("Oct as Long String", m10.as_long_string() == std::string("October"));
+ check("Nov as Long String", m11.as_long_string() == std::string("November"));
+ check("Dec as Long String", m12.as_long_string() == std::string("December"));
+ //month m(5);
+
+ //TODO can this support NAM? or check exception
+ // greg_month sm0(0);
+ greg_month sm1(1);
+ greg_month sm12(12);
+ //check("check not a month value", sm0.as_short_string() == "NAM");
+ check("short construction -- 1",
+ sm1.as_short_string() == std::string("Jan"));
+ check("short construction -- 12",
+ sm12.as_short_string() == std::string("Dec"));
+ check("month traits min", (greg_month::min)() == 1);
+ check("month traits max", (greg_month::max)() == 12);
+
+}
+
+int
+main()
+{
+ test_month();
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/gregorian/testgreg_serialize.cpp b/libs/date_time/test/gregorian/testgreg_serialize.cpp
new file mode 100644
index 000000000..36a00e14e
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_serialize.cpp
@@ -0,0 +1,185 @@
+/* Copyright (c) 2002-2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/gregorian/greg_serialize.hpp>
+#include "../testfrmwk.hpp"
+#include <sstream>
+
+using namespace boost;
+using namespace gregorian;
+
+template<class archive_type, class temporal_type>
+void save_to(archive_type& ar, const temporal_type& tt)
+{
+ ar << tt;
+}
+
+int main(){
+ std::ostringstream oss;
+
+ // NOTE: DATE_TIME_XML_SERIALIZE is only used in testing and is
+ // defined in the testing Jamfile
+#if defined(DATE_TIME_XML_SERIALIZE)
+ std::cout << "Running xml archive tests" << std::endl;
+ archive::xml_oarchive oa(oss);
+#else
+ std::cout << "Running text archive tests" << std::endl;
+ archive::text_oarchive oa(oss);
+#endif
+
+ date d(2002,Feb,12);
+ date sv_d1(not_a_date_time);
+ date sv_d2(pos_infin);
+ date_duration dd(11);
+ date_duration sv_dd(neg_infin);
+ date_period dp(d,dd);
+ greg_year gy(1959);
+ greg_month gm(Feb);
+ greg_day gd(14);
+ greg_weekday gwd(Friday);
+ partial_date pd(26,Jul);
+ nth_kday_of_month nkd(nth_kday_of_month::second,Tuesday,Mar);
+ first_kday_of_month fkd(Saturday,Apr);
+ last_kday_of_month lkd(Saturday,Apr);
+ first_kday_before fkdb(Thursday);
+ first_kday_after fkda(Thursday);
+
+ // load up the archive
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ save_to(oa, BOOST_SERIALIZATION_NVP(d));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_d1));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_d2));
+ save_to(oa, BOOST_SERIALIZATION_NVP(dd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_dd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(dp));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gy));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gm));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gwd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(pd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(nkd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(fkd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(lkd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(fkdb));
+ save_to(oa, BOOST_SERIALIZATION_NVP(fkda));
+#else
+ save_to(oa, d);
+ save_to(oa, sv_d1);
+ save_to(oa, sv_d2);
+ save_to(oa, dd);
+ save_to(oa, sv_dd);
+ save_to(oa, dp);
+ save_to(oa, gy);
+ save_to(oa, gm);
+ save_to(oa, gd);
+ save_to(oa, gwd);
+ save_to(oa, pd);
+ save_to(oa, nkd);
+ save_to(oa, fkd);
+ save_to(oa, lkd);
+ save_to(oa, fkdb);
+ save_to(oa, fkda);
+#endif
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error writing to archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+
+ std::istringstream iss(oss.str());
+#if defined(DATE_TIME_XML_SERIALIZE)
+ archive::xml_iarchive ia(iss);
+#else
+ archive::text_iarchive ia(iss);
+#endif
+
+ // read from the archive
+ date d2(not_a_date_time);
+ date sv_d3(min_date_time);
+ date sv_d4(min_date_time);
+ date_duration dd2(not_a_date_time);
+ date_duration sv_dd2(0);
+ date_period dp2(date(2000,Jan,1),date_duration(1));
+ greg_year gy2(1960);
+ greg_month gm2(Jan);
+ greg_day gd2(1);
+ greg_weekday gwd2(Monday);
+ partial_date pd2(1);
+ nth_kday_of_month nkd2(nth_kday_of_month::first,Monday,Jan);
+ first_kday_of_month fkd2(Monday,Jan);
+ last_kday_of_month lkd2(Monday,Jan);
+ first_kday_before fkdb2(Monday);
+ first_kday_after fkda2(Monday);
+
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ ia >> BOOST_SERIALIZATION_NVP(d2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_d3);
+ ia >> BOOST_SERIALIZATION_NVP(sv_d4);
+ ia >> BOOST_SERIALIZATION_NVP(dd2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_dd2);
+ ia >> BOOST_SERIALIZATION_NVP(dp2);
+ ia >> BOOST_SERIALIZATION_NVP(gy2);
+ ia >> BOOST_SERIALIZATION_NVP(gm2);
+ ia >> BOOST_SERIALIZATION_NVP(gd2);
+ ia >> BOOST_SERIALIZATION_NVP(gwd2);
+ ia >> BOOST_SERIALIZATION_NVP(pd2);
+ ia >> BOOST_SERIALIZATION_NVP(nkd2);
+ ia >> BOOST_SERIALIZATION_NVP(fkd2);
+ ia >> BOOST_SERIALIZATION_NVP(lkd2);
+ ia >> BOOST_SERIALIZATION_NVP(fkdb2);
+ ia >> BOOST_SERIALIZATION_NVP(fkda2);
+#else
+ ia >> d2;
+ ia >> sv_d3;
+ ia >> sv_d4;
+ ia >> dd2;
+ ia >> sv_dd2;
+ ia >> dp2;
+ ia >> gy2;
+ ia >> gm2;
+ ia >> gd2;
+ ia >> gwd2;
+ ia >> pd2;
+ ia >> nkd2;
+ ia >> fkd2;
+ ia >> lkd2;
+ ia >> fkdb2;
+ ia >> fkda2;
+#endif
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error reading from archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+
+ check("date", d == d2);
+ check("special_value date (nadt)", sv_d1 == sv_d3);
+ check("special_value date (pos_infin)", sv_d2 == sv_d4);
+ check("date_duration", dd == dd2);
+ check("special_value date_duration (neg_infin)", sv_dd == sv_dd2);
+ check("date_period", dp == dp2);
+ check("greg_year", gy == gy2);
+ check("greg_month", gm == gm2);
+ check("greg_day", gd == gd2);
+ check("greg_weekday", gwd == gwd2);
+ check("date_generator: partial_date", pd == pd2);
+ check("date_generator: nth_kday_of_month", nkd.get_date(2002) == nkd2.get_date(2002)); // no operator== for nth_kday_of_week - yet
+ check("date_generator: first_kday_of_month", fkd.get_date(2002) == fkd2.get_date(2002)); // no operator== for first_kday_of_week - yet
+ check("date_generator: last_kday_of_month", lkd.get_date(2002) == lkd2.get_date(2002)); // no operator== for last_kday_of_week - yet
+ check("date_generator: first_kday_before", fkdb.get_date(d) == fkdb2.get_date(d)); // no operator== for first_kday_before - yet
+ check("date_generator: first_kday_after", fkda.get_date(d) == fkda2.get_date(d)); // no operator== for first_kday_after - yet
+
+ return printTestStats();
+}
diff --git a/libs/date_time/test/gregorian/testgreg_wstream.cpp b/libs/date_time/test/gregorian/testgreg_wstream.cpp
new file mode 100644
index 000000000..d1f234a75
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_wstream.cpp
@@ -0,0 +1,178 @@
+/* Copyright (c) 2003-2004 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)
+ * Author: Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+#include <iostream>
+#include <sstream>
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include "../testfrmwk.hpp"
+
+using namespace boost::gregorian;
+
+int main(){
+#if defined(BOOST_NO_STD_WSTRING) || \
+ defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+ check("No wstring/wstream support for this compiler", false);
+#else
+ std::wstring res, ws;
+ std::wstringstream wss;
+ /* date_period is used because almost all the date-type objects
+ * that have the operator<< can be easily accessed from it.
+ * Those are: date, greg_month, greg_day_of_week,
+ * date_period, date_duration (also date_generators) */
+ date_period dp(date(2003,Aug,21), date(2004,May,27));
+
+
+ // date
+ wss << dp.begin();
+ res = L"2003-Aug-21";
+ check("date operator<<", wss.str() == res);
+ wss.str(L"");
+ ws = to_simple_wstring(dp.begin());
+ check("date to_simple_string", ws == res);
+ ws = to_iso_wstring(dp.begin());
+ res = L"20030821";
+ check("date to_iso_string", ws == res);
+ ws = to_iso_extended_wstring(dp.begin());
+ res = L"2003-08-21";
+ check("date to_iso_extended_string", ws == res);
+ ws = to_sql_wstring(dp.begin());
+ check("date to_sql_string", ws == res);
+ wss.str(L"");
+#ifndef BOOST_NO_STD_ITERATOR_TRAITS
+ {
+ res = L"2003-Aug-21";
+ std::wstringstream wss(L"2003-Aug-21");
+ date testdate(not_a_date_time);
+ wss >> testdate;
+ check("date operator>>", to_simple_wstring(testdate) == res);
+ }
+#else
+ check("no date operator>> for this compiler", false);
+#endif
+
+ // greg_month
+ wss << dp.begin().month();
+ res = L"08";
+ check("greg_month", wss.str() == res);
+ wss.str(L"");
+ ws = dp.begin().month().as_short_wstring();
+ res = L"Aug";
+ check("greg_month as_short_wstring", ws == res);
+ ws = dp.begin().month().as_long_wstring();
+ res = L"August";
+ check("greg_month as_long_wstring", ws == res);
+ /*{
+ std::wstringstream wss(L"August");
+ greg_month testmonth(not_a_date_time);
+ wss >> testmonth;
+ check("greg_month operator>>", to_simple_wstring(testmonth) == res);
+ }*/
+
+ // greg_day_of_week
+ wss << dp.begin().day_of_week();
+ res = L"Thu";
+ check("greg_day_of_week", wss.str() == res);
+ wss.str(L"");
+ ws = dp.begin().day_of_week().as_short_wstring();
+ check("greg_day_of_week as_short_wstring", ws == res);
+ ws = dp.begin().day_of_week().as_long_wstring();
+ res = L"Thursday";
+ check("greg_day_of_week as_long_wstring", ws == res);
+ /*{
+ std::wstringstream wss(L"Thu");
+ greg_day_of_week testday(not_a_date_time);
+ wss >> testday;
+ check("greg_day_of_week operator>>", to_simple_wstring(testday) == res);
+ }*/
+
+ // date_period
+ wss << dp;
+ res = L"[2003-Aug-21/2004-May-26]";
+ check("date_period", wss.str() == res);
+ wss.str(L"");
+ ws = to_simple_wstring(dp);
+ check("date_period to_simple_string", ws == res);
+ res = L"20030821/20040526";
+ ws = to_iso_wstring(dp);
+ check("date_period to_iso_string", ws == res);
+ {
+ std::wstringstream wss(L"[2003-Aug-21/2004-May-27]");
+ res = L"[2003-Aug-21/2004-May-26]";
+ // following line gives an ambiguous overload of op>>
+ //date_period testperiod(date(not_a_date_time),date_duration(not_a_date_time));
+ date_period testperiod(date(2003,Aug,21), date(2004,May,27));
+ wss >> testperiod;
+ check("date_period operator>>", to_simple_wstring(testperiod) == res);
+ }
+
+ // date_duration
+ wss << dp.length();
+ res = L"280";
+ check("date_duration", wss.str() == res);
+ wss.str(L"");
+ {
+ std::wstringstream wss(L"280");
+ date_duration testduration(not_a_date_time);
+ wss >> testduration;
+ check("date_duration operator>>", testduration.days() == 280);
+ }
+
+ // special values
+ date sv_d(neg_infin);
+ date_duration sv_dd(pos_infin);
+ //date_period sv_dp(sv_d,sv_dd);
+ // sv-date
+ wss << sv_d;
+ res = L"-infinity";
+ check("date operator<< special value", wss.str() == res);
+ wss.str(L"");
+ ws = to_simple_wstring(sv_d);
+ check("date to_simple_string special value", ws == res);
+ // sv-date_duration
+ wss << sv_dd;
+ res = L"+infinity";
+ check("date_duration operator<< special value", wss.str() == res);
+ wss.str(L"");
+ // sv-date_period
+ /*
+ * works - just gives unexpected results:
+ *[-infinity/not-a-date-time]
+ wss << sv_dp;
+ res = L"[2003-Aug-21/2004-May-26]";
+ check("date_period", wss.str() == res);
+ std::wcout << wss.str() << std::endl;
+ wss.str(L"");
+ */
+
+ // date_generators
+ first_day_of_the_week_after fka(Monday);
+ wss << fka;
+ res = L"Mon after";
+ check("first_kday_after", wss.str() == res);
+ wss.str(L"");
+
+ first_day_of_the_week_before fkb(Monday);
+ wss << fkb;
+ res = L"Mon before";
+ check("first_kday_before", wss.str() == res);
+ wss.str(L"");
+
+ first_day_of_the_week_in_month fkom(Monday,Jan);
+ wss << fkom;
+ res = L"first Mon of Jan";
+ check("first_kday_of_month", wss.str() == res);
+ wss.str(L"");
+
+ last_day_of_the_week_in_month lkom(Monday,Jan);
+ wss << lkom;
+ res = L"last Mon of Jan";
+ check("last_kday_of_month", wss.str() == res);
+ wss.str(L"");
+
+#endif
+ return printTestStats();
+}
diff --git a/libs/date_time/test/gregorian/testgreg_year.cpp b/libs/date_time/test/gregorian/testgreg_year.cpp
new file mode 100644
index 000000000..1ae0709c1
--- /dev/null
+++ b/libs/date_time/test/gregorian/testgreg_year.cpp
@@ -0,0 +1,48 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian/greg_year.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ greg_year d1(1400);
+ check("Basic of min", d1 == 1400);
+ greg_year d2(10000);
+ check("Basic test of max", d2 == 10000);
+ try {
+ greg_year bad(0);
+ check("Bad year creation", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(std::exception &) {
+ check("Bad year creation", true); //good
+
+ }
+ try {
+ greg_year bad(10001);
+ check("Bad year creation2", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(std::exception&) {
+ check("Bad year creation2", true); //good
+
+ }
+ check("traits min year", (greg_year::min)() == 1400);
+ check("traits max year", (greg_year::max)() == 10000);
+
+ printTestStats();
+ return 0;
+}
+
diff --git a/libs/date_time/test/gregorian/testparse_date.cpp b/libs/date_time/test/gregorian/testparse_date.cpp
new file mode 100644
index 000000000..3612280a2
--- /dev/null
+++ b/libs/date_time/test/gregorian/testparse_date.cpp
@@ -0,0 +1,367 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include "boost/lexical_cast.hpp"
+#include <iostream>
+#include <string>
+
+// missing or misspelled parts of date string tests
+// 'output_str' will be overwritten with what() from caught exception
+bool failure_tests(std::string date_spec,
+ std::string& output_str)
+{
+ using namespace boost::gregorian;
+ bool result = false;
+ date d(not_a_date_time);
+ try {
+ d = from_simple_string(date_spec);
+ }
+ catch(bad_year& by){ // ex: "205-Jan-15"
+ result = true;
+ output_str = by.what();
+ }
+ catch(bad_month& bm){ // ex: "2005-Jsn-15"
+ result = true;
+ output_str = bm.what();
+ }
+ catch(bad_day_of_month& bd){ // ex: "2005-Jan-51"
+ result = true;
+ output_str = bd.what();
+ }
+ catch(...){
+ // test failed - unexpected exception, leave result set to false
+ }
+ return result;
+}
+
+int
+main()
+{
+
+
+// Examples from 8601
+// Full date
+// Extended CCYY-MM-DD
+ std::string s("2001-10-5");
+
+ //This one aborts gcc2.95.3 on mandrake 8.1 linux with
+ //bad lexical cast?
+ try {
+ boost::gregorian::date d(boost::gregorian::from_string(s));
+ check("check year", d.year() == 2001);
+ check("check month", d.month() == 10);
+ check("check day", d.day() == 5);
+ }
+ catch(std::exception& e) {
+ check("parse 2001-10-5", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ {
+ using namespace boost::gregorian;
+ // date objects from strings & strings to date objects
+ date d(2000, 2, 29);
+ date d2 = from_string("2000-2-29");
+ check("2000-2-29", d2 == d);
+ date d3 = from_string("2000-FEB-29");
+ check("2000-FEB-29 (uppercase)", d3 == d);
+ date d4 = from_string("2000-february-29");
+ check("2000-february-29 (lowercase)", d4 == d);
+ date d5 = from_string(to_simple_string(d));
+ check("date to string to date", d5 == d);
+ date d6 = from_string(to_iso_extended_string(d));
+ check("date to string to date", d6 == d);
+ date d7 = from_us_string("Feb-29-2000");
+ check("date from month-day-year string", d7 == d);
+ date d8 = from_uk_string("29-Feb-2000");
+ check("date from day-month-year string", d8 == d);
+ {
+ std::string s("20050229"); // no Feb-29 in 2005
+ date d(not_a_date_time);
+ try {
+ d = date_from_iso_string(s);
+ check("Expected exception not thrown: from ISO string (bad_day_of_month)", false);
+ std::cout << date_from_iso_string(s) << std::endl;
+ }
+ catch(bad_day_of_month& e) {
+ check("Caught expected exception: bad_day_of_month ", true);
+ }
+ catch(...) {
+ check("Caught unexpected exception", false);
+ }
+/* not currently passing due to a bug in boost::offset_separator (reported 2005-Aug-02)
+ s = "2005022"; // missing a digit
+ try {
+ d = date_from_iso_string(s);
+ check("Expected exception not thrown: from ISO string (missing digit)", false);
+ std::cout << date_from_iso_string(s) << std::endl;
+ }
+ catch(bad_day_of_month& e) {
+ check("Caught expected exception: bad_day_of_month ", true);
+ }
+ catch(...) {
+ check("Caught unexpected exception", false);
+ }
+ */
+ s = "20050228"; // now it's correct
+ d = date_from_iso_string(s);
+ check("from ISO string", date(2005,Feb,28) == d);
+ }
+
+ date d9 = from_us_string(__DATE__);
+ std::cout << "Today's date: " << to_simple_string(d9) << std::endl;
+ date d10 = from_us_string("Feb 29, 2000");
+ std::cout << "With comma: " << to_simple_string(d10) << std::endl;
+ check("american date with comma: Feb 29, 2000 ", d10 == d);
+
+ date d11 = from_us_string("feb 29 2000");
+ check("american date with comma: feb 29 2000 ", d11 == d);
+
+ // test for missing or misspelled date spec components
+ std::string output_str("unexpected exception caught");
+ check("Year misspelled/out of range: " + output_str,
+ failure_tests("205-Jan-15", output_str));
+ output_str = "unexpected exception caught";
+ check("Month misspelled: " + output_str,
+ failure_tests("2005-Jsn-15", output_str));
+ output_str = "unexpected exception caught";
+ check("Day out of range: " + output_str,
+ failure_tests("2005-Jan-55", output_str));
+ output_str = "unexpected exception caught";
+ check("Missing month and day: " + output_str,
+ failure_tests("2005", output_str));
+ output_str = "unexpected exception caught";
+ check("Missing day: " + output_str,
+ failure_tests("2005-Jan", output_str));
+
+
+#if defined(BOOST_DATE_TIME_NO_LOCALE) || defined(BOOST_NO_STD_ITERATOR_TRAITS) || !defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
+
+ //TODO -- all these PRE_1_33 exclusions need to be removed. In the meantime, don't make
+ //this stuff fail.
+#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
+ check("input streaming for date not available", false); // force a failure
+#endif
+#else
+ {
+ std::stringstream ss("2000-2-29");
+ ss >> d2;
+ check("2000-2-29 stream-in", d2 == d);
+ }
+ {
+ std::stringstream ss("2000-FEB-29");
+ ss >> d2;
+ //std::cout << d2 << std::endl;
+ check("2000-FEB-29 stream-in (uppercase)", d2 == d);
+ }
+ {
+ std::stringstream ss("2000-february-29");
+ ss >> d2;
+ check("2000-february-29 stream-in (lowercase)", d2 == d);
+ }
+ // the removed (3) tests require a stream manipulator for date_order
+ // and date_separator (not yet implemented)
+ /*{
+ std::stringstream ss("Feb-29-2000");
+ ss >> d2;
+ check("date from month-day-year string stream-in", d2 == d);
+ }
+ {
+ std::stringstream ss("29-Feb-2000");
+ ss >> d2;
+ check("date from day-month-year string stream-in", d2 == d);
+ }
+ {
+ std::stringstream ss("Feb 29, 2000");
+ ss >> d2;
+ check("american date with comma: Feb 29, 2000 stream-in", d2 == d);
+ }*/
+#endif //BOOST_DATE_TIME_NO_LOCALE
+
+
+
+ // check proper range
+ d = date(2001, 1, 1);
+ d2 = from_string("2001-Jan-1");
+ d3 = from_string("2001-January-1");
+ check("January", d == d2);
+ check("January", d == d3);
+ d = date(2001, 12, 1);
+ d2 = from_string("2001-Dec-1");
+ d3 = from_string("2001-December-1");
+ check("December", d == d2);
+ check("December", d == d3);
+#if defined(BOOST_NO_STD_ITERATOR_TRAITS)
+ check("date from stream not available: no std iterator traits", false);
+#else
+ // from stream
+ d = date(2000, 10, 31);
+ std::stringstream ss("");
+ ss << "2000-Oct-31 is Halloween 2k!";
+ std::istream_iterator<std::string> iter(ss), eos;
+ check("from stream - stringstream", d == from_stream(iter, eos));
+#if !(defined(BOOST_NO_STD_WSTRING))
+#if !(defined(BOOST_DATE_TIME_NO_WISTREAM_ITERATOR))
+ std::wstringstream ws;
+ ws << "2000-Oct-31 is Halloween 2k!";
+ std::istream_iterator<std::wstring, wchar_t> witer(ws), weos;
+ check("from stream - wstringstream", d == from_stream(witer, weos));
+#endif // NO_WSTREAM_ITERATOR
+#endif // BOOST_NO_WSTRING
+ char d2_string[] = {"2000-10-31 is Halloween 2k!"};
+ char* end = d2_string + sizeof(d2_string) - 1;
+ check("from stream - char[]", d == from_stream(d2_string, end));
+
+ std::string s1_string("2000-Oct-31 is Halloween 2k!");
+ std::string::iterator s1_start = s1_string.begin();
+ std::string::iterator s1_end = s1_string.end();
+ check("from stream - string", d == from_stream(s1_start, s1_end));
+#ifndef BOOST_NO_STD_WSTRING
+ std::wstring w1_string(boost::lexical_cast<std::wstring>("2000-Oct-31 is Halloween 2k!"));
+ std::wstring::iterator w1_start = w1_string.begin();
+ std::wstring::iterator w1_end = w1_string.end();
+ check("from stream - wstring", d == from_stream(w1_start, w1_end));
+#endif // BOOST_NO_STD_WSTRING
+#endif // BOOST_NO_STD_ITERATOR_TRAITS
+ /* date objects from strings & strings to date objects
+ * with misspelled months */
+ try {
+ date bd = from_string("2002-Jull-4");
+ std::cout << "Shouldn't be reached." <<
+ boost::gregorian::to_simple_string(bd) << std::endl;
+ }
+ catch(boost::gregorian::bad_month&){
+ check("bad spelling 'Jull'", true);
+ }
+ catch(std::exception& e){
+ check("bad spelling", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+ }
+
+
+ try {
+ std::string s2("2001-12-41"); //oops should be 31
+ boost::gregorian::date bad_day(boost::gregorian::from_string(s2)); //won't construct
+ check("check bad day", false);
+ //The line below won't execute, but make the compiler think
+ //we are using bad day....
+ std::cout << "Oh oh, this shouldn't be reached: "
+ << boost::gregorian::to_iso_string(bad_day) << std::endl;
+
+ }
+ catch(boost::gregorian::bad_day_of_month&) { //expected
+ check("check bad day", true);
+ }
+ catch(std::exception& e) {
+ //oops wrong exception
+ check("check bad day", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ try {
+ std::string s2("2001-02-29"); //oops should be 28
+ boost::gregorian::date bad_day(boost::gregorian::from_string(s2)); //won't construct
+ check("check bad leap year", false);
+ //The line below won't execute, but make the compiler think
+ //we are using bad day....
+ std::cout << "Oh oh, this shouldn't be reached: "
+ << boost::gregorian::to_iso_string(bad_day) << std::endl;
+
+ }
+ catch(boost::gregorian::bad_day_of_month&) { //expected
+ check("check bad leap year", true);
+ }
+ catch(std::exception& e) {
+ //oops wrong exception
+ check("check bad leap year", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ try {
+ std::string s2("2001-14-1"); //oops should be <= 12
+ boost::gregorian::date bad_month(boost::date_time::parse_date<boost::gregorian::date>(s2));
+ check("check bad month", false); //fail the test
+ //The line below won't execute, but make the compiler think
+ //we are using bad day....
+ std::cout << "Oh oh, this shouldn't be reached: "
+ << boost::gregorian::to_iso_string(bad_month) << std::endl;
+
+ }
+ catch(boost::gregorian::bad_month&) { //expected
+ check("check bad month", true);
+ }
+ catch(std::exception& e) {
+ //oops wrong exception
+ check("check bad month", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ //This one aborts gcc2.95.3 on mandrake 8.1 linux with
+ //bad lexical cast?
+ try {
+ //Example of ISO Standard -- CCYYMMDD
+ using namespace boost::gregorian;
+ std::string ud("20011009"); //2001-Oct-09
+ date d1(boost::gregorian::from_undelimited_string(ud));
+ // std::cout << to_string(d1) << std::endl;
+ check("undelimited date string", d1 == date(2001,Oct,9));
+
+
+ std::string ad("2001/10/09");
+ date d2(boost::date_time::parse_date<date>(ad));
+ check("check american date", d2 == date(2001,Oct,9));
+ }
+ catch(std::exception& e) {
+ check("more parsing", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ using namespace boost::gregorian;
+ std::string s2("2003-07-28");
+ date d2(from_string(s2));
+ check("check date", d2.month() == 7 &&
+ d2.year() == 2003 &&
+ d2.day() == 28);
+// std::string s1("2001-Oct-5");
+// gregorian::date d1(parse_date<gregorian::date>(s1));
+// check("check month", d1.month() == 10);
+
+
+ //Check that the from_string and to_string can be reversed
+ date d10(2003, 10, 19);
+ std::string d10s = to_simple_string(d10);
+ date d11 = from_simple_string(d10s);
+ check("to from string inversion", d10 == d11);
+
+ try {
+ using namespace boost::gregorian;
+ std::string ud(""); //empty string error sf bug# 1155556
+ date d1(from_simple_string(ud));
+ check("empty string", false); //should never reach this piont
+ }
+ catch(std::exception& e) {
+ check(std::string("empty string parse (exception expected): ") + e.what(), true);
+ }
+
+
+//Calendar Week + Day Number
+// CCYYWwwDThhmmss
+// 1986W105T
+// week == 10 day=5
+// see page 5
+
+
+//Duration rep
+//CCYYMMDDThhmmss/PnYnMnDTnHnMnS
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/gregorian/testperiod.cpp b/libs/date_time/test/gregorian/testperiod.cpp
new file mode 100644
index 000000000..969dcecec
--- /dev/null
+++ b/libs/date_time/test/gregorian/testperiod.cpp
@@ -0,0 +1,153 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+int main()
+{
+ using namespace boost::gregorian;
+ date d1(2000,Jan,1),d2(2000,Jan,4);
+ date d3 = d2;
+ check("assignment", d3 == d2);
+ date_period p1(d1,d2);
+ date_period p2(d1,date_duration(3));
+ check("construction and ==", p1 == p2);
+ check("begin", p1.begin() == d1);
+ check("last", p1.last() == d2-date_duration(1) );
+ check("end", p1.end() == d2);
+ check("length", p2.length() == date_duration(3));
+ check("contains begin", p1.contains(d1));
+ check("contains last", !p1.contains(d2));
+ date_period p3(date(2000,Jan,4),date(2000,Feb,1));
+ check("operator== not equal case", !(p1 == p3));
+ check("less than order", p1 < p3);
+ check("greater than order", p3 > p1);
+ check("not equal", p3 != p1);
+ check("intersects with myself", p1.intersects(p1));
+ check("not intersects", !(p1.intersects(p3)));
+ check("not intersects", !(p3.intersects(p1)));
+ date_period p4(date(1999,Dec,1), d2);
+ check("intersects", p1.intersects(p4));
+ check("intersects", p4.intersects(p1));
+ date_period p5(date(1999,Dec,1), date(2000,Dec,31));
+ check("intersects", p1.intersects(p5));
+ check("intersects", p5.intersects(p1));
+ date_period p6(date(2000,Jan,1),date(2000,Dec,31));
+ check("contains period", p5.contains(p6));
+ check("contains period equal", p6.contains(p6));
+ check("not contains period", !p6.contains(p5));
+
+ //shift test
+ date_duration fourDays(4);
+ p1.shift(fourDays); //from 2000-Jan-01--2000-Jan-04
+ date_period shifted(date(2000,Jan,5),date(2000,Jan,8));
+ // std::cout << to_string(p1.begin()) <<"--"
+ // << to_string(p1.last()) << std::endl;
+ check("shift", p1 == shifted);
+
+ //expand the date period
+ date_period p10(date(2000,Jan,5),date(2000,Jan,8));
+ p10.expand(days(2)); //from 2000-Jan-01--2000-Jan-04
+ check("expand", p10 == date_period(date(2000,Jan,3),date(2000,Jan,10)));
+
+ //intersection tests
+ date_period i1(date(2000,Jan,5), date(2000,Jan,10));
+ date_period i2(date(2000,Jan,1), date(2000,Jan,7));
+ date_period r1(date(2000,Jan,5), date(2000,Jan,7));
+ //case 1 [5 -10) intersect [1-7) -> [5-7)
+ std::cout << to_simple_string(i1.intersection(i2)) << std::endl;
+ check("intersect case1", i1.intersection(i2) == r1);
+ check("intersect case1", i2.intersection(i1) == r1);
+ //case 2 [5 -10) intersect [1-15) -> [5-10)
+ date_period i3(date(2000,Jan,1), date(2000,Jan,15));
+ check("intersect case2", i1.intersection(i3) == i1);
+ check("intersect case2", i3.intersection(i1) == i1);
+ //case 3 [5-10) intersect [7-15) -> [7-10)
+ date_period i4(date(2000,Jan,7), date(2000,Jan,10));
+ date_period r2(date(2000,Jan,7), date(2000,Jan,10));
+ check("intersect case3", i1.intersection(i4) == r2);
+ check("intersect case3", i4.intersection(i1) == r2);
+ //case 4 [5-10) intersect [6-9) -> [6-9)
+ date_period i5(date(2000,Jan,6), date(2000,Jan,9));
+ check("intersect case4", i1.intersection(i5) == i5);
+ check("intersect case4", i5.intersection(i1) == i5);
+ //case 5 no intersection [1-7) intersect [7-10)
+ check("no intersection", i2.intersection(i4).is_null());
+
+ //case 1 [5 -10) merge [1-7) -> [1-10)
+ date_period r3(date(2000,Jan,1), date(2000,Jan,10));
+ // std::cout << to_iso_string(i1.merge(i2).begin()) << "/" << to_iso_string(i1.merge(i2).last()) << std::endl;
+ check("[5 -10) merge [1-7) -> [1-10)", i1.merge(i2) == r3);
+ check("[1 -7) merge [7-10) -> null", i2.merge(i4).is_null());
+ date_period r4(date(2000,Jan,5), date(2000,Jan,10));
+ check("[5 -10) merge [6-9) -> [5-10)", i1.merge(i5) == r4);
+
+ check("[5-10) span [1-7) -> [1-10)", i1.span(i2) == r3);
+ check("[1-7) span [7-10) -> [1-10)", i2.span(i4) == r3);
+ check("[7-10) span [1-7) -> [1-10)", i4.span(i2) == r3);
+ check("[1-15) span [1-7) -> [1-15)", i3.span(i2) == i3);
+
+ date_period i6(date(2000,Jan,1), date(2000,Jan,2));
+ check("[1-2) span [7-10) -> [1-10)", i6.span(i4) == r3);
+ check("[7-10) span [1-2) -> [1-10)", i4.span(i6) == r3);
+
+
+ date bf_start(2000,Jan,5);
+ date bf_end(2000,Jan,10);
+ date bf_before(2000,Jan,4); //is before the period
+ date bf_after(2000,Jan,11); //is really after
+ date bf_during(2000, Jan, 7);
+ date_period bfp1(bf_start, bf_end); //[2000-Jan-5 - 2000-Jan10)
+
+ check("is before -- start boundary", !bfp1.is_before(bf_start));
+ check("is before -- end boundary", bfp1.is_before(bf_end));
+ check("is before -- last boundary", !bfp1.is_before(bfp1.last()));
+ check("is before -- false", !bfp1.is_before(bf_before));
+ check("is before -- false", !bfp1.is_before(bf_during));
+ check("is before -- true", bfp1.is_before(bf_after));
+
+ check("is after -- start boundary", !bfp1.is_after(bf_start));
+ check("is after -- end boundary", !bfp1.is_after(bf_end));
+ check("is after -- last boundary", !bfp1.is_after(bfp1.last()));
+ check("is after -- true", bfp1.is_after(bf_before));
+ check("is after -- false", !bfp1.is_after(bf_during));
+ check("is after -- false", !bfp1.is_after(bf_after));
+
+ //adjacent tests
+ /*
+ [5-----10) adj1
+ [1----5) adj2
+ [7-----12) adj3
+ [12----15) adj4
+ [1-3) adj5
+ [7-9) adj6
+ */
+ date_period adj1(date(2000,Jan,5), date(2000,Jan,10));
+ date_period adj2(date(2000,Jan,1), date(2000,Jan,5));
+ date_period adj3(date(2000,Jan,7), date(2000,Jan,12));
+ date_period adj4(date(2000,Jan,12), date(2000,Jan,15));
+ date_period adj5(date(2000,Jan,1), date(2000,Jan,3));
+ date_period adj6(date(2000,Jan,7), date(2000,Jan,9));
+
+ check("is adjacent -- adj1-->adj2", adj1.is_adjacent(adj2));
+ check("is adjacent -- adj2-->adj1", adj2.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj3", !adj1.is_adjacent(adj3));
+ check("is adjacent -- adj3-->adj1", !adj3.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj4", !adj1.is_adjacent(adj4));
+ check("is adjacent -- adj4-->adj1", !adj4.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj5", !adj1.is_adjacent(adj5));
+ check("is adjacent -- adj5-->adj1", !adj5.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj6", !adj1.is_adjacent(adj6));
+ check("is adjacent -- adj6-->adj1", !adj6.is_adjacent(adj1));
+
+ printTestStats();
+
+ return 0;
+}
+
diff --git a/libs/date_time/test/local_time/README.poorly_formed_zonespec b/libs/date_time/test/local_time/README.poorly_formed_zonespec
new file mode 100644
index 000000000..b417cc8a6
--- /dev/null
+++ b/libs/date_time/test/local_time/README.poorly_formed_zonespec
@@ -0,0 +1,4 @@
+The file "poorly_formed_zonespec.csv" is only used for testing.
+
+This file has the wrong number of fields in it and should not be used for
+any other prupose.
diff --git a/libs/date_time/test/local_time/poorly_formed_zonespec.csv b/libs/date_time/test/local_time/poorly_formed_zonespec.csv
new file mode 100644
index 000000000..d5eb87149
--- /dev/null
+++ b/libs/date_time/test/local_time/poorly_formed_zonespec.csv
@@ -0,0 +1,2 @@
+"ID","STD ABBR","STD NAME","DST ABBR","DST NAME","GMT offset","DST adjustment","DST Start Date rule","Start time","DST End date rule","End time"
+"Unique/Zone_name","GMT","","+00:00:00"
diff --git a/libs/date_time/test/local_time/testclocks.cpp b/libs/date_time/test/local_time/testclocks.cpp
new file mode 100644
index 000000000..7a6970556
--- /dev/null
+++ b/libs/date_time/test/local_time/testclocks.cpp
@@ -0,0 +1,40 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+
+// The actual clocks are tested in posix_time/testclock.cpp.
+// These tests are to verify that the time zone is applied correctly
+
+int
+main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+
+ boost::shared_ptr<time_zone> az_tz(new posix_time_zone("MST-07"));
+ boost::shared_ptr<time_zone> ny_tz(new posix_time_zone("EST-05EDT,M4.1.0,M10.5.0"));
+
+ ptime tl = second_clock::local_time();
+ std::cout << to_simple_string(tl) << std::endl;
+ local_date_time ldt1 = local_sec_clock::local_time(az_tz);
+ std::cout << ldt1.to_string() << std::endl;
+ local_date_time ldt2 = local_sec_clock::local_time(ny_tz);
+ std::cout << ldt2.to_string() << std::endl;
+
+ tl = microsec_clock::local_time();
+ std::cout << to_simple_string(tl) << std::endl;
+ local_date_time ldt3 = local_microsec_clock::local_time(az_tz);
+ std::cout << ldt3.to_string() << std::endl;
+ local_date_time ldt4 = local_microsec_clock::local_time(ny_tz);
+ std::cout << ldt4.to_string() << std::endl;
+
+ return 0;
+}
diff --git a/libs/date_time/test/local_time/testcustom_time_zone.cpp b/libs/date_time/test/local_time/testcustom_time_zone.cpp
new file mode 100644
index 000000000..c77d93bfa
--- /dev/null
+++ b/libs/date_time/test/local_time/testcustom_time_zone.cpp
@@ -0,0 +1,88 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+
+ boost::shared_ptr<dst_calc_rule>
+ rule1(new partial_date_dst_rule(partial_date(30,Apr),
+ partial_date(30,Oct)));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule2(new first_last_dst_rule(first_last_dst_rule::start_rule(Sunday,Apr),
+ first_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule>
+ rule3(new last_last_dst_rule(last_last_dst_rule::start_rule(Sunday,Mar),
+ last_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule> rule4; // no daylight savings
+
+ time_zone_names pst("Pacific Standard Time",
+ "PST",
+ "Pacific Daylight Time" ,
+ "PDT");
+ time_zone_names mst("Mountain Standard Time",
+ "MST",
+ "" ,
+ "");
+
+ dst_adjustment_offsets of(hours(1), hours(2), hours(2));
+ dst_adjustment_offsets of2(hours(0), hours(0), hours(0)); // no daylight savings
+
+ time_zone_ptr tz1(new custom_time_zone(pst, hours(-8), of, rule1));
+ time_zone_ptr tz2(new custom_time_zone(pst, hours(-8), of, rule2));
+ time_zone_ptr tz3(new custom_time_zone(pst, hours(-8), of, rule3));
+ time_zone_ptr tz4(new custom_time_zone(mst, hours(-7), of2, rule4));
+
+ check("out string",
+ tz1->dst_zone_abbrev() == std::string("PDT"));
+ check("out string",
+ tz1->std_zone_abbrev() == std::string("PST"));
+ check("out string",
+ tz1->std_zone_name() == std::string("Pacific Standard Time"));
+ check("out string",
+ tz1->dst_zone_name() == std::string("Pacific Daylight Time"));
+
+ check("dst offset", tz1->dst_offset() == hours(1));
+ check("base offset", tz1->base_utc_offset() == hours(-8));
+ check("has dst", tz1->has_dst());
+
+ check("dst start time",
+ tz1->dst_local_start_time(2003) == ptime(date(2003,Apr,30),hours(2)));
+ check("dst end time",
+ tz1->dst_local_end_time(2003) == ptime(date(2003,Oct,30),hours(2)));
+
+ check("tz1 to posix string",
+ tz1->to_posix_string() == std::string("PST-08PDT+01,120/02:00,303/02:00"));
+ check("tz2 to posix string",
+ tz2->to_posix_string() == std::string("PST-08PDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("tz3 to posix string",
+ tz3->to_posix_string() == std::string("PST-08PDT+01,M3.5.0/02:00,M10.5.0/02:00"));
+ check("tz4 to posix string",
+ tz4->to_posix_string() == std::string("MST-07"));
+
+ // test start/end for non-dst zone
+ check("has dst in non-dst zone", !tz4->has_dst());
+ check("dst start in non-dst zone",
+ tz4->dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ tz4->dst_local_end_time(2005) == ptime(not_a_date_time));
+
+
+ return printTestStats();
+}
+
+
diff --git a/libs/date_time/test/local_time/testdst_transition_day_rule.cpp b/libs/date_time/test/local_time/testdst_transition_day_rule.cpp
new file mode 100644
index 000000000..db578a88a
--- /dev/null
+++ b/libs/date_time/test/local_time/testdst_transition_day_rule.cpp
@@ -0,0 +1,65 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/local_time/dst_transition_day_rules.hpp"
+#include "boost/shared_ptr.hpp"
+#include "../testfrmwk.hpp"
+
+
+
+// see http://www.timeanddate.com/time/aboutdst.html for some info
+// also
+int
+main()
+{
+ // using namespace boost::posix_time;
+ using namespace boost::local_time;
+ using namespace boost::gregorian;
+
+ boost::shared_ptr<dst_calc_rule>
+ rule1(new partial_date_dst_rule(partial_date(30,Apr),
+ partial_date(30,Oct)));
+
+ check("partial date rule", rule1->start_day(2001) == date(2001, Apr, 30));
+ check("partial date rule", rule1->end_day(2001) == date(2001, Oct, 30));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule2(new first_last_dst_rule(first_last_dst_rule::start_rule(Sunday,Apr),
+ first_last_dst_rule::end_rule(Sunday,Oct)));
+
+ check("first last rule", rule2->start_day(2001) == date(2001, Apr, 1));
+ check("first last rule", rule2->end_day(2001) == date(2001, Oct, 28));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule3(new last_last_dst_rule(last_last_dst_rule::start_rule(Sunday,Mar),
+ last_last_dst_rule::end_rule(Sunday,Oct)));
+
+ check("last last rule", rule3->start_day(2001) == date(2001, Mar, 25));
+ check("last last rule", rule3->end_day(2001) == date(2001, Oct, 28));
+
+ typedef nth_kday_of_month nkday;
+ boost::shared_ptr<dst_calc_rule>
+ rule4(new nth_last_dst_rule(nth_last_dst_rule::start_rule(nkday::first,Sunday,Mar),
+ nth_last_dst_rule::end_rule(Sunday,Oct)));
+
+ check("nth Last rule", rule4->start_day(2001) == date(2001, Mar, 4));
+ check("nth Last rule", rule4->end_day(2001) == date(2001, Oct, 28));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule5(new nth_kday_dst_rule(nth_kday_dst_rule::start_rule(nkday::first,Sunday,Mar),
+ nth_kday_dst_rule::end_rule(nkday::fourth,Sunday,Oct)));
+
+ check("nth_kday rule", rule5->start_day(2001) == date(2001, Mar, 4));
+ check("nth_kday rule", rule5->end_day(2001) == date(2001, Oct, 28));
+
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/local_time/testlocal_time.cpp b/libs/date_time/test/local_time/testlocal_time.cpp
new file mode 100644
index 000000000..46e88ad7d
--- /dev/null
+++ b/libs/date_time/test/local_time/testlocal_time.cpp
@@ -0,0 +1,370 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-09-22 09:21:43 -0700 (Sat, 22 Sep 2012) $
+ */
+
+
+#include "boost/date_time/local_time/custom_time_zone.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time/local_time.hpp"
+// #include "boost/date_time/local_time/posix_time_zone.hpp"
+#include "../testfrmwk.hpp"
+//#include "boost/date_time/c_time.hpp"
+#include <iostream>
+
+#include <sstream>
+// function eases testing
+std::string tm_out(const tm& ptr){
+ std::stringstream ss;
+
+ ss
+ << ptr.tm_wday << ' ' << ptr.tm_yday << ' '
+ << std::setw(2) << std::setfill('0') << ptr.tm_mon + 1 << '/'
+ << std::setw(2) << std::setfill('0') << ptr.tm_mday << '/'
+ << std::setw(2) << std::setfill('0') << ptr.tm_year + 1900 << ' '
+ << std::setw(2) << std::setfill('0') << ptr.tm_hour << ':'
+ << std::setw(2) << std::setfill('0') << ptr.tm_min << ':'
+ << std::setw(2) << std::setfill('0') << ptr.tm_sec << ' ';
+ if(ptr.tm_isdst >= 0){
+ ss << (ptr.tm_isdst ? "DST" : "STD");
+ }
+ else{
+ ss << "DST/STD unknown";
+ }
+ return ss.str();
+}
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ // since local_date_time inherits it's math operations from time, the
+ // tests here only show that the operations work. The thorough testing
+ // of these operations is done in the posix_time tests
+
+ try {
+ time_zone_ptr az_tz(new posix_time_zone("MST-07"));
+ time_zone_ptr ny_tz(new posix_time_zone("EST-05EDT,M4.1.0,M10.5.0"));
+ // EST & EST for sydney is correct, according to zoneinfo files
+ time_zone_ptr sydney(new posix_time_zone("EST+10EST,M10.5.0,M3.5.0/03:00"));
+ time_zone_ptr null_tz;
+ date d(2003, 12, 20);
+ hours h(12);
+ ptime t(d,h);
+ local_date_time az_time(t, az_tz); // ptime constructor is a UTC time
+
+ check("Zone abbreviation", az_time.zone()->std_zone_abbrev() == std::string("MST"));
+ check("base offset", az_time.zone()->base_utc_offset() == hours(-7));
+ check("zone has dst", az_time.zone()->has_dst() == false);
+ check("is_dst check", az_time.is_dst() == false);
+ check("to_string: " + az_time.to_string(),
+ az_time.to_string() == "2003-Dec-20 05:00:00 MST");
+
+
+
+ std::cout << "\nChecking copy construction" << std::endl;
+ local_date_time az_time2(az_time); //copy constructor
+ // Now test the copy
+ check("is_dst check", az_time2.is_dst() == false);
+ check("to_string: " + az_time2.to_string(),
+ az_time2.to_string() == "2003-Dec-20 05:00:00 MST");
+ check("zone has dst", az_time2.zone()->has_dst() == false);
+ check("base offset", az_time2.zone()->base_utc_offset() == hours(-7));
+
+
+ std::cout << "\nChecking special_value construction" << std::endl;
+ // since local_date_time inherits its special value operatorations
+ // from time, we only need to show here that they work as thorough
+ // testing is done in the posix_time tests
+ ptime svpt(not_a_date_time);
+ local_date_time sv_time(svpt, ny_tz);
+ check("is special_value", sv_time.is_not_a_date_time());
+ check("to_string: " + sv_time.to_string(),
+ sv_time.to_string() == "not-a-date-time");
+ check("is_dst", sv_time.is_dst() == false);
+ local_date_time sv_time2(pos_infin);
+ check("is special_value", sv_time2.is_pos_infinity());
+ check("to_string: " + sv_time2.to_string(),
+ sv_time2.to_string() == "+infinity");
+ check("is_dst", sv_time2.is_dst() == false);
+ sv_time2 += days(12); // add a duration to a special value
+ check("Add a duration to a special value", sv_time2.is_pos_infinity());
+
+ local_date_time sv_time3(max_date_time, ny_tz);
+#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ check("max_date_time to_string: " + sv_time3.to_string(),
+ sv_time3.to_string() == "9999-Dec-31 18:59:59.999999999 EST");
+#else
+ check("max_date_time to_string: " + sv_time3.to_string(),
+ sv_time3.to_string() == "9999-Dec-31 18:59:59.999999 EST");
+#endif
+
+ try {
+ local_date_time sv_time4(min_date_time);
+ check("min_date_time to_string: " + sv_time4.to_string(),
+ sv_time4.to_string() == "1400-Jan-01 00:00:00 UTC");
+ }
+ catch (std::exception& e) {
+ check("min_date_time to_string -- exception" , false);
+ std::cout << "Exception is : " << e.what() << std::endl;
+ }
+
+/** todo -- this will cause an out of range when min_date is adjusted for ny_tz
+ local_date_time sv_time5(min_date_time, ny_tz);
+ std::cout << sv_time5.to_string() << std::endl;
+**/
+
+ std::cout << "\nChecking calc_options construction" << std::endl;
+ { // invalid NADT
+ date d(2004, Apr, 4);
+ time_duration td(2,30,0); // invalid local time in ny_tz
+ local_date_time calcop(d, td, ny_tz, local_date_time::NOT_DATE_TIME_ON_ERROR);
+ check("is NADT", calcop.is_not_a_date_time());
+ }
+ { // invalid exception
+ date d(2004, Apr, 4);
+ time_duration td(2,30,0); // invalid local time in ny_tz
+ try{
+ local_date_time calcop(d, td, ny_tz, local_date_time::EXCEPTION_ON_ERROR);
+ check("Did not catch expected exception", false);
+ }catch(time_label_invalid& /*i*/){
+ check("Caught expected exception", true);
+ }catch(...){
+ check("Caught unexpected exception", false);
+ }
+ }
+ { // ambig NADT
+ date d(2004, Oct, 31);
+ time_duration td(1,30,0); // ambig local time in ny_tz
+ local_date_time calcop(d, td, ny_tz, local_date_time::NOT_DATE_TIME_ON_ERROR);
+ check("is NADT", calcop.is_not_a_date_time());
+ }
+ { // ambig exception
+ date d(2004, Oct, 31);
+ time_duration td(1,30,0); // ambig local time in ny_tz
+ try{
+ local_date_time calcop(d, td, ny_tz, local_date_time::EXCEPTION_ON_ERROR);
+ check("Did not catch expected exception", false);
+ }catch(ambiguous_result& /*a*/){
+ check("Caught expected exception", true);
+ }catch(...){
+ check("Caught unexpected exception", false);
+ }
+ }
+
+
+ //Now construct with a date and time
+ std::cout << "\nChecking construct with date and time_duration" << std::endl;
+ local_date_time az_time3(d, h, az_tz, false);
+ check("Zone abbreviation", az_time3.zone()->std_zone_abbrev() == std::string("MST"));
+ check("base offset", az_time3.zone()->base_utc_offset() == hours(-7));
+ check("base offset", az_time3.zone()->has_dst() == false);
+ check("is_dst check", az_time3.is_dst() == false);
+ check("to_string: " + az_time3.to_string(),
+ az_time3.to_string() == "2003-Dec-20 12:00:00 MST");
+
+ // construct with a null tz
+ //local_date_time null_tz_time(d, h, null_tz, false);
+ local_date_time null_tz_time(d, h, null_tz, true);
+ // TODO: how to handle calls to null_tz_time.zone()->...
+ check("is_dst check", null_tz_time.is_dst() == false);
+ check("to_string: " + null_tz_time.to_string(),
+ null_tz_time.to_string() == "2003-Dec-20 12:00:00 UTC");
+
+ //Now construct with a date and time - invalid parameters
+ try{
+ local_date_time blt(d, h, ny_tz, true);
+ check("Did not catch expected exception (dst_not_valid)", false);
+ }catch(dst_not_valid& d){
+ check(std::string("Caught expected exception (dst_not_valid) ") + d.what(), true);
+ }catch(std::exception& e){
+ check(std::string("Caught unexpected exception ") + e.what(), false);
+ }
+ try{
+ local_date_time blt(date(2004,Apr,4), time_duration(2,30,0), ny_tz, true);
+ check("Did not catch expected exception (Invalid_Time_Label)", false);
+ }catch(time_label_invalid& e){
+ check(std::string("Caught expected exception (Invalid_Time_Label) ") + e.what(), true);
+ }catch(std::exception& e){
+ check(std::string("Caught unexpected exception ") + e.what(), false);
+ }
+
+
+ // thorough is_dst() tests, tests againts null_tz and non dst tz are
+ // done where those local times were tested
+ {
+ date d(2004,Apr,4);
+ time_duration td(1,15,0); // local
+ local_date_time lt1(d,td,ny_tz,false);
+ local_date_time lt2(ptime(d,time_duration(6,15,0)), ny_tz);
+ check("are local_times equal", lt1.utc_time() == lt2.utc_time());
+ check("is_dst - transition in 1", lt1.is_dst() == false);
+ check("is_dst - transition in 2", lt2.is_dst() == false);
+ lt1 += hours(1);
+ lt2 += hours(1);
+ check("is_dst - transition in 1", lt1.is_dst() == true);
+ check("is_dst - transition in 2", lt2.is_dst() == true);
+ }
+ {
+ date d(2004,Oct,31);
+ time_duration td(1,15,0); // local
+ local_date_time lt1(d,td,ny_tz,true);
+ /*try{
+ //local_date_time lt1(d,td,ny_tz,false);
+ local_date_time lt1(d,td,ny_tz,true);
+ std::cout << "no exception thrown" << std::endl;
+ }catch(time_label_invalid& e){
+ std::cout << "caught: " << e.what() << std::endl;
+ }*/
+ local_date_time lt2(ptime(d,time_duration(5,15,0)), ny_tz);
+ check("are local_times equal", lt1.utc_time() == lt2.utc_time());
+ check("is_dst - transition out 1", lt1.is_dst() == true);
+ check("is_dst - transition out 2", lt2.is_dst() == true);
+ lt1 += hours(1);
+ lt2 += hours(1);
+ check("is_dst - transition out 1", lt1.is_dst() == false);
+ check("is_dst - transition out 2", lt2.is_dst() == false);
+ }
+ { // southern hemisphere
+ date d(2004,Oct,31);
+ time_duration td(1,15,0); // local
+ local_date_time lt1(d,td,sydney,false);
+ check("is_dst - transition in (sydney)", lt1.is_dst() == false);
+ lt1 += hours(1);
+ check("is_dst - transition in (sydney)", lt1.is_dst() == true);
+ }
+ {
+ date d(2004,Mar,28);
+ time_duration td(2,15,0); // local; sydney has a weird trans time
+ local_date_time lt1(d,td,sydney,true);
+ check("is_dst - transition out (sydney)", lt1.is_dst() == true);
+ lt1 += hours(1);
+ check("is_dst - transition out (sydney)", lt1.is_dst() == false);
+ }
+
+
+
+ std::cout << "\nTest conversion of time zone from Arizona to New York" << std::endl;
+ local_date_time ny_time = az_time.local_time_in(ny_tz);
+ check("Zone abbreviation", ny_time.zone()->std_zone_abbrev() == std::string("EST"));
+ check("base offset", ny_time.zone()->base_utc_offset() == hours(-5));
+ check("base offset", ny_time.zone()->has_dst() == true);
+ check("to_string: " + ny_time.to_string(),
+ ny_time.to_string() == "2003-Dec-20 07:00:00 EST");
+ ny_time += hours(3);
+ check("to_string after add 3 hours: " + ny_time.to_string(),
+ ny_time.to_string() == "2003-Dec-20 10:00:00 EST");
+ ny_time += days(3);
+ check("to_string after add 3 days: " + ny_time.to_string(),
+ ny_time.to_string() == "2003-Dec-23 10:00:00 EST");
+
+
+ { // test comparisons & math operations
+ date d(2003, Aug, 28);
+ ptime sv_pt(pos_infin);
+ local_date_time sv_lt(sv_pt, ny_tz);
+ ptime utc_pt(d, hours(12));
+ // all 4 of the following local times happen at the same instant
+ // so they are all equal
+ local_date_time utc_lt(utc_pt, null_tz); // noon in utc
+ local_date_time az_lt(d, hours(5), az_tz, false); // 5am local std
+ local_date_time ny_lt(d, hours(8), ny_tz, true); // 8am local dst
+ local_date_time au_lt(d, hours(22), sydney, false);// 10pm local std
+
+ check("local_date_time to tm",
+ std::string("4 239 08/28/2003 05:00:00 STD") == tm_out(to_tm(az_lt)));
+ check("local_date_time to tm",
+ std::string("4 239 08/28/2003 08:00:00 DST") == tm_out(to_tm(ny_lt)));
+ check("local_date_time to tm",
+ std::string("4 239 08/28/2003 22:00:00 STD") == tm_out(to_tm(au_lt)));
+
+ try{
+ local_date_time ldt(not_a_date_time);
+ tm ldt_tm = to_tm(ldt);
+ check("Exception not thrown (special_value to_tm)", false);
+ //does nothing useful but stops compiler from complaining about unused ldt_tm
+ std::cout << ldt_tm.tm_sec << std::endl;
+ }catch(std::out_of_range& e){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+ // check that all are equal to sv_pt
+ check("local == utc", az_lt == utc_lt);
+ check("local == utc", ny_lt == utc_lt);
+ check("local == utc", au_lt == utc_lt);
+ check("local <= utc", au_lt <= utc_lt);
+ check("local >= utc", au_lt >= utc_lt);
+ check("local == local", az_lt == ny_lt);
+ check("local < local", az_lt < ny_lt+seconds(1));
+ check("local > local", az_lt+seconds(1) > ny_lt);
+ check("local <= local", az_lt <= ny_lt);
+ check("local >= local", az_lt >= ny_lt);
+ check("local != local", az_lt+seconds(1) != ny_lt);
+
+ au_lt += hours(1);
+ check("local != after +=", au_lt != utc_lt);
+ check("local <= after +=", utc_lt <= au_lt);
+ check("local >= after +=", au_lt >= utc_lt);
+ check("local < after +=", utc_lt < au_lt);
+ check("local > after +=", au_lt > utc_lt);
+ au_lt -= hours(1);
+ check("local == utc after -=", au_lt == utc_lt);
+
+ check("local + days",
+ (az_lt + days(2)).to_string() == "2003-Aug-30 05:00:00 MST");
+ check("local - days",
+ (az_lt - days(2)).to_string() == "2003-Aug-26 05:00:00 MST");
+ check("local += days",
+ (az_lt += days(2)).to_string() == "2003-Aug-30 05:00:00 MST");
+ check("local -= days",
+ (az_lt -= days(2)).to_string() == "2003-Aug-28 05:00:00 MST");
+ check("local + time_duration",
+ (az_lt + hours(2)).to_string() == "2003-Aug-28 07:00:00 MST");
+ check("local - time_duration",
+ (az_lt - hours(2)).to_string() == "2003-Aug-28 03:00:00 MST");
+ // special_values is more thoroughly tested in posix_time
+ check("pos_infinity > local", sv_lt > au_lt);
+ local_date_time sv_lt2(sv_lt + days(2));
+ check("pos_infin + duration == pos_infin", sv_lt2 == sv_lt);
+
+#if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+ months m(2);
+ years y(2);
+ check("Local + months",
+ (az_lt + m).to_string() == "2003-Oct-28 05:00:00 MST");
+ az_lt += m;
+ check("Local += months",
+ az_lt.to_string() == "2003-Oct-28 05:00:00 MST");
+ check("Local - months",
+ (az_lt - m).to_string() == "2003-Aug-28 05:00:00 MST");
+ az_lt -= m;
+ check("Local -= months",
+ az_lt.to_string() == "2003-Aug-28 05:00:00 MST");
+ check("Local + years",
+ (az_lt + y).to_string() == "2005-Aug-28 05:00:00 MST");
+ az_lt += y;
+ check("Local += years",
+ az_lt.to_string() == "2005-Aug-28 05:00:00 MST");
+ check("Local - years",
+ (az_lt - y).to_string() == "2003-Aug-28 05:00:00 MST");
+ az_lt -= y;
+ check("Local -= years",
+ az_lt.to_string() == "2003-Aug-28 05:00:00 MST");
+
+#endif // BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
+ }
+ }
+ catch(std::exception& e) {
+ check(std::string("test failed due to exception: ") + e.what(), false);
+ }
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/local_time/testlocal_time_facet.cpp b/libs/date_time/test/local_time/testlocal_time_facet.cpp
new file mode 100644
index 000000000..b5cf65fec
--- /dev/null
+++ b/libs/date_time/test/local_time/testlocal_time_facet.cpp
@@ -0,0 +1,195 @@
+
+/* Copyright (c) 2004 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include <iostream>
+#include <sstream>
+#include <boost/shared_ptr.hpp>
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+
+
+template<class temporal_type, typename charT>
+inline
+void
+teststreaming(std::string const& testname,
+ temporal_type value,
+ std::basic_string<charT> const& expected_result,
+ const std::locale& locale)
+{
+ std::basic_stringstream<charT> ss;
+ ss.imbue(locale);
+ ss << value;
+
+ if (!check(testname, ss.str() == expected_result))
+#if !defined(BOOST_NO_STD_WSTRING)
+ std::wcout << L"Expected: \"" << expected_result.c_str() << L"\"\nGot: \"" << ss.str().c_str() << L"\"" << std::endl;
+#else
+ std::cout << "Expected: \"" << expected_result.c_str() << "\"\nGot: \"" << ss.str().c_str() << L"\"" << std::endl;
+#endif
+}
+
+int main(){
+ /* use the tz_database for the time zones.
+ * Chicago, Denver, Los_Angeles, New_Tork, and Phoenix
+ * have all had full names added */
+ using namespace boost;
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ tz_database time_zones;
+
+ try {
+ // first try to find the data file from the test dir
+ time_zones.load_from_file("../data/date_time_zonespec.csv");
+ }
+ catch(const data_not_accessible& e) {
+ // couldn't find the data file so assume we are being run from
+ // boost_root/status and try again
+ try {
+ time_zones.load_from_file("../libs/date_time/data/date_time_zonespec.csv");
+ }
+ catch(const data_not_accessible&) {
+ check("Cannot locate data file - aborting.", false);
+ return printTestStats();
+ }
+ }
+
+ time_zone_ptr utc;
+ time_zone_ptr chicago = time_zones.time_zone_from_region("America/Chicago");
+ time_zone_ptr denver = time_zones.time_zone_from_region("America/Denver");
+ time_zone_ptr la = time_zones.time_zone_from_region("America/Los_Angeles");
+ time_zone_ptr nyc = time_zones.time_zone_from_region("America/New_York");
+ time_zone_ptr phx = time_zones.time_zone_from_region("America/Phoenix");
+ // sydney does not have full time zone names in the tz_database
+ time_zone_ptr sydney = time_zones.time_zone_from_region("Australia/Sydney");
+
+ ptime a_time(date(2004,Dec,15), hours(12));
+ ptime b_time(date(2004,Aug,15), hours(12));
+ local_date_time ldt1(a_time, utc);
+ local_date_time ldt2(b_time, chicago);
+ local_date_time ldt3(a_time, denver);
+ local_date_time ldt4(b_time, la);
+ local_date_time ldt5(a_time, nyc);
+ local_date_time ldt6(b_time, phx);
+
+ local_time_period ltp1(ldt1, hours(10) + minutes(24) + seconds(5));
+ local_time_period ltp2(ldt4, hours(15) + minutes(20) + seconds(41));
+
+ typedef boost::date_time::time_facet<local_date_time, char> ldt_facet;
+ //ldt_facet* timefacet = new ldt_facet("%c %Z"); // full name
+ ldt_facet* timefacet = new ldt_facet("%a %b %d %H:%M:%S %Y %Z"); // full name
+ std::locale loc1(std::locale::classic(), timefacet);
+
+ typedef boost::date_time::time_facet<ptime, char> pt_facet;
+ //pt_facet* ptimefacet1 = new pt_facet("%c %Z"); // show that zone is ignored
+ pt_facet* ptimefacet1 = new pt_facet("%a %b %d %H:%M:%S %Y %Z"); // show that zone is ignored
+ std::locale loc2(std::locale::classic(), ptimefacet1);
+
+
+ std::cout << "\nFull time zone names tests" << std::endl;
+ teststreaming("ptime with %Z flag\n", a_time, std::string("Wed Dec 15 12:00:00 2004") , loc2);
+
+ teststreaming("UTC local_date_time", ldt1, std::string("Wed Dec 15 12:00:00 2004 Coordinated Universal Time"), loc1);
+ teststreaming("Chicago in summer", ldt2, std::string("Sun Aug 15 07:00:00 2004 Central Daylight Time") , loc1);
+ teststreaming("Denver in winter", ldt3, std::string("Wed Dec 15 05:00:00 2004 Mountain Standard Time"), loc1);
+ teststreaming("Los Angeles in summer", ldt4, std::string("Sun Aug 15 05:00:00 2004 Pacific Daylight Time"), loc1);
+ teststreaming("New York in winter", ldt5, std::string("Wed Dec 15 07:00:00 2004 Eastern Standard Time"), loc1);
+ teststreaming("Phoenix in Summer", ldt6, std::string("Sun Aug 15 05:00:00 2004 Mountain Standard Time"), loc1);
+
+ teststreaming("UTC local_time_period", ltp1, std::string("[Wed Dec 15 12:00:00 2004 Coordinated Universal Time/Wed Dec 15 22:24:04 2004 Coordinated Universal Time]"), loc1);
+ teststreaming("LA local_time_period", ltp2, std::string("[Sun Aug 15 05:00:00 2004 Pacific Daylight Time/Sun Aug 15 20:20:40 2004 Pacific Daylight Time]"), loc1);
+
+ //ptimefacet1->format("%c %z"); // show that zone abbrev is ignored
+ ptimefacet1->format("%a %b %d %H:%M:%S %Y %z"); // show that zone abbrev is ignored
+ std::cout << "\nTime zone abbreviation tests" << std::endl;
+ teststreaming("ptime with %z flag\n", a_time, std::string("Wed Dec 15 12:00:00 2004") , loc2);
+
+ // using standard format
+ //timefacet->format("%c %z"); // abbreviated zone
+ timefacet->format("%a %b %d %H:%M:%S %Y %z"); // abbreviated zone
+ teststreaming("UTC local_date_time", ldt1, std::string("Wed Dec 15 12:00:00 2004 UTC"), loc1);
+ teststreaming("Chicago in summer", ldt2, std::string("Sun Aug 15 07:00:00 2004 CDT") , loc1);
+ teststreaming("Denver in winter", ldt3, std::string("Wed Dec 15 05:00:00 2004 MST"), loc1);
+ teststreaming("Los Angeles in summer", ldt4, std::string("Sun Aug 15 05:00:00 2004 PDT"), loc1);
+ teststreaming("New York in winter", ldt5, std::string("Wed Dec 15 07:00:00 2004 EST"), loc1);
+ teststreaming("Phoenix in Summer", ldt6, std::string("Sun Aug 15 05:00:00 2004 MST"), loc1);
+
+ // iso format
+ // show that zone offset is ignored
+ ptimefacet1->format(pt_facet::iso_time_format_specifier);
+ std::cout << "\nLocal time iso format tests" << std::endl;
+ teststreaming("ptime with iso format\n", a_time,
+ std::string("20041215T120000") , loc2);
+
+ timefacet->format(ldt_facet::iso_time_format_specifier);
+ teststreaming("UTC local_date_time", ldt1,
+ std::string("20041215T120000Z"), loc1);
+ teststreaming("Chicago in summer", ldt2,
+ std::string("20040815T070000-0500") , loc1);
+ teststreaming("Denver in winter", ldt3,
+ std::string("20041215T050000-0700"), loc1);
+ teststreaming("Los Angeles in summer", ldt4,
+ std::string("20040815T050000-0700"), loc1);
+ teststreaming("New York in winter", ldt5,
+ std::string("20041215T070000-0500"), loc1);
+ teststreaming("Phoenix in Summer", ldt6,
+ std::string("20040815T050000-0700"), loc1);
+ teststreaming("Sydney in December", ldt1.local_time_in(sydney),
+ std::string("20041215T230000+1100"), loc1);
+
+ // iso extended format
+ // show that zone offset is ignored
+ ptimefacet1->format(pt_facet::iso_time_format_extended_specifier);
+ std::cout << "\nLocal time iso_extended tests" << std::endl;
+ teststreaming("ptime with iso extended format\n", a_time,
+ std::string("2004-12-15 12:00:00") , loc2);
+
+ timefacet->format(ldt_facet::iso_time_format_extended_specifier);
+ teststreaming("UTC local_date_time", ldt1,
+ std::string("2004-12-15 12:00:00Z"), loc1);
+ teststreaming("Chicago in summer", ldt2,
+ std::string("2004-08-15 07:00:00-05:00") , loc1);
+ teststreaming("Denver in winter", ldt3,
+ std::string("2004-12-15 05:00:00-07:00"), loc1);
+ teststreaming("Los Angeles in summer", ldt4,
+ std::string("2004-08-15 05:00:00-07:00"), loc1);
+ teststreaming("New York in winter", ldt5,
+ std::string("2004-12-15 07:00:00-05:00"), loc1);
+ teststreaming("Phoenix in Summer", ldt6,
+ std::string("2004-08-15 05:00:00-07:00"), loc1);
+ teststreaming("Sydney in December", ldt1.local_time_in(sydney),
+ std::string("2004-12-15 23:00:00+11:00"), loc1);
+
+#if !defined(BOOST_NO_STD_WSTRING)
+
+ typedef boost::date_time::time_facet<local_date_time, wchar_t> wldt_facet;
+ //wldt_facet* wtimefacet = new wldt_facet(L"%c %Z"); // full name
+ wldt_facet* wtimefacet = new wldt_facet(L"%a %b %d %H:%M:%S %Y %Z"); // full name
+ std::locale loc3(std::locale::classic(), wtimefacet);
+
+ /* Again, wide stream tests are more thoroughly done in the
+ * time_facet tests. Here we just need to show that they work */
+ std::cout << "\nFull time zone names tests - wide stream" << std::endl;
+ teststreaming("UTC local_date_time", ldt1, std::wstring(L"Wed Dec 15 12:00:00 2004 Coordinated Universal Time"), loc3);
+ teststreaming("Chicago in summer", ldt2, std::wstring(L"Sun Aug 15 07:00:00 2004 Central Daylight Time") , loc3);
+
+ teststreaming("UTC local_time_period", ltp1, std::wstring(L"[Wed Dec 15 12:00:00 2004 Coordinated Universal Time/Wed Dec 15 22:24:04 2004 Coordinated Universal Time]"), loc3);
+ teststreaming("LA local_time_period", ltp2, std::wstring(L"[Sun Aug 15 05:00:00 2004 Pacific Daylight Time/Sun Aug 15 20:20:40 2004 Pacific Daylight Time]"), loc3);
+
+ //wtimefacet->format(L"%c %z"); // abbrev
+ wtimefacet->format(L"%a %b %d %H:%M:%S %Y %z"); // abbrev
+ std::cout << "\nAbbreviated time zone names tests - wide stream" << std::endl;
+ teststreaming("UTC local_date_time", ldt1, std::wstring(L"Wed Dec 15 12:00:00 2004 UTC"), loc3);
+ teststreaming("Phoenix in Summer", ldt6, std::wstring(L"Sun Aug 15 05:00:00 2004 MST"), loc3);
+
+#endif // BOOST_NO_STD_WSTRING
+
+ return printTestStats();
+}
diff --git a/libs/date_time/test/local_time/testlocal_time_input_facet.cpp b/libs/date_time/test/local_time/testlocal_time_input_facet.cpp
new file mode 100644
index 000000000..3caf11f8d
--- /dev/null
+++ b/libs/date_time/test/local_time/testlocal_time_input_facet.cpp
@@ -0,0 +1,239 @@
+/* Copyright (c) 2005 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+#include <string>
+
+// for tests that are expected to fail and throw exceptions
+template<class temporal_type, class exception_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ exception_type const& /*except*/,
+ boost::local_time::local_time_input_facet* facet)
+{
+ using namespace boost::local_time;
+ bool result = false;
+ std::istringstream iss(input);
+ iss.exceptions(std::ios_base::failbit); // turn on exceptions
+ iss.imbue(std::locale(std::locale::classic(), facet));
+ try {
+ iss >> component;
+ }
+ catch(exception_type& e) {
+ std::cout << "Expected exception caught: \""
+ << e.what() << "\"" << std::endl;
+ result = iss.fail(); // failbit must be set to pass test
+ }
+ catch(...) {
+ result = false;
+ }
+
+ return result;
+}
+
+// for tests that are expected to fail quietly
+template<class temporal_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ boost::local_time::local_time_input_facet* facet)
+{
+ using namespace boost::local_time;
+ std::istringstream iss(input);
+ /* leave exceptions turned off
+ * iss.exceptions(std::ios_base::failbit); */
+ iss.imbue(std::locale(std::locale::classic(), facet));
+ try {
+ iss >> component;
+ }
+ catch(...) {
+ std::cout << "Caught unexpected exception" << std::endl;
+ return false;
+ }
+
+ return iss.fail(); // failbit must be set to pass test
+}
+
+int main() {
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+ time_zone_ptr null_zone;
+ local_date_time ldt1(not_a_date_time, null_zone);
+
+ // verify wide stream works, thorough tests done in narrow stream
+#if !defined(BOOST_NO_STD_WSTRING)
+ {
+ std::wstringstream ws;
+ ws.str(L"2005-Feb-15 12:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ws >> ldt1;
+ check("Wide stream, Eastern US, daylight savings, winter, minimal input",
+ ldt1.local_time() == ptime(date(2005,2,15), time_duration(12,15,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, minimal input",
+ ldt1.utc_time() == ptime(date(2005,2,15), time_duration(17,15,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, minimal input", !ldt1.is_dst());
+ ws.str(L"");
+ wlocal_time_input_facet* wfacet = new wlocal_time_input_facet(L"%m/%d/%y %ZP");
+ std::locale loc(std::locale::classic(), wfacet);
+ ws.imbue(loc);
+ ws.str(L"10/31/04 PST-08PDT,M4.1.0,M10.5.0"); // midnight on end transition day, still in dst
+ ws >> ldt1;
+ std::wcout << ldt1.local_time() << std::endl;
+ check("Wide stream, Eastern US, daylight savings, winter, custom format",
+ ldt1.local_time() == ptime(date(2004,10,31), time_duration(0,0,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, custom format",
+ ldt1.utc_time() == ptime(date(2004,10,31), time_duration(7,0,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, custom format", ldt1.is_dst());
+ }
+#endif // BOOST_NO_STD_WSTRING
+
+ std::stringstream ss;
+ ss.str("2005-Feb-25 12:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, winter, minimal input",
+ ldt1.local_time() == ptime(date(2005,2,25), time_duration(12,15,0)));
+ check("Eastern US, daylight savings, winter, minimal input",
+ ldt1.utc_time() == ptime(date(2005,2,25), time_duration(17,15,0)));
+ check("Eastern US, daylight savings, winter, minimal input", !ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Aug-25 12:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, summer, minimal input",
+ ldt1.local_time() == ptime(date(2005,8,25), time_duration(12,15,0)));
+ check("Eastern US, daylight savings, summer, minimal input",
+ ldt1.utc_time() == ptime(date(2005,8,25), time_duration(16,15,0)));
+ check("Eastern US, daylight savings, summer, minimal input", ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Apr-03 01:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ss.str("");
+ ss.str("2005-Apr-03 01:15:00 EST-05EDT,93,303");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Oct-30 00:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ss.str("");
+ ss.str("2005-Oct-30 00:15:00 EST-05EDT,93,303");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Aug-25 12:15:00 MST-07");
+ ss >> ldt1;
+ check("Mountain US, no daylight savings",
+ ldt1.local_time() == ptime(date(2005,8,25), time_duration(12,15,0)));
+ check("Mountain US, no daylight savings",
+ ldt1.utc_time() == ptime(date(2005,8,25), time_duration(19,15,0)));
+ check("Mountain US, no daylight savings", !ldt1.is_dst());
+ ss.str("");
+
+ // insure input & output formats match
+ local_time_facet* out_facet =
+ new local_time_facet(local_time_input_facet::default_time_input_format);
+ std::locale loc(std::locale::classic(), out_facet);
+ ss.imbue(loc);
+ time_zone_ptr syd_tz(new posix_time_zone("EST+10EST,M10.5.0,M3.5.0/03:00"));
+ ptime pt(date(2005,6,12), hours(0));
+ local_date_time ldt2(pt, syd_tz);
+ ss << ldt2;
+ ss >> ldt1;
+ check("Output as input makes match", ldt1 == ldt2);
+ check("Output as input makes match",
+ ldt1.zone()->dst_local_start_time(2004) == ldt2.zone()->dst_local_start_time(2004));
+ ss.str("");
+
+ time_zone_ptr f_tz(new posix_time_zone("FST+03FDT,90,300"));
+ ldt2 = local_date_time(ptime(date(2005,6,12), hours(0)), f_tz);
+ ss << ldt2;
+ ss >> ldt1;
+ check("Output as input makes match", ldt1 == ldt2);
+ check("Output as input makes match",
+ ldt1.zone()->dst_local_start_time(2004) == ldt2.zone()->dst_local_start_time(2004));
+ ss.str("");
+
+ // missing input & wrong format tests
+ ss.str("2005-Oct-30 00:15:00");
+ ss >> ldt1;
+ check("Missing time_zone spec makes UTC", ldt1.zone_as_posix_string() == std::string("UTC+00"));
+ check("Missing time_zone spec makes UTC", ldt1.utc_time() == ldt1.local_time());
+ ss.str("");
+ {
+ std::istringstream iss("2005-Aug-25 12:15:00 MST-07");
+ local_time_input_facet* f = new local_time_input_facet("%Y-%b-%d %H:%M:%S %z");
+ std::locale loc(std::locale::classic(), f);
+ iss.imbue(loc);
+ iss >> ldt1;
+ check("Wrong format flag makes UTC", ldt1.zone_as_posix_string() == std::string("UTC+00"));
+ check("Wrong format flag makes UTC", ldt1.utc_time() == ldt1.local_time());
+ }
+
+
+ // failure tests: (posix_time_zone) bad_offset, bad_adjustment,
+ // (local_date_time) ambiguous_result, time_label_invalid,
+ // time/date failures already tested
+ ambiguous_result amb_ex("default");
+ time_label_invalid inv_ex("default");
+ check("Failure test ambiguous time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ amb_ex,
+ new local_time_input_facet()));
+ check("Failure test ambiguous time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ new local_time_input_facet()));
+ check("Failure test ambiguous time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,93,303",
+ amb_ex,
+ new local_time_input_facet()));
+ check("Failure test ambiguous time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,93,303",
+ new local_time_input_facet()));
+ check("Failure test invalid time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ inv_ex,
+ new local_time_input_facet()));
+ check("Failure test invalid time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ new local_time_input_facet()));
+ check("Failure test invalid time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,93,303",
+ inv_ex,
+ new local_time_input_facet()));
+ check("Failure test invalid time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,93,303",
+ new local_time_input_facet()));
+
+
+ return printTestStats();
+}
diff --git a/libs/date_time/test/local_time/testlocal_time_iterator.cpp b/libs/date_time/test/local_time/testlocal_time_iterator.cpp
new file mode 100644
index 000000000..6ca84cb95
--- /dev/null
+++ b/libs/date_time/test/local_time/testlocal_time_iterator.cpp
@@ -0,0 +1,95 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include <iostream>
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+// #if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+// #include "boost/date_time/gregorian/formatters_limited.hpp"
+// #else
+// #include "boost/date_time/gregorian/formatters.hpp"
+// #endif
+
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+using namespace boost::local_time;
+
+void iterate_backward(const local_date_time *answers,
+ int ary_len,
+ const time_duration& td)
+{
+ int i = ary_len -1;
+ local_date_time end = answers[i];
+ local_time_iterator titr(end,td);
+
+ std::cout << "counting down by previous duration..." << std::endl;
+ for (; titr >= answers[0]; --titr) {
+ std::cout << *titr << std::endl;
+ check("iterating backward", answers[i] == *titr);
+ --i;
+ }
+ check("iterating backward count", i == -1); // check the number of iterations
+ std::cout << std::endl;
+}
+
+int
+main()
+{
+
+ time_zone_ptr ny_tz(new posix_time_zone("EST-05EDT,M4.1.0,M10.5.0"));
+
+ //set up a time right on the dst boundary -- iterator will
+ //jump forward an hour at the boundary
+ date d(2005,Apr,3);
+ time_duration dst_offset(1,59,59);
+ local_date_time start(d, dst_offset, ny_tz, false);
+
+ const local_date_time answer1[] =
+ {
+ local_date_time(d,dst_offset, ny_tz, false),
+ local_date_time(d,hours(3), ny_tz, true),
+ local_date_time(d,hours(3)+seconds(1), ny_tz, true),
+ local_date_time(d,hours(3)+seconds(2), ny_tz, true)
+ };
+
+ int i=0;
+ local_time_iterator titr(start,seconds(1));
+ local_date_time end = start + seconds(4);
+ for (; titr < end; ++titr) {
+ std::cout << (*titr) << std::endl;
+ check("iterator -- 1 sec", answer1[i] == *titr);
+ i++;
+ }
+ check("iterator -- 1 sec -- num iterations", i == 4); // check the number of iterations
+
+ iterate_backward(answer1, 4, seconds(1));
+
+ //iterate by hours
+ const local_date_time answer2[] =
+ { local_date_time(d,dst_offset, ny_tz, false),
+ local_date_time(d,dst_offset+hours(2), ny_tz, true),
+ local_date_time(d,dst_offset+hours(3), ny_tz, true),
+ local_date_time(d,dst_offset+hours(4), ny_tz, true)
+ };
+ i=0;
+ local_time_iterator titr2(start,hours(1));
+ local_date_time end2 = start + hours(4);
+ for (; titr2 < end2; ++titr2) {
+ std::cout << *titr2 << std::endl;
+ check("iterator -- 1 hour", answer2[i] == *titr2);
+ i++;
+ }
+ check("iterator -- 1 hour -- num iterations", i == 4);
+
+ iterate_backward(answer2, 4, hours(1));
+
+
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/local_time/testlocal_time_period.cpp b/libs/date_time/test/local_time/testlocal_time_period.cpp
new file mode 100644
index 000000000..64c8f7564
--- /dev/null
+++ b/libs/date_time/test/local_time/testlocal_time_period.cpp
@@ -0,0 +1,82 @@
+/* Copyright (c) 2005 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+
+int main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+ date d1(2001,Jan, 1);
+
+ time_zone_ptr az_tz(new posix_time_zone("MST-07"));
+
+ local_date_time t1 (d1,hours(2), az_tz, false);//2001-Jan-1 02:00:00
+
+ local_date_time t2 (d1,hours(3), az_tz, false);//2001-Jan-1 03:00:00
+ local_time_period p1(t1,t2); //2001-Jan-1 02:59:59
+ local_time_period p2(p1);
+ check("copy construct & ==", p1 == p2);
+ local_time_period p3 = p2;
+ check("assignment", p3 == p2);
+ local_time_period p4(t1,hours(1));
+
+ check("length", p4.length() == hours(1));
+
+// std::cout << to_simple_string(t1) << std::endl;
+// std::cout << to_simple_string(p4) << std::endl;
+// std::cout << to_simple_string(p1) << std::endl;
+ check("construction and ==", p1 == p4);
+ check("begin", p1.begin() == t1);
+ check("last", p1.end() == t2);
+ check("end", p1.last() == t2-time_duration::unit());
+
+// std::cout << to_simple_string(p1) << std::endl;
+// // check("last", p1.() == t2);
+ check("contains begin", p1.contains(t1));
+ check("contains end-not", !p1.contains(t2));
+ check("contains last", p1.contains(t2-seconds(1)));
+ local_date_time t3(date(2001,Jan,1),hours(4), az_tz, false);
+ local_time_period p5(t2,t3);
+ check("check contains", !p1.contains(p5.begin()));
+ check("check contains", !p5.contains(p1.begin()));
+ check("operator== not equal case", !(p1 == p5));
+ check("less than order", p1 < p5);
+ check("greater than order", p5 > p1);
+ check("not equal", p5 != p1);
+ check("intersects with myself", p1.intersects(p1));
+ check("not intersects", !(p1.intersects(p5)));
+ check("not intersects", !(p5.intersects(p1)));
+
+ local_time_period p6(p5);
+ p6.shift(minutes(30));
+// std::cout << to_simple_string(p5) << std::endl;
+// std::cout << to_simple_string(p6) << std::endl;
+ check("shifted intersects", p5.intersects(p6));
+ check("shifted intersects", p6.intersects(p5));
+ check("contains begin", p5.contains(p6.begin()));
+ p6.shift(minutes(30));
+// std::cout << to_simple_string(p5) << std::endl;
+// std::cout << to_simple_string(p6) << std::endl;
+ check("shifted !intersects", !p5.intersects(p6));
+ check("shifted !intersects", !p6.intersects(p5));
+ p6.shift(minutes(-30));
+// std::cout << to_simple_string(p5) << std::endl;
+// std::cout << to_simple_string(p6) << std::endl;
+ local_time_period p7 = p5.intersection(p6);
+// std::cout << to_simple_string(p7) << std::endl;
+ check("shifted intersection",
+ p7 == local_time_period(local_date_time(d1,time_duration(3,30,0), az_tz, false),
+ local_date_time(d1,time_duration(4,0,0), az_tz, false)));
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/local_time/testposix_time_zone.cpp b/libs/date_time/test/local_time/testposix_time_zone.cpp
new file mode 100644
index 000000000..8ebcbd60d
--- /dev/null
+++ b/libs/date_time/test/local_time/testposix_time_zone.cpp
@@ -0,0 +1,221 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+//#include "boost/date_time/local_time/time_zone.hpp"
+#include "../testfrmwk.hpp"
+
+#include "boost/date_time/local_time/posix_time_zone.hpp"
+
+#include <string>
+#include <iostream>
+
+int main(){
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ std::string specs[] = {"MST-07", "MST-07:00:00","EST-05EDT,M4.1.0,M10.5.0", "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00","PST-08PDT,J46/1:30,J310","PST-08PDT,45,310/0:30:00"};
+
+ posix_time_zone nyc1(specs[2]);
+ posix_time_zone nyc2(specs[3]);
+ time_duration td = hours(-5);
+
+ check("Has DST", nyc1.has_dst() && nyc2.has_dst());
+ check("UTC offset", nyc1.base_utc_offset() == td);
+ check("UTC offsets match", nyc1.base_utc_offset() == nyc2.base_utc_offset());
+ check("Abbrevs", nyc1.std_zone_abbrev() == std::string("EST"));
+ check("Abbrevs", nyc2.std_zone_abbrev() == std::string("EST"));
+ check("Abbrevs", nyc1.dst_zone_abbrev() == std::string("EDT"));
+ check("Abbrevs", nyc2.dst_zone_abbrev() == std::string("EDT"));
+ // names not available for posix_time_zone, abbrevs used in their place
+ check("Names", nyc1.std_zone_name() == std::string("EST"));
+ check("Names", nyc2.std_zone_name() == std::string("EST"));
+ check("Names", nyc1.dst_zone_name() == std::string("EDT"));
+ check("Names", nyc2.dst_zone_name() == std::string("EDT"));
+ td = hours(1);
+ check("dst offset", nyc1.dst_offset() == td);
+ check("dst offsets match", nyc1.dst_offset() == nyc2.dst_offset());
+ check("dst start", nyc1.dst_local_start_time(2003) ==
+ ptime(date(2003,Apr,6),time_duration(2,0,0)));
+ check("dst starts match", nyc1.dst_local_start_time(2003) ==
+ nyc2.dst_local_start_time(2003));
+ check("dst end", nyc1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,26),time_duration(2,0,0)));
+ check("dst ends match", nyc1.dst_local_end_time(2003) ==
+ nyc2.dst_local_end_time(2003));
+ check("to posix string",
+ nyc1.to_posix_string() == std::string("EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("to posix string",
+ nyc2.to_posix_string() == std::string("EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+
+
+ posix_time_zone az1(specs[0]);
+ posix_time_zone az2(specs[1]);
+ td = hours(-7);
+
+ check("Has DST", !az1.has_dst() && !az2.has_dst());
+ check("UTC offset", az1.base_utc_offset() == td);
+ check("UTC offsets match", az1.base_utc_offset() == az2.base_utc_offset());
+ check("dst start in non-dst zone",
+ az1.dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ az2.dst_local_end_time(2005) == ptime(not_a_date_time));
+ check("Abbrevs", az1.std_zone_abbrev() == std::string("MST"));
+ check("Abbrevs", az2.std_zone_abbrev() == std::string("MST"));
+ // non-dst zones default to empty strings for dst names & abbrevs
+ check("Abbrevs", az1.dst_zone_abbrev() == std::string(""));
+ check("Abbrevs", az2.dst_zone_abbrev() == std::string(""));
+ check("Names", az1.std_zone_name() == std::string("MST"));
+ check("Names", az2.std_zone_name() == std::string("MST"));
+ check("Names", az1.dst_zone_name() == std::string(""));
+ check("Names", az2.dst_zone_name() == std::string(""));
+ check("to posix string",
+ az1.to_posix_string() == std::string("MST-07"));
+ check("to posix string",
+ az2.to_posix_string() == std::string("MST-07"));
+
+
+ // bizzar time zone spec to fully test parsing
+ std::cout << "\nFictitious time zone" << std::endl;
+ posix_time_zone bz("BST+11:21:15BDT-00:28,M2.2.4/03:15:42,M11.5.2/01:08:53");
+ check("hast dst", bz.has_dst());
+ check("UTC offset", bz.base_utc_offset() == time_duration(11,21,15));
+ check("Abbrev", bz.std_zone_abbrev() == std::string("BST"));
+ check("Abbrev", bz.dst_zone_abbrev() == std::string("BDT"));
+ check("dst offset", bz.dst_offset() == time_duration(0,-28,0));
+ check("dst start", bz.dst_local_start_time(1962) ==
+ ptime(date(1962,Feb,8),time_duration(3,15,42)));
+ check("dst end", bz.dst_local_end_time(1962) ==
+ ptime(date(1962,Nov,27),time_duration(1,8,53)));
+
+ // only checking start & end rules w/ 'J' notation
+ std::cout << "\n'J' notation Start/End rule tests..." << std::endl;
+ posix_time_zone la1(specs[4]); // "PST-08PDT,J124,J310"
+ //posix_time_zone la1("PST-08PDT,J1,J365");// Jan1/Dec31
+ check("dst start", la1.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(1,30,0)));
+ check("dst end", la1.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(2,0,0)));
+ /* NOTE: la1 was created from a 'J' notation string but to_posix_string
+ * returns an 'n' notation string. The difference between the two
+ * is Feb-29 is always counted in an 'n' notation string and numbering
+ * starts at zero ('J' notation starts at one).
+ * Every possible date spec that can be written in 'J' notation can also
+ * be written in 'n' notation. The reverse is not true so 'n' notation
+ * is used as the output for to_posix_string(). */
+ check("to posix string",
+ la1.to_posix_string() == std::string("PST-08PDT+01,45/01:30,310/02:00"));
+
+ // only checking start & end rules w/ 'n' notation
+ std::cout << "\n'n' notation Start/End rule tests..." << std::endl;
+ posix_time_zone la2(specs[5]); // "PST-08PDT,124,310"
+ //posix_time_zone la2("PST-08PDT,0,365");// Jan1/Dec31
+ check("dst start", la2.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(2,0,0)));
+ check("dst end", la2.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(0,30,0)));
+ check("to posix string",
+ la2.to_posix_string() == std::string("PST-08PDT+01,45/02:00,310/00:30"));
+
+ // bad posix time zone strings tests
+ std::cout << "\nInvalid time zone string tests..." << std::endl;
+ try {
+ posix_time_zone badz("EST-13");
+ check("Exception not thrown: bad UTC offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ posix_time_zone badz("EST-5EDT24:00:01,J124/1:30,J310");
+ check("Exception not thrown: bad DST adjust", false);
+ }catch(bad_adjustment& badj){
+ std::string msg(badj.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ posix_time_zone badz("EST-5EDT01:00:00,J124/-1:30,J310");
+ check("Exception not thrown: bad DST start/end offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ posix_time_zone badz("EST-5EDT01:00:00,J124/1:30,J370");
+ check("Exception not thrown: invalid date spec", false);
+ }catch(boost::gregorian::bad_day_of_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(boost::gregorian::bad_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(...){
+ check("Unexpected exception caught: ", false);
+ }
+
+ std::cout << "\nTest some Central Europe specs" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ posix_time_zone cet_tz("CET+01:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", cet_tz.has_dst());
+ check("UTC offset", cet_tz.base_utc_offset() == hours(1));
+ check("Abbrevs", cet_tz.std_zone_abbrev() == std::string("CET"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::string("EST"));
+
+ std::cout << "\nTest some Central Austrialia UTC+8:30" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ posix_time_zone caus_tz("CAS+08:30:00CDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", caus_tz.has_dst());
+ check("UTC offset", caus_tz.base_utc_offset() == hours(8)+minutes(30));
+ check("Abbrevs", caus_tz.std_zone_abbrev() == std::string("CAS"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::string("EST"));
+
+ {
+ /**** first/last of month Julian & non-Julian tests ****/
+ // Mar-01 & Oct-31, count begins at 1
+ std::string spec("FST+3FDT,J60,J304");
+ posix_time_zone fl_1(spec);
+ check("Julian First/last of month", fl_1.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 Non-leap year, count begins at 0
+ spec = "FST+3FDT,59,304"; // "304" is not a mistake here, see posix_time_zone docs
+ posix_time_zone fl_2(spec);
+ try{
+ check("Non-Julian First/last of month", fl_2.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ }catch(std::exception& e){
+ check("Expected exception caught for Non-Julian day of 59, in non-leap year (Feb-29)", true);
+ }
+ check("Non-Julian First/last of month", fl_2.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 leap year, count begins at 0
+ spec = "FST+3FDT,60,304";
+ posix_time_zone fl_3(spec);
+ check("Non-Julian First/last of month", fl_3.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Non-Julian First/last of month", fl_3.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+ }
+
+ printTestStats();
+ return 0;
+}
+
diff --git a/libs/date_time/test/local_time/testtz_database.cpp b/libs/date_time/test/local_time/testtz_database.cpp
new file mode 100644
index 000000000..b86323e4e
--- /dev/null
+++ b/libs/date_time/test/local_time/testtz_database.cpp
@@ -0,0 +1,138 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+
+#include "../testfrmwk.hpp"
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time/custom_time_zone.hpp"
+#include "boost/date_time/local_time/local_time_types.hpp"
+#include "boost/date_time/local_time/tz_database.hpp"
+#include "boost/date_time/local_time/posix_time_zone.hpp"
+#include <iostream>
+
+bool run_bad_field_count_test();
+
+int main(){
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ /* NOTE: The testlocal_time_facet tests required full names
+ * be added to some of the date_time_zonespec.csv entries. The
+ * tests here also use those full names. Those entries are:
+ * Chicago, Denver, Los_Angeles, New_York, and Phoenix
+ * have all had full names added */
+
+ // run the exception tests first
+ try{
+ tz_database tz_db;
+ tz_db.load_from_file("missing_file.csv"); // file does not exist
+ }catch(data_not_accessible& e){
+ check("Caught Missing data file exception", true);
+ }catch(...){
+ check("Caught first unexpected exception", false);
+ }
+ check("Caught Bad field count exception", run_bad_field_count_test());
+
+ /* This test-file is usually run from either $BOOST_ROOT/status, or
+ * $BOOST_ROOT/libs/date_time/test. Therefore, the relative path
+ * to the data file this test depends on will be one of two
+ * possible paths.
+ *
+ * If the first attempt at opening the data file fails, an exception
+ * will be thrown. The handling of that exception consists of
+ * attempting to open it again but from a different location. If that
+ * also fails, we abort the test. */
+ tz_database tz_db;
+ try {
+ // first try to find the data file from the test dir
+ tz_db.load_from_file("../data/date_time_zonespec.csv");
+ }catch(data_not_accessible& e) {
+ // couldn't find the data file so assume we are being run from
+ // boost_root/status and try again
+ tz_db.load_from_file("../libs/date_time/data/date_time_zonespec.csv");
+ }catch(...) {
+ check("Cannot locate data file - aborting.", false);
+ return printTestStats();
+ }
+
+ time_zone_ptr bad_tz = tz_db.time_zone_from_region("Invalid/name");
+ check("Expected null pointer return", bad_tz == time_zone_ptr());
+
+ time_zone_ptr nyc_test = tz_db.time_zone_from_region("America/New_York");
+ check("nyc Valid pointer", nyc_test != time_zone_ptr() );
+ check("nyc Abbreviations",nyc_test->std_zone_abbrev() == std::string("EST"));
+ check("nyc Full Name", nyc_test->std_zone_name() == std::string("Eastern Standard Time"));
+ check("nyc Abbreviations",nyc_test->dst_zone_abbrev() == std::string("EDT"));
+ //std::cout << nyc_test->std_zone_name() << std::endl;
+ check("nyc Full Name", nyc_test->dst_zone_name() == std::string("Eastern Daylight Time"));
+ check("nyc GMT Offset", nyc_test->base_utc_offset() == hours(-5));
+ check("nyc DST Offset", nyc_test->dst_offset() == hours(1));
+ //std::cout << nyc_test->dst_local_start_time(2004) << std::endl;
+ check("nyc dst start", nyc_test->dst_local_start_time(2007) == ptime(date(2007, Mar, 11), hours(2)));
+ check("nyc dst end", nyc_test->dst_local_end_time(2007) == ptime(date(2007, Nov, 4), hours(2)));
+ check("nyc has dst", nyc_test->has_dst());
+
+ time_zone_ptr phx_test = tz_db.time_zone_from_region("America/Phoenix");
+ check("az Valid pointer", phx_test != time_zone_ptr() );
+ check("az Abbreviations",phx_test->std_zone_abbrev() == std::string("MST"));
+ check("az Full Name", phx_test->std_zone_name() == std::string("Mountain Standard Time"));
+ check("az Abbreviations", phx_test->dst_zone_abbrev() == std::string(""));
+ check("az Full Name", phx_test->dst_zone_name() == std::string(""));
+ check("az GMT Offset", phx_test->base_utc_offset() == hours(-7));
+ check("az DST Offset", phx_test->dst_offset() == hours(0));
+ //std::cout << phx_test->dst_local_start_time(2004) << std::endl;
+ check("az has dst", phx_test->has_dst() == false);
+
+ //Now add and retrieve a Posix tz spec from the database
+ time_zone_ptr eastern(new posix_time_zone("EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00"));
+ tz_db.add_record("United States/Eastern", eastern);
+ time_zone_ptr eastern_test = tz_db.time_zone_from_region("United States/Eastern");
+ check("eastern Valid pointer", eastern_test != time_zone_ptr() );
+ check("eastern Abbreviations",
+ eastern_test->std_zone_abbrev() == std::string("EST"));
+ check("eastern Abbreviations",
+ eastern_test->std_zone_name() == std::string("EST"));
+ check("eastern Abbreviations",
+ eastern_test->dst_zone_abbrev() == std::string("EDT"));
+ check("eastern Abbreviations",
+ eastern_test->dst_zone_name() == std::string("EDT"));
+ check("eastern GMT Offset", eastern_test->base_utc_offset() == hours(-5));
+ check("eastern dst start", eastern_test->dst_local_start_time(2004) == ptime(date(2004, Apr, 4), hours(2)));
+ check("eastern dst end", eastern_test->dst_local_end_time(2004) == ptime(date(2004, Oct, 31), hours(2)));
+ check("eastern has dst", eastern_test->has_dst() == true);
+
+
+ return printTestStats();
+}
+
+/* This test only checks to make sure the bad_field_count exception
+ * is properly thrown. It does not pay any attention to any other
+ * exception, those are tested elsewhere. */
+bool run_bad_field_count_test()
+{
+ using namespace boost::local_time;
+ bool caught_bfc = false;
+ tz_database other_db;
+ try{
+ other_db.load_from_file("local_time/poorly_formed_zonespec.csv");
+ }catch(bad_field_count& be){
+ caught_bfc = true;
+ }catch(...) {
+ // do nothing (file not found)
+ }
+ try{
+ other_db.load_from_file("../libs/date_time/test/local_time/poorly_formed_zonespec.csv");
+ }catch(bad_field_count& be){
+ caught_bfc = true;
+ }catch(...) {
+ // do nothing (file not found)
+ }
+ return caught_bfc;
+}
+
diff --git a/libs/date_time/test/local_time/testwcustom_time_zone.cpp b/libs/date_time/test/local_time/testwcustom_time_zone.cpp
new file mode 100644
index 000000000..b1ec07b93
--- /dev/null
+++ b/libs/date_time/test/local_time/testwcustom_time_zone.cpp
@@ -0,0 +1,89 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ typedef custom_time_zone_base<wchar_t> wcustom_time_zone;
+
+ boost::shared_ptr<dst_calc_rule>
+ rule1(new partial_date_dst_rule(partial_date(30,Apr),
+ partial_date(30,Oct)));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule2(new first_last_dst_rule(first_last_dst_rule::start_rule(Sunday,Apr),
+ first_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule>
+ rule3(new last_last_dst_rule(last_last_dst_rule::start_rule(Sunday,Mar),
+ last_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule> rule4; // no daylight savings
+
+ wtime_zone_names pst(L"Pacific Standard Time",
+ L"PST",
+ L"Pacific Daylight Time" ,
+ L"PDT");
+ wtime_zone_names mst(L"Mountain Standard Time",
+ L"MST",
+ L"" ,
+ L"");
+
+ dst_adjustment_offsets of(hours(1), hours(2), hours(2));
+ dst_adjustment_offsets of2(hours(0), hours(0), hours(0)); // no daylight savings
+
+ wtime_zone_ptr tz1(new wcustom_time_zone(pst, hours(-8), of, rule1));
+ wtime_zone_ptr tz2(new wcustom_time_zone(pst, hours(-8), of, rule2));
+ wtime_zone_ptr tz3(new wcustom_time_zone(pst, hours(-8), of, rule3));
+ wtime_zone_ptr tz4(new wcustom_time_zone(mst, hours(-7), of2, rule4));
+
+ check("out string",
+ tz1->dst_zone_abbrev() == std::wstring(L"PDT"));
+ check("out string",
+ tz1->std_zone_abbrev() == std::wstring(L"PST"));
+ check("out string",
+ tz1->std_zone_name() == std::wstring(L"Pacific Standard Time"));
+ check("out string",
+ tz1->dst_zone_name() == std::wstring(L"Pacific Daylight Time"));
+
+ check("dst offset", tz1->dst_offset() == hours(1));
+ check("base offset", tz1->base_utc_offset() == hours(-8));
+ check("has dst", tz1->has_dst());
+
+ check("dst start time",
+ tz1->dst_local_start_time(2003) == ptime(date(2003,Apr,30),hours(2)));
+ check("dst end time",
+ tz1->dst_local_end_time(2003) == ptime(date(2003,Oct,30),hours(2)));
+
+ check("tz1 to posix string",
+ tz1->to_posix_string() == std::wstring(L"PST-08PDT+01,120/02:00,303/02:00"));
+ check("tz2 to posix string",
+ tz2->to_posix_string() == std::wstring(L"PST-08PDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("tz3 to posix string",
+ tz3->to_posix_string() == std::wstring(L"PST-08PDT+01,M3.5.0/02:00,M10.5.0/02:00"));
+ check("tz4 to posix string",
+ tz4->to_posix_string() == std::wstring(L"MST-07"));
+
+ // test start/end for non-dst zone
+ check("has dst in non-dst zone", !tz4->has_dst());
+ check("dst start in non-dst zone",
+ tz4->dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ tz4->dst_local_end_time(2005) == ptime(not_a_date_time));
+
+
+ return printTestStats();
+}
+
+
diff --git a/libs/date_time/test/local_time/testwposix_time_zone.cpp b/libs/date_time/test/local_time/testwposix_time_zone.cpp
new file mode 100644
index 000000000..03e3af4ca
--- /dev/null
+++ b/libs/date_time/test/local_time/testwposix_time_zone.cpp
@@ -0,0 +1,224 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+//#include "boost/date_time/local_time/time_zone.hpp"
+#include "../testfrmwk.hpp"
+
+#include "boost/date_time/local_time/posix_time_zone.hpp"
+
+#include <string>
+#include <iostream>
+
+int main(){
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ typedef posix_time_zone_base<wchar_t> w_posix_time_zone;
+
+ std::wstring specs[] = {L"MST-07", L"MST-07:00:00",L"EST-05EDT,M4.1.0,M10.5.0", L"EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00",L"PST-08PDT,J46/1:30,J310",L"PST-08PDT,45,310/0:30:00"};
+
+ w_posix_time_zone nyc1(specs[2]);
+ w_posix_time_zone nyc2(specs[3]);
+ time_duration td = hours(-5);
+
+ check("Has DST", nyc1.has_dst() && nyc2.has_dst());
+ check("UTC offset", nyc1.base_utc_offset() == td);
+ check("UTC offsets match", nyc1.base_utc_offset() == nyc2.base_utc_offset());
+ check("Abbrevs", nyc1.std_zone_abbrev() == std::wstring(L"EST"));
+ check("Abbrevs", nyc2.std_zone_abbrev() == std::wstring(L"EST"));
+ check("Abbrevs", nyc1.dst_zone_abbrev() == std::wstring(L"EDT"));
+ check("Abbrevs", nyc2.dst_zone_abbrev() == std::wstring(L"EDT"));
+ // names not available for w_posix_time_zone, abbrevs used in their place
+ check("Names", nyc1.std_zone_name() == std::wstring(L"EST"));
+ check("Names", nyc2.std_zone_name() == std::wstring(L"EST"));
+ check("Names", nyc1.dst_zone_name() == std::wstring(L"EDT"));
+ check("Names", nyc2.dst_zone_name() == std::wstring(L"EDT"));
+ td = hours(1);
+ check("dst offset", nyc1.dst_offset() == td);
+ check("dst offsets match", nyc1.dst_offset() == nyc2.dst_offset());
+ check("dst start", nyc1.dst_local_start_time(2003) ==
+ ptime(date(2003,Apr,6),time_duration(2,0,0)));
+ check("dst starts match", nyc1.dst_local_start_time(2003) ==
+ nyc2.dst_local_start_time(2003));
+ check("dst end", nyc1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,26),time_duration(2,0,0)));
+ check("dst ends match", nyc1.dst_local_end_time(2003) ==
+ nyc2.dst_local_end_time(2003));
+ check("to posix string",
+ nyc1.to_posix_string() == std::wstring(L"EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("to posix string",
+ nyc2.to_posix_string() == std::wstring(L"EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+
+
+ w_posix_time_zone az1(specs[0]);
+ w_posix_time_zone az2(specs[1]);
+ td = hours(-7);
+
+ check("Has DST", !az1.has_dst() && !az2.has_dst());
+ check("UTC offset", az1.base_utc_offset() == td);
+ check("UTC offsets match", az1.base_utc_offset() == az2.base_utc_offset());
+ check("dst start in non-dst zone",
+ az1.dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ az2.dst_local_end_time(2005) == ptime(not_a_date_time));
+ check("Abbrevs", az1.std_zone_abbrev() == std::wstring(L"MST"));
+ check("Abbrevs", az2.std_zone_abbrev() == std::wstring(L"MST"));
+ // non-dst zones default to empty strings for dst names & abbrevs
+ check("Abbrevs", az1.dst_zone_abbrev() == std::wstring(L""));
+ check("Abbrevs", az2.dst_zone_abbrev() == std::wstring(L""));
+ check("Names", az1.std_zone_name() == std::wstring(L"MST"));
+ check("Names", az2.std_zone_name() == std::wstring(L"MST"));
+ check("Names", az1.dst_zone_name() == std::wstring(L""));
+ check("Names", az2.dst_zone_name() == std::wstring(L""));
+ check("to posix string",
+ az1.to_posix_string() == std::wstring(L"MST-07"));
+ check("to posix string",
+ az2.to_posix_string() == std::wstring(L"MST-07"));
+
+
+ // bizzar time zone spec to fully test parsing
+ std::cout << "\nFictitious time zone" << std::endl;
+ w_posix_time_zone bz(L"BST+11:21:15BDT-00:28,M2.2.4/03:15:42,M11.5.2/01:08:53");
+ check("hast dst", bz.has_dst());
+ check("UTC offset", bz.base_utc_offset() == time_duration(11,21,15));
+ check("Abbrev", bz.std_zone_abbrev() == std::wstring(L"BST"));
+ check("Abbrev", bz.dst_zone_abbrev() == std::wstring(L"BDT"));
+ check("dst offset", bz.dst_offset() == time_duration(0,-28,0));
+ check("dst start", bz.dst_local_start_time(1962) ==
+ ptime(date(1962,Feb,8),time_duration(3,15,42)));
+ check("dst end", bz.dst_local_end_time(1962) ==
+ ptime(date(1962,Nov,27),time_duration(1,8,53)));
+
+ // only checking start & end rules w/ 'J' notation
+ std::cout << "\n'J' notation Start/End rule tests..." << std::endl;
+ w_posix_time_zone la1(specs[4]); // "PST-08PDT,J124,J310"
+ //w_posix_time_zone la1("PST-08PDT,J1,J365");// Jan1/Dec31
+ check("dst start", la1.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(1,30,0)));
+ check("dst end", la1.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(2,0,0)));
+ /* NOTE: la1 was created from a 'J' notation string but to_posix_string
+ * returns an 'n' notation string. The difference between the two
+ * is Feb-29 is always counted in an 'n' notation string and numbering
+ * starts at zero ('J' notation starts at one).
+ * Every possible date spec that can be written in 'J' notation can also
+ * be written in 'n' notation. The reverse is not true so 'n' notation
+ * is used as the output for to_posix_string(). */
+ check("to posix string",
+ la1.to_posix_string() == std::wstring(L"PST-08PDT+01,45/01:30,310/02:00"));
+
+ // only checking start & end rules w/ 'n' notation
+ std::cout << "\n'n' notation Start/End rule tests..." << std::endl;
+ w_posix_time_zone la2(specs[5]); // "PST-08PDT,124,310"
+ //w_posix_time_zone la2("PST-08PDT,0,365");// Jan1/Dec31
+ check("dst start", la2.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(2,0,0)));
+ check("dst end", la2.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(0,30,0)));
+ check("to posix string",
+ la2.to_posix_string() == std::wstring(L"PST-08PDT+01,45/02:00,310/00:30"));
+
+ // bad posix time zone strings tests
+ std::cout << "\nInvalid time zone string tests..." << std::endl;
+ try {
+ w_posix_time_zone badz(L"EST-13");
+ check("Exception not thrown: bad UTC offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ w_posix_time_zone badz(L"EST-5EDT24:00:01,J124/1:30,J310");
+ check("Exception not thrown: bad DST adjust", false);
+ }catch(bad_adjustment& badj){
+ std::string msg(badj.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ w_posix_time_zone badz(L"EST-5EDT01:00:00,J124/-1:30,J310");
+ check("Exception not thrown: bad DST start/end offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ w_posix_time_zone badz(L"EST-5EDT01:00:00,J124/1:30,J370");
+ check("Exception not thrown: invalid date spec", false);
+ }catch(boost::gregorian::bad_day_of_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(boost::gregorian::bad_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(...){
+ check("Unexpected exception caught: ", false);
+ }
+
+ std::cout << "\nTest some Central Europe specs" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ w_posix_time_zone cet_tz(L"CET+01:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", cet_tz.has_dst());
+ check("UTC offset", cet_tz.base_utc_offset() == hours(1));
+ check("Abbrevs", cet_tz.std_zone_abbrev() == std::wstring(L"CET"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::wstring("EST"));
+
+ std::cout << "\nTest some Central Austrialia UTC+8:30" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ w_posix_time_zone caus_tz(L"CAS+08:30:00CDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", caus_tz.has_dst());
+ check("UTC offset", caus_tz.base_utc_offset() == hours(8)+minutes(30));
+ check("Abbrevs", caus_tz.std_zone_abbrev() == std::wstring(L"CAS"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::wstring("EST"));
+
+ {
+ /**** first/last of month Julian & non-Julian tests ****/
+ // Mar-01 & Oct-31, count begins at 1
+ std::wstring spec(L"FST+3FDT,J60,J304");
+ w_posix_time_zone fl_1(spec);
+ check("Julian First/last of month", fl_1.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 Non-leap year, count begins at 0
+ spec = L"FST+3FDT,59,304"; // "304" is not a mistake here, see posix_time_zone docs
+ w_posix_time_zone fl_2(spec);
+ try{
+ check("Non-Julian First/last of month", fl_2.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ }catch(std::exception& e){
+ check("Expected exception caught for Non-Julian day of 59, in non-leap year (Feb-29)", true);
+ }
+ check("Non-Julian First/last of month", fl_2.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 leap year, count begins at 0
+ spec = L"FST+3FDT,60,304";
+ w_posix_time_zone fl_3(spec);
+ check("Non-Julian First/last of month", fl_3.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Non-Julian First/last of month", fl_3.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+ }
+
+ printTestStats();
+ return 0;
+}
+
diff --git a/libs/date_time/test/posix_time/testc_local_adjustor.cpp b/libs/date_time/test/posix_time/testc_local_adjustor.cpp
new file mode 100644
index 000000000..76d6c0cf8
--- /dev/null
+++ b/libs/date_time/test/posix_time/testc_local_adjustor.cpp
@@ -0,0 +1,46 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/c_local_time_adjustor.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ //These are a compile check / test. They have to be hand inspected
+ //b/c they depend on the TZ settings of the machine and hence it is
+ //unclear what the results will be
+ typedef boost::date_time::c_local_adjustor<ptime> local_adj;
+
+ ptime t1(date(2002,Jan,1), hours(7)+millisec(5));
+ std::cout << "UTC <--> TZ Setting of Machine -- No DST" << std::endl;
+ ptime t2 = local_adj::utc_to_local(t1);
+ std::cout << to_simple_string(t2) << " LOCAL is "
+ << to_simple_string(t1) << " UTC time "
+ << std::endl;
+ time_duration td1 = t2 - t1;
+ std::cout << "A difference of: " << to_simple_string(td1)
+ << std::endl;
+
+
+ ptime t3(date(2002,May,1), hours(5)+millisec(5));
+ std::cout << "UTC <--> TZ Setting of Machine -- In DST" << std::endl;
+ ptime t4 = local_adj::utc_to_local(t3);
+ std::cout << to_simple_string(t4) << " LOCAL is "
+ << to_simple_string(t3) << " UTC time "
+ << std::endl;
+ time_duration td2 = t4 - t3;
+ std::cout << "A difference of: " << to_simple_string(td2)
+ << std::endl;
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/posix_time/testclock.cpp b/libs/date_time/test/posix_time/testclock.cpp
new file mode 100644
index 000000000..5478559c6
--- /dev/null
+++ b/libs/date_time/test/posix_time/testclock.cpp
@@ -0,0 +1,42 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include <boost/config.hpp>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ using namespace boost::posix_time;
+ ptime tl = second_clock::local_time();
+ std::cout << to_simple_string(tl) << std::endl;
+
+ ptime tu = second_clock::universal_time();
+ std::cout << to_simple_string(tu) << std::endl;
+
+#if !defined(BOOST_WINDOWS) && defined(_POSIX_TIMERS)
+ for (int i=0; i < 3; ++i) {
+ ptime t2 = second_clock::local_time();
+ std::cout << to_simple_string(t2) << std::endl;
+ sleep(1);
+ }
+#endif
+
+#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+ for (int i=0; i < 10; ++i) {
+ //ptime t2 = high_precision_clock::local_time();
+ ptime t2 = microsec_clock::local_time();
+ std::cout << to_simple_string(t2) << std::endl;
+ }
+#endif // BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+
+ return 0;
+
+}
+
diff --git a/libs/date_time/test/posix_time/testdst_rules.cpp b/libs/date_time/test/posix_time/testdst_rules.cpp
new file mode 100644
index 000000000..a0b069d6e
--- /dev/null
+++ b/libs/date_time/test/posix_time/testdst_rules.cpp
@@ -0,0 +1,451 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_timezone_defs.hpp"
+#include "../testfrmwk.hpp"
+
+// Define dst rule for Paraguay which is transitions forward on Oct 1 and
+// back Mar 1
+
+struct paraguay_dst_traits {
+ typedef boost::gregorian::date date_type;
+ typedef boost::gregorian::date::day_type day_type;
+ typedef boost::gregorian::date::month_type month_type;
+ typedef boost::gregorian::date::year_type year_type;
+ typedef boost::date_time::partial_date<boost::gregorian::date> start_rule_functor;
+ typedef boost::date_time::partial_date<boost::gregorian::date> end_rule_functor;
+ static day_type start_day(year_type) {return 1;}
+ static month_type start_month(year_type) {return boost::date_time::Oct;}
+ static day_type end_day(year_type) {return 1;}
+ static month_type end_month(year_type) {return boost::date_time::Mar;}
+ static int dst_start_offset_minutes() { return 120;}
+ static int dst_end_offset_minutes() { return 120; }
+ static int dst_shift_length_minutes() { return 60; }
+ static date_type local_dst_start_day(year_type year)
+ {
+ start_rule_functor start(start_day(year),
+ start_month(year));
+ return start.get_date(year);
+ }
+ static date_type local_dst_end_day(year_type year)
+ {
+ end_rule_functor end(end_day(year),
+ end_month(year));
+ return end.get_date(year);
+ }
+
+
+};
+
+
+// see http://www.timeanddate.com/time/aboutdst.html for some info
+// also
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ date d(2002,Feb,1);
+ ptime t(d);
+
+ //The following defines the US dst boundaries, except that the
+ //start and end dates are hard coded.
+ typedef boost::date_time::us_dst_rules<date, time_duration, 120, 60> us_dst;
+ date dst_start(2002,Apr, 7);
+ date dst_end(2002,Oct, 27);
+
+ ptime t3a(dst_start, time_duration(2,0,0)); //invalid time label
+ ptime t3b(dst_start, time_duration(2,59,59)); //invalid time label
+ ptime t4(dst_start, time_duration(1,59,59)); //not ds
+ ptime t5(dst_start, time_duration(3,0,0)); //always dst
+ ptime t6(dst_end, time_duration(0,59,59)); //is dst
+ ptime t7(dst_end, time_duration(1,0,0)); //ambiguous
+ ptime t8(dst_end, time_duration(1,59,59)); //ambiguous
+ ptime t9(dst_end, time_duration(2,0,0)); //always not dst
+
+ check("dst start", us_dst::local_dst_start_day(2002) == dst_start);
+ check("dst end", us_dst::local_dst_end_day(2002) == dst_end);
+ check("dst boundary", us_dst::is_dst_boundary_day(dst_start));
+ check("dst boundary", us_dst::is_dst_boundary_day(dst_end));
+ check("check if time is dst -- not",
+ us_dst::local_is_dst(t.date(), t.time_of_day())==boost::date_time::is_not_in_dst);
+ check("label on dst boundary invalid",
+ us_dst::local_is_dst(t3a.date(),t3a.time_of_day())==boost::date_time::invalid_time_label);
+ check("label on dst boundary invalid",
+ us_dst::local_is_dst(t3b.date(),t3b.time_of_day())==boost::date_time::invalid_time_label);
+ check("check if time is dst -- not",
+ us_dst::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ us_dst::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_in_dst);
+
+ check("check if time is dst -- not",
+ us_dst::local_is_dst(t6.date(),t6.time_of_day())==boost::date_time::is_in_dst);
+ check("check if time is dst -- ambig",
+ us_dst::local_is_dst(t7.date(),t7.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- ambig",
+ us_dst::local_is_dst(t8.date(),t8.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- not",
+ us_dst::local_is_dst(t9.date(),t9.time_of_day())==boost::date_time::is_not_in_dst);
+
+
+ //Now try a local without dst
+ typedef boost::date_time::null_dst_rules<date, time_duration> no_dst_adj;
+
+ check("check null dst rules",
+ no_dst_adj::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check null dst rules",
+ no_dst_adj::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check null dst rules",
+ no_dst_adj::utc_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check null dst rules",
+ no_dst_adj::utc_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_not_in_dst);
+
+
+ //Try a southern hemisphere adjustment calculation
+ //This is following the rules for South Australia as best I can
+ //decipher them. Basically conversion to DST is last Sunday in
+ //October 02:00:00 and conversion off of dst is last sunday in
+ //March 02:00:00.
+ //This stuff uses the dst calculator directly...
+ date dst_start2(2002,Oct,27); //last Sunday in Oct
+ date dst_end2(2002,Mar,31); //last Sunday in March
+
+ typedef boost::date_time::dst_calculator<date,time_duration> dstcalc;
+ //clearly not in dst
+ boost::date_time::time_is_dst_result a1 =
+ dstcalc::local_is_dst(date(2002,May,1),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+
+ check("check southern not dst", a1==boost::date_time::is_not_in_dst);
+
+ boost::date_time::time_is_dst_result a2 =
+ dstcalc::local_is_dst(date(2002,Jan,1),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+
+ check("check southern is dst", a2==boost::date_time::is_in_dst);
+
+ boost::date_time::time_is_dst_result a3 =
+ dstcalc::local_is_dst(date(2002,Oct,28),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+
+ check("check southern is dst", a3==boost::date_time::is_in_dst);
+ boost::date_time::time_is_dst_result a4 =
+ dstcalc::local_is_dst(date(2002,Oct,27),time_duration(1,59,59),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-not dst", a4==boost::date_time::is_not_in_dst);
+ boost::date_time::time_is_dst_result a5 =
+ dstcalc::local_is_dst(date(2002,Oct,27),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-is dst", a5==boost::date_time::is_in_dst);
+ boost::date_time::time_is_dst_result a6 =
+ dstcalc::local_is_dst(date(2002,Oct,27),hours(2),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-invalid time", a6==boost::date_time::invalid_time_label);
+ boost::date_time::time_is_dst_result a7 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(1,59,59),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-is dst", a7==boost::date_time::is_in_dst);
+ boost::date_time::time_is_dst_result a8 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,0,0),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-ambiguous", a8==boost::date_time::ambiguous);
+ boost::date_time::time_is_dst_result a9 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,59,59),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-ambiguous", a9==boost::date_time::ambiguous);
+ boost::date_time::time_is_dst_result a10 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(3,0,0),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-not", a10==boost::date_time::is_not_in_dst);
+
+ /******************** post release 1 -- new dst calc engine ********/
+
+ typedef boost::date_time::us_dst_trait<date> us_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration, us_dst_traits>
+ us_dst_calc2;
+
+ {
+ // us_dst_calc2
+ check("dst start", us_dst_calc2::local_dst_start_day(2002) == dst_start);
+ check("dst end", us_dst_calc2::local_dst_end_day(2002) == dst_end);
+ // std::cout << us_dst_calc2::local_dst_end_day(2002) << std::endl;
+ check("dst boundary", us_dst_calc2::is_dst_boundary_day(dst_start));
+ check("dst boundary", us_dst_calc2::is_dst_boundary_day(dst_end));
+
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t.date(), t.time_of_day())==boost::date_time::is_not_in_dst);
+ check("label on dst boundary invalid",
+ us_dst_calc2::local_is_dst(t3a.date(),t3a.time_of_day())==boost::date_time::invalid_time_label);
+ check("label on dst boundary invalid",
+ us_dst_calc2::local_is_dst(t3b.date(),t3b.time_of_day())==boost::date_time::invalid_time_label);
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ us_dst_calc2::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_in_dst);
+
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t6.date(),t6.time_of_day())==boost::date_time::is_in_dst);
+ check("check if time is dst -- ambig",
+ us_dst_calc2::local_is_dst(t7.date(),t7.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- ambig",
+ us_dst_calc2::local_is_dst(t8.date(),t8.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t9.date(),t9.time_of_day())==boost::date_time::is_not_in_dst);
+ }
+ {
+ //some new checks for the new 2007 us dst rules
+ date dst_start07(2007,Mar, 11);
+ date dst_end07(2007,Nov, 4);
+
+ check("dst start07", us_dst_calc2::local_dst_start_day(2007) == dst_start07);
+ check("dst end07", us_dst_calc2::local_dst_end_day(2007) == dst_end07);
+ check("dst boundary07", us_dst_calc2::is_dst_boundary_day(dst_start07));
+ check("dst boundary07", us_dst_calc2::is_dst_boundary_day(dst_end07));
+
+ date dst_start08(2008,Mar, 9);
+ date dst_end08(2008,Nov, 2);
+
+ check("dst start08", us_dst_calc2::local_dst_start_day(2008) == dst_start08);
+ check("dst end08", us_dst_calc2::local_dst_end_day(2008) == dst_end08);
+ check("dst boundary08", us_dst_calc2::is_dst_boundary_day(dst_start08));
+ check("dst boundary08", us_dst_calc2::is_dst_boundary_day(dst_end08));
+
+ date dst_start09(2009,Mar, 8);
+ date dst_end09(2009,Nov, 1);
+
+ check("dst start09", us_dst_calc2::local_dst_start_day(2009) == dst_start09);
+ check("dst end09", us_dst_calc2::local_dst_end_day(2009) == dst_end09);
+ check("dst boundary09", us_dst_calc2::is_dst_boundary_day(dst_start09));
+ check("dst boundary09", us_dst_calc2::is_dst_boundary_day(dst_end09));
+
+ }
+
+
+
+ /******************** post release 1 -- new dst calc engine - eu dst ********/
+
+
+ typedef boost::date_time::eu_dst_trait<date> eu_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration, eu_dst_traits>
+ eu_dst_calc;
+ date eu_dst_start(2002,Mar, 31);
+ date eu_dst_end(2002,Oct, 27);
+ ptime eu_invalid1(eu_dst_start, time_duration(2,0,0)); //invalid time label
+ ptime eu_invalid2(eu_dst_start, time_duration(2,59,59)); //invalid time label
+ ptime eu_notdst1(eu_dst_start, time_duration(1,59,59)); //not ds
+ ptime eu_isdst1(eu_dst_start, time_duration(3,0,0)); //always dst
+ ptime eu_isdst2(eu_dst_end, time_duration(1,59,59)); //is dst
+ ptime eu_amgbig1(eu_dst_end, time_duration(2,0,0)); //ambiguous
+ ptime eu_amgbig2(eu_dst_end, time_duration(2,59,59)); //ambiguous
+ ptime eu_notdst2(eu_dst_end, time_duration(3,0,0)); //always not dst
+
+ check("eu dst start", eu_dst_calc::local_dst_start_day(2002) == eu_dst_start);
+ check("eu dst end", eu_dst_calc::local_dst_end_day(2002) == eu_dst_end);
+ check("eu dst boundary", eu_dst_calc::is_dst_boundary_day(eu_dst_start));
+ check("eu dst boundary", eu_dst_calc::is_dst_boundary_day(eu_dst_end));
+ // on forward shift boundaries
+ check("eu label on dst boundary invalid",
+ eu_dst_calc::local_is_dst(eu_invalid1.date(),eu_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("eu label on dst boundary invalid",
+ eu_dst_calc::local_is_dst(eu_invalid2.date(),eu_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("eu check if time is dst -- not",
+ eu_dst_calc::local_is_dst(eu_notdst1.date(),eu_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ eu_dst_calc::local_is_dst(eu_isdst1.date(),eu_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("eu check if time is dst -- yes",
+ eu_dst_calc::local_is_dst(eu_isdst2.date(),eu_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("eu check if time is dst -- ambig",
+ eu_dst_calc::local_is_dst(eu_amgbig1.date(),eu_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("eu check if time is dst -- ambig",
+ eu_dst_calc::local_is_dst(eu_amgbig2.date(),eu_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("eu check if time is dst -- not",
+ eu_dst_calc::local_is_dst(eu_notdst2.date(),eu_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+
+/******************** post release 1 -- new dst calc engine - gb dst ********/
+
+
+ /* Several places in Great Britan use eu start and end rules for the
+ day, but different local conversion times (eg: forward change at 1:00
+ am local and backward change at 2:00 am dst instead of 2:00am
+ forward and 3:00am back for the EU).
+ */
+
+ typedef boost::date_time::uk_dst_trait<date> uk_dst_traits;
+
+ typedef boost::date_time::dst_calc_engine<date, time_duration, uk_dst_traits> uk_dst_calc;
+
+
+ date uk_dst_start(2002,Mar, 31);
+ date uk_dst_end(2002,Oct, 27);
+ ptime uk_invalid1(uk_dst_start, time_duration(1,0,0)); //invalid time label
+ ptime uk_invalid2(uk_dst_start, time_duration(1,59,59)); //invalid time label
+ ptime uk_notdst1(uk_dst_start, time_duration(0,59,59)); //not ds
+ ptime uk_isdst1(uk_dst_start, time_duration(2,0,0)); //always dst
+ ptime uk_isdst2(uk_dst_end, time_duration(0,59,59)); //is dst
+ ptime uk_amgbig1(uk_dst_end, time_duration(1,0,0)); //ambiguous
+ ptime uk_amgbig2(uk_dst_end, time_duration(1,59,59)); //ambiguous
+ ptime uk_notdst2(uk_dst_end, time_duration(3,0,0)); //always not dst
+
+ check("uk dst start", uk_dst_calc::local_dst_start_day(2002) == uk_dst_start);
+ check("uk dst end", uk_dst_calc::local_dst_end_day(2002) == uk_dst_end);
+ check("uk dst boundary", uk_dst_calc::is_dst_boundary_day(uk_dst_start));
+ check("uk dst boundary", uk_dst_calc::is_dst_boundary_day(uk_dst_end));
+ // on forward shift boundaries
+ check("uk label on dst boundary invalid",
+ uk_dst_calc::local_is_dst(uk_invalid1.date(),uk_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("uk label on dst boundary invalid",
+ uk_dst_calc::local_is_dst(uk_invalid2.date(),uk_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("uk check if time is dst -- not",
+ uk_dst_calc::local_is_dst(uk_notdst1.date(),uk_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("uk check if time is dst -- yes",
+ uk_dst_calc::local_is_dst(uk_isdst1.date(),uk_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("uk check if time is dst -- yes",
+ uk_dst_calc::local_is_dst(uk_isdst2.date(),uk_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("uk check if time is dst -- ambig",
+ uk_dst_calc::local_is_dst(uk_amgbig1.date(),uk_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("uk check if time is dst -- ambig",
+ uk_dst_calc::local_is_dst(uk_amgbig2.date(),uk_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("uk check if time is dst -- not",
+ uk_dst_calc::local_is_dst(uk_notdst2.date(),uk_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+
+
+// /******************** post release 1 -- new dst calc engine ********/
+
+// //Define dst rule for Paraguay which is transitions forward on Oct 1 and back Mar 1
+
+ typedef boost::date_time::dst_calc_engine<date, time_duration,
+ paraguay_dst_traits> pg_dst_calc;
+
+ {
+
+ date pg_dst_start(2002,Oct, 1);
+ date pg_dst_end(2002,Mar, 1);
+ date pg_indst(2002,Dec, 1);
+ date pg_notdst(2002,Jul, 1);
+ ptime pg_invalid1(pg_dst_start, time_duration(2,0,0)); //invalid time label
+ ptime pg_invalid2(pg_dst_start, time_duration(2,59,59)); //invalid time label
+ ptime pg_notdst1(pg_dst_start, time_duration(1,59,59)); //not ds
+ ptime pg_isdst1(pg_dst_start, time_duration(3,0,0)); //always dst
+ ptime pg_isdst2(pg_dst_end, time_duration(0,59,59)); //is dst
+ ptime pg_amgbig1(pg_dst_end, time_duration(1,0,0)); //ambiguous
+ ptime pg_amgbig2(pg_dst_end, time_duration(1,59,59)); //ambiguous
+ ptime pg_notdst2(pg_dst_end, time_duration(2,0,0)); //always not dst
+
+ check("pg dst start", pg_dst_calc::local_dst_start_day(2002) == pg_dst_start);
+ check("pg dst end", pg_dst_calc::local_dst_end_day(2002) == pg_dst_end);
+ check("pg dst boundary", pg_dst_calc::is_dst_boundary_day(pg_dst_start));
+ check("pg dst boundary", pg_dst_calc::is_dst_boundary_day(pg_dst_end));
+ // on forward shift boundaries
+ check("pg label on dst boundary invalid",
+ pg_dst_calc::local_is_dst(pg_invalid1.date(),pg_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("pg label on dst boundary invalid",
+ pg_dst_calc::local_is_dst(pg_invalid2.date(),pg_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("pg check if time is dst -- not",
+ pg_dst_calc::local_is_dst(pg_notdst1.date(),pg_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ pg_dst_calc::local_is_dst(pg_isdst1.date(),pg_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("pg check if time is dst -- yes",
+ pg_dst_calc::local_is_dst(pg_isdst2.date(),pg_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("pg check if time is dst -- ambig",
+ pg_dst_calc::local_is_dst(pg_amgbig1.date(),pg_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("pg check if time is dst -- ambig",
+ pg_dst_calc::local_is_dst(pg_amgbig2.date(),pg_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("pg check if time is dst -- not",
+ pg_dst_calc::local_is_dst(pg_notdst2.date(),pg_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+ // a couple not on the boudnary
+ check("pg check if time is dst -- yes",
+ pg_dst_calc::local_is_dst(pg_indst,time_duration(0,0,0))==boost::date_time::is_in_dst);
+ check("pg check if time is dst -- not",
+ pg_dst_calc::local_is_dst(pg_notdst,time_duration(0,0,0))==boost::date_time::is_not_in_dst);
+
+ }
+
+// /******************** post release 1 -- new dst calc engine ********/
+
+// //Define dst rule for Adelaide australia
+
+ typedef boost::date_time::acst_dst_trait<date> acst_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration,
+ acst_dst_traits> acst_dst_calc;
+
+ {
+
+ date acst_dst_start(2002,Oct, 27);
+ date acst_dst_end(2002,Mar, 31);
+ date acst_indst(2002,Dec, 1);
+ date acst_notdst(2002,Jul, 1);
+ ptime acst_invalid1(acst_dst_start, time_duration(2,0,0)); //invalid time label
+ ptime acst_invalid2(acst_dst_start, time_duration(2,59,59)); //invalid time label
+ ptime acst_notdst1(acst_dst_start, time_duration(1,59,59)); //not ds
+ ptime acst_isdst1(acst_dst_start, time_duration(3,0,0)); //always dst
+ ptime acst_isdst2(acst_dst_end, time_duration(1,59,59)); //is dst
+ ptime acst_amgbig1(acst_dst_end, time_duration(2,0,0)); //ambiguous
+ ptime acst_amgbig2(acst_dst_end, time_duration(2,59,59)); //ambiguous
+ ptime acst_notdst2(acst_dst_end, time_duration(3,0,0)); //always not dst
+
+// std::cout << "acst dst_start: " << acst_dst_calc::local_dst_start_day(2002)
+// << std::endl;
+ check("acst dst start", acst_dst_calc::local_dst_start_day(2002) == acst_dst_start);
+ check("acst dst end", acst_dst_calc::local_dst_end_day(2002) == acst_dst_end);
+ check("acst dst boundary", acst_dst_calc::is_dst_boundary_day(acst_dst_start));
+ check("acst dst boundary", acst_dst_calc::is_dst_boundary_day(acst_dst_end));
+ // on forward shift boundaries
+ check("acst label on dst boundary invalid",
+ acst_dst_calc::local_is_dst(acst_invalid1.date(),acst_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("acst label on dst boundary invalid",
+ acst_dst_calc::local_is_dst(acst_invalid2.date(),acst_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("acst check if time is dst -- not",
+ acst_dst_calc::local_is_dst(acst_notdst1.date(),acst_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ acst_dst_calc::local_is_dst(acst_isdst1.date(),acst_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("acst check if time is dst -- yes",
+ acst_dst_calc::local_is_dst(acst_isdst2.date(),acst_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("acst check if time is dst -- ambig",
+ acst_dst_calc::local_is_dst(acst_amgbig1.date(),acst_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("acst check if time is dst -- ambig",
+ acst_dst_calc::local_is_dst(acst_amgbig2.date(),acst_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("acst check if time is dst -- not",
+ acst_dst_calc::local_is_dst(acst_notdst2.date(),acst_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+ // a couple not on the boudnary
+ check("acst check if time is dst -- yes",
+ acst_dst_calc::local_is_dst(acst_indst,time_duration(0,0,0))==boost::date_time::is_in_dst);
+ check("acst check if time is dst -- not",
+ acst_dst_calc::local_is_dst(acst_notdst,time_duration(0,0,0))==boost::date_time::is_not_in_dst);
+ // ptime utc_t = ptime(acst_dst_start, hours(2)) - time_duration(16,30,0);
+ // std::cout << "UTC date/time of Adelaide switch over: " << utc_t << std::endl;
+
+ }
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testduration.cpp b/libs/date_time/test/posix_time/testduration.cpp
new file mode 100644
index 000000000..3d793333b
--- /dev/null
+++ b/libs/date_time/test/posix_time/testduration.cpp
@@ -0,0 +1,272 @@
+/* Copyright (c) 2002-2004 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-10-10 12:05:03 -0700 (Wed, 10 Oct 2012) $
+ */
+
+#include "boost/date_time/posix_time/posix_time_duration.hpp"
+#include "boost/date_time/compiler_config.hpp"
+#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+#include "boost/date_time/posix_time/time_formatters_limited.hpp"
+#else
+#include "boost/date_time/posix_time/time_formatters.hpp"
+#endif
+#include "../testfrmwk.hpp"
+
+
+int
+main()
+{
+ using namespace boost::posix_time;
+
+
+// std::cout << "Default limits: SECOND " << std::endl;
+ {
+ time_duration td;
+ check("default construction -- 0 ticks", td.ticks() == 0);
+// check("default construction -- 0 secs", td.seconds() == 0);
+// check("default construction -- 0 min", td.minutes() == 0);
+ }
+
+ // construct from components
+ time_duration td1(1,25,0);
+ time_duration td3(td1.hours(),td1.minutes(),td1.seconds());
+ check("total up elements", td1 == td3);
+ td1 = -td1; // td1 == "-1:25:00"
+ td3 = time_duration(td1.hours(),td1.minutes(),td1.seconds());
+ check("total up elements-invered sign", td1 == td3);
+
+
+ time_duration t_1(0,1,40);
+ time_duration t_2(0,1,41);
+ check("less test", !(t_2 < t_2));
+ check("equal test", t_1 == t_1);
+ check("greater equal - equal", t_1 >= t_1);
+ check("greater equal - greater", t_2 >= t_1);
+ check("less equal - equal ", t_2 <= t_2);
+ check("greater ", t_2 > t_1);
+ check("greater - not ", !(t_1 > t_2));
+ time_duration t_3(t_2);
+ check("copy constructor ", t_2 == t_3);
+ time_duration t_4 = t_3;
+ check("assignment operator ", t_2 == t_4);
+
+ time_duration t_5(1,30,20,10); // 1hr, 30min, 20sec, 10 frac sec
+ t_5 /= 2;
+ check("divide equal", (t_5.hours() == 0 &&
+ t_5.minutes() == 45 &&
+ t_5.seconds() == 10 &&
+ t_5.fractional_seconds() == 5));
+ t_5 = time_duration(3,15,8,0) / 2;
+ check("divide int", t_5 == time_duration(1,37,34,0));
+ {
+ time_duration td = hours(5);
+ td *= 5;
+ check("mult-equals int", time_duration(25,0,0,0) == td);
+ }
+
+
+ t_5 = t_2 + t_1;
+ //VC6 goes ambiguous on the next line...
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+ //sorry ticks() doesn't work on VC6
+#else
+ std::cout << t_5.ticks() << std::endl;
+#endif
+ check("add", t_5 == time_duration(0,3,21));
+ time_duration td_a(5,5,5,5);
+ time_duration td_b(4,4,4,4);
+ time_duration td_c(2,2,2,2);
+ td_a += td_b;
+ check("add equal", td_a == time_duration(9,9,9,9));
+ time_duration td_d = td_b - td_c;
+ check("subtract", td_d == time_duration(2,2,2,2));
+ td_d -= td_b;
+ check("subtract equal (neg result)", td_d == td_c - td_b);
+
+ time_duration utd(1,2,3,4);
+ time_duration utd2 = -utd;
+ //std::cout << td_d << '\n' << utd2 << std::endl;
+ check("unary-", ((utd2.hours() == -1) &&
+ (utd2.minutes() == -2) &&
+ (utd2.seconds() == -3) &&
+ (utd2.fractional_seconds() == -4)) );
+ utd2 = -hours(5);
+ check("unary-", utd2.hours() == -5);
+ utd2 = -utd2;
+ check("unary-", utd2.hours() == 5);
+
+ time_duration t_6(5,4,3); //05:04:03
+ check("h-m-s 5-4-3 hours", t_6.hours() == 5);
+ check("h-m-s 5-4-3 minutes", t_6.minutes() == 4);
+ check("h-m-s 5-4-3 seconds", t_6.seconds() == 3);
+ std::cout << t_6.total_seconds() << std::endl;
+ check("h-m-s 5-4-3 total_seconds", t_6.total_seconds() == 18243);
+
+ hours tenhours(10);
+ minutes fivemin(5);
+ time_duration t7 = time_duration(1,2,3) + tenhours + fivemin;
+ check("short hand durations add", t7 == time_duration(11,7,3));
+ time_duration t8 = tenhours + time_duration(1,2,3) + fivemin;
+ check("short hand durations add", t8 == time_duration(11,7,3));
+
+ if (time_duration::resolution() >= boost::date_time::micro) {
+ time_duration t_9(5,4,3,9876); //05:04:03.09876
+ check("h-m-s 5-4-3.21 hours", t_9.hours() == 5);
+ check("h-m-s 5-4-3.21 min ", t_9.minutes() == 4);
+ check("h-m-s 5-4-3.21 sec ", t_9.seconds() == 3);
+ check("h-m-s 5-4-3.21 fs ", t_9.fractional_seconds() == 9876);
+ check("h-m-s 5-4-3.21 total_seconds", t_9.total_seconds() == 18243);
+ // check("h-m-s 5-4-3.21 fs ", t_9.fs_as_double() == 0.9876);
+ //std::cout << t_9.fs_as_double() << std::endl;
+ std::cout << to_simple_string(t_9) << std::endl;
+ }
+
+ if (time_duration::resolution() >= boost::date_time::tenth) {
+ time_duration t_10(5,4,3,9); //05:04:03.00001
+ check("h-m-s 5-4-3.9 hours", t_10.hours() == 5);
+ check("h-m-s 5-4-3.9 min ", t_10.minutes() == 4);
+ check("h-m-s 5-4-3.9 sec ", t_10.seconds() == 3);
+ check("h-m-s 5-4-3.9 fs ", t_10.fractional_seconds() == 9);
+ check("h-m-s 5-4-3.9 total_seconds", t_10.total_seconds() == 18243);
+ std::cout << to_simple_string(t_10) << std::endl;
+ }
+
+ if (time_duration::resolution() >= boost::date_time::milli) {
+ millisec ms(9);
+ // time_duration t_10(0,0,0,); //00:00:00.009
+ std::cout << "time_resolution: " << time_duration::resolution() << std::endl;
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+ //sorry res_adjust() doesn't work on VC6
+#else
+ std::cout << "res_adjust " << time_res_traits::res_adjust() << std::endl;
+#endif
+ if (time_duration::resolution() == boost::date_time::nano) {
+ check("millisec", ms.fractional_seconds() == 9000000);
+ check("total_seconds - nofrac", ms.total_seconds() == 0);
+ check("total_millisec", ms.total_milliseconds() == 9);
+ check("ticks per second", time_duration::ticks_per_second() == 1000000000);
+ }
+ else {
+ check("millisec 9000", ms.fractional_seconds() == 9000);
+ check("total_seconds - nofrac", ms.total_seconds() == 0);
+ check("total_millisec", ms.total_milliseconds() == 9);
+ }
+ }
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ if (time_duration::resolution() >= boost::date_time::nano) {
+ nanosec ns(9);
+ // time_duration t_10(0,0,0,); //00:00:00.00009
+ check("nanosec", ns.fractional_seconds() == 9);
+ check("total nanosec", ns.total_nanoseconds() == 9);
+ check("total microsec - truncated", ns.total_microseconds() == 0);
+ std::cout << to_simple_string(ns) << std::endl;
+ time_duration ns18 = ns + ns;
+ check("nanosec", ns18.fractional_seconds() == 18);
+ std::cout << to_simple_string(ns18) << std::endl;
+ nanosec ns2(1000000000); //one second
+ check("nano to second compare", ns2 == seconds(1));
+ check("check total seconds", ns2.total_seconds() == 1);
+ std::cout << to_simple_string(ns2) << std::endl;
+ check("division of nanoseconds", (nanosec(3)/2) == nanosec(1));
+ check("multiplication of nanosec", nanosec(3)*1000 == microsec(3));
+ }
+#endif
+
+ // Test for overflows (ticket #3471)
+ {
+ ptime start(boost::gregorian::date(2000, 1, 1));
+ ptime end(boost::gregorian::date(2000, 5, 1));
+ time_duration td = end - start;
+ ptime end2 = start + microseconds(td.total_microseconds());
+ check("microseconds constructor overflow", end == end2);
+ }
+
+ time_duration t_11(3600,0,0);
+ check("3600 hours ", t_11.hours() == 3600);
+ check("total seconds 3600 hours", t_11.total_seconds() == 12960000);
+
+ time_duration td_12(1,2,3,10);
+ std::cout << td_12.total_seconds() << std::endl;
+ check("total seconds 3723 hours", td_12.total_seconds() == 3723);
+
+ // time_duration t_11a = t_11/time_duration(0,3,0);
+
+ check("division", (hours(2)/2) == hours(1));
+ check("division", (hours(3)/2) == time_duration(1,30,0));
+ check("division", (hours(3)/3) == hours(1));
+ check("multiplication", time_duration(3,0,0)*2 == hours(6));
+ check("multiplication", hours(3600)*1000 == hours(3600000));
+
+ // special_values operations
+ time_duration pi_dur(pos_infin), ni_dur(neg_infin), ndt_dur(not_a_date_time);
+ check("+infin + -infin", pi_dur + ni_dur == ndt_dur);
+ check("infin / int", pi_dur / 3 == pi_dur);
+ check("infin + duration", pi_dur + td_12 == pi_dur);
+ check("infin - duration", pi_dur - td_12 == pi_dur);
+ check("unary-", -pi_dur == ni_dur);
+ check("-infin less than +infin", ni_dur < pi_dur);
+ check("-infin less than duration", ni_dur < td_12);
+ check("+infin greater than duration", pi_dur > td_12);
+ std::string result(""), answer("+infinity");
+ result = to_simple_string(pi_dur);
+ check("to string +infin", result==answer);
+ result = to_simple_string(ni_dur);
+ answer = "-infinity";
+ check("to string +infin", result==answer);
+ result = to_simple_string(ndt_dur);
+ //answer = "not-a-number";
+ answer = "not-a-date-time";
+ check("to string +infin", result==answer);
+
+ using namespace boost::gregorian;
+ ptime t1(date(2001,7,14));
+ ptime t2(date(2002,7,14));
+ check("One year of hours: 365*24=8760", 365*24 == ((t2-t1).hours()));
+ check("Total seconds in a year", 365*24*3600 == ((t2-t1).total_seconds()));
+
+ std::cout << to_simple_string(time_duration(20000 * 24, 0, 0, 0)) << std::endl;
+ std::cout << to_simple_string(time_duration(24855 * 24, 0, 0, 0)) << std::endl;
+ std::cout << to_simple_string(time_duration(24856 * 24, 0, 0, 0)) << std::endl;
+ std::cout << to_simple_string(time_duration(25000 * 24, 0, 0, 0)) << std::endl;
+ time_duration tdl1(25000*24, 0, 0, 0);
+ check("600000 hours", tdl1.hours() == 600000);
+ time_duration tdl2(2000000, 0, 0, 0);
+ check("2000000 hours", tdl2.hours() == 2000000);
+
+ check("total milliseconds", seconds(1).total_milliseconds() == 1000);
+ check("total microseconds", seconds(1).total_microseconds() == 1000000);
+ check("total nanoseconds", seconds(1).total_nanoseconds() == 1000000000);
+ check("total milliseconds", hours(1).total_milliseconds() == 3600*1000);
+ boost::int64_t tms = static_cast<boost::int64_t>(3600)*1000000*1001; //ms per sec
+ check("total microseconds 1000 hours", hours(1001).total_microseconds() == tms);
+ tms = static_cast<boost::int64_t>(3600)*365*24*1000;
+ check("total milliseconds - one year", (t2-t1).total_milliseconds() == tms);
+ tms = 3600*365*24*static_cast<boost::int64_t>(1000000000);
+ check("total nanoseconds - one year", (t2-t1).total_nanoseconds() == tms);
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+#else
+ std::cout << "tms: " << (t2-t1).total_milliseconds() << std::endl;
+ std::cout << "nano per year: " << (t2-t1).total_nanoseconds() << std::endl;
+#endif
+ // make it into a double
+ double d1 = microseconds(25).ticks()/(double)time_duration::ticks_per_second();
+ std::cout << d1 << std::endl;
+
+ //Following causes errors on several compilers about value to large for
+ //type. So it is commented out for now. Strangely works on gcc 3.3
+ //eg: integer constant out of range
+// long sec_in_200k_hours(7200000000);
+// check("total sec in 2000000 hours",
+// tdl2.total_seconds() == sec_in_200k_hours);
+// std::cout << to_simple_string(time_duration(2000000, 0, 0, 0)) << std::endl;
+
+
+ return printTestStats();
+
+}
+
+
diff --git a/libs/date_time/test/posix_time/testfiletime_functions.cpp b/libs/date_time/test/posix_time/testfiletime_functions.cpp
new file mode 100644
index 000000000..29298003b
--- /dev/null
+++ b/libs/date_time/test/posix_time/testfiletime_functions.cpp
@@ -0,0 +1,90 @@
+/* Copyright (c) 2002,2003, 2004 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#include "boost/date_time/filetime_functions.hpp"
+#include <cmath>
+
+#if defined(BOOST_HAS_FTIME)
+#include <windows.h>
+#endif
+
+int main()
+{
+#if defined(BOOST_HAS_FTIME) // skip tests if no FILETIME
+
+ using namespace boost::posix_time;
+
+ // adjustor is used to truncate ptime's fractional seconds for
+ // comparison with SYSTEMTIME's milliseconds
+ const int adjustor = time_duration::ticks_per_second() / 1000;
+
+ for(int i = 0; i < 5; ++i){
+
+ FILETIME ft;
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+ SystemTimeToFileTime(&st,&ft);
+
+ ptime pt = from_ftime<ptime>(ft);
+
+ check_equal("ptime year matches systemtime year",
+ st.wYear, pt.date().year());
+ check_equal("ptime month matches systemtime month",
+ st.wMonth, pt.date().month());
+ check_equal("ptime day matches systemtime day",
+ st.wDay, pt.date().day());
+ check_equal("ptime hour matches systemtime hour",
+ st.wHour, pt.time_of_day().hours());
+ check_equal("ptime minute matches systemtime minute",
+ st.wMinute, pt.time_of_day().minutes());
+ check_equal("ptime second matches systemtime second",
+ st.wSecond, pt.time_of_day().seconds());
+ check_equal("truncated ptime fractional second matches systemtime millisecond",
+ st.wMilliseconds, (pt.time_of_day().fractional_seconds() / adjustor));
+
+ // burn up a little time
+ for (int j=0; j<100000; j++)
+ {
+ SYSTEMTIME tmp;
+ GetSystemTime(&tmp);
+ }
+
+ } // for loop
+
+ // check that time_from_ftime works for pre-1970-Jan-01 dates, too
+ // zero FILETIME should represent 1601-Jan-01 00:00:00.000
+ FILETIME big_bang_by_ms;
+ big_bang_by_ms.dwLowDateTime = big_bang_by_ms.dwHighDateTime = 0;
+ ptime pt = from_ftime<ptime>(big_bang_by_ms);
+
+ check_equal("big bang ptime year matches 1601",
+ 1601, pt.date().year());
+ check_equal("big bang ptime month matches Jan",
+ 1, pt.date().month());
+ check_equal("big bang ptime day matches 1",
+ 1, pt.date().day());
+ check_equal("big bang ptime hour matches 0",
+ 0, pt.time_of_day().hours());
+ check_equal("big bang ptime minute matches 0",
+ 0, pt.time_of_day().minutes());
+ check_equal("big bang ptime second matches 0",
+ 0, pt.time_of_day().seconds());
+ check_equal("big bang truncated ptime fractional second matches 0",
+ 0, (pt.time_of_day().fractional_seconds() / adjustor));
+
+
+#else // BOOST_HAS_FTIME
+ // we don't want a forced failure here, not a shortcoming
+ check("FILETIME not available for this compiler/platform", true);
+#endif // BOOST_HAS_FTIME
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testformatters.cpp b/libs/date_time/test/posix_time/testformatters.cpp
new file mode 100644
index 000000000..74dae8888
--- /dev/null
+++ b/libs/date_time/test/posix_time/testformatters.cpp
@@ -0,0 +1,18 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+ //This has been deprecated for testtime_formatters.cpp
+ return 0;
+
+}
+
diff --git a/libs/date_time/test/posix_time/testgreg_duration_operators.cpp b/libs/date_time/test/posix_time/testgreg_duration_operators.cpp
new file mode 100644
index 000000000..005a61711
--- /dev/null
+++ b/libs/date_time/test/posix_time/testgreg_duration_operators.cpp
@@ -0,0 +1,85 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+
+int main(){
+
+#if !defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+ // do not set this test to return fail -
+ // this is not necessarily a compiler problem
+ check("Optional gregorian types not selected - no tests run", true);
+#else
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+
+
+ /*** months ***/
+ {
+ ptime p(date(2001, Oct, 31), hours(5));
+ check("ptime + months",
+ ptime(date(2002, Feb, 28), hours(5)) == p + months(4));
+ p += months(4);
+ check("ptime += months",
+ ptime(date(2002, Feb, 28), hours(5)) == p);
+ }
+ {
+ ptime p(date(2001, Oct, 31), hours(5));
+ check("ptime - months",
+ ptime(date(2001, Apr, 30), hours(5)) == p - months(6));
+ p -= months(6);
+ check("ptime -= months",
+ ptime(date(2001, Apr, 30), hours(5)) == p);
+ }
+
+ /*** years ***/
+ {
+ ptime p(date(2001, Feb, 28), hours(5));
+ check("ptime + years",
+ ptime(date(2004, Feb, 29), hours(5)) == p + years(3));
+ p += years(3);
+ check("ptime += years",
+ ptime(date(2004, Feb, 29), hours(5)) == p);
+ }
+ {
+ ptime p(date(2000, Feb, 29), hours(5));
+ check("ptime - years",
+ ptime(date(1998, Feb, 28), hours(5)) == p - years(2));
+ p -= years(2);
+ check("ptime -= years",
+ ptime(date(1998, Feb, 28), hours(5)) == p);
+ }
+
+
+ /*** weeks ***/
+ // shouldn't need many tests, it is nothing more than a date_duration
+ // so all date_duration tests should prove this class
+ {
+ ptime p(date(2001, Feb, 28), hours(5));
+ check("ptime + weeks",
+ ptime(date(2001, Mar, 21), hours(5)) == p + weeks(3));
+ p += weeks(3);
+ check("ptime += weeks",
+ ptime(date(2001, Mar, 21), hours(5)) == p);
+ }
+ {
+ ptime p(date(2001, Feb, 28), hours(5));
+ check("ptime - weeks",
+ ptime(date(2001, Feb, 14), hours(5)) == p - weeks(2));
+ p -= weeks(2);
+ check("ptime -= weeks",
+ ptime(date(2001, Feb, 14), hours(5)) == p);
+ }
+
+#endif // BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
+
+ return printTestStats();
+}
diff --git a/libs/date_time/test/posix_time/testiterator.cpp b/libs/date_time/test/posix_time/testiterator.cpp
new file mode 100644
index 000000000..7e6eec9af
--- /dev/null
+++ b/libs/date_time/test/posix_time/testiterator.cpp
@@ -0,0 +1,135 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+
+#include <iostream>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+#include "boost/date_time/gregorian/formatters_limited.hpp"
+#else
+#include "boost/date_time/gregorian/formatters.hpp"
+#endif
+
+void iterate_backward(const boost::posix_time::ptime *answers, int ary_len,
+ const boost::posix_time::time_duration& td)
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ int i = ary_len -1;
+ ptime end = answers[i];
+ time_iterator titr(end,td);
+
+ std::cout << "counting down by previous duration..." << std::endl;
+ for (; titr >= answers[0]; --titr) {
+ std::cout << to_simple_string(*titr) << std::endl;
+ check("iterating backward", answers[i] == *titr);
+ --i;
+ }
+ check("iterating backward count", i == -1); // check the number of iterations
+ std::cout << std::endl;
+}
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date d(2000,Jan,20);
+ ptime start(d);
+ const ptime answer1[] = {ptime(d), ptime(d,seconds(1)),
+ ptime(d,seconds(2)), ptime(d,seconds(3))};
+ int i=0;
+ time_iterator titr(start,seconds(1));
+ for (; titr < ptime(d,seconds(4)); ++titr) {
+ std::cout << to_simple_string(*titr) << std::endl;
+ check("iterator -- 1 sec", answer1[i] == *titr);
+ i++;
+ }
+ check("iterator -- 1 sec", i == 4); // check the number of iterations
+
+ iterate_backward(answer1, 4, seconds(1));
+
+ //iterate by hours
+ const ptime answer2[] = {ptime(d), ptime(d,hours(1)),
+ ptime(d,hours(2)), ptime(d,hours(3))};
+ i=0;
+ time_iterator titr2(start,hours(1));
+ for (; titr2 < ptime(d,hours(4)); ++titr2) {
+ std::cout << to_simple_string(*titr2) << std::endl;
+ check("iterator -- 1 hour", answer2[i] == *titr2);
+ i++;
+ }
+ check("iterator -- 1 hour", i == 4); // check the number of iterations
+
+ iterate_backward(answer2, 4, hours(1));
+
+
+ //iterate by 15 mintues
+ const ptime answer3[] = {ptime(d), ptime(d,minutes(15)),
+ ptime(d,minutes(30)), ptime(d,minutes(45)),
+ ptime(d,minutes(60)), ptime(d,minutes(75))};
+ i=0;
+ time_iterator titr3(start,minutes(15));
+ for (; titr3 < ptime(d,time_duration(1,20,0)); ++titr3) {
+ std::cout << to_simple_string(*titr3) << std::endl;
+ check("iterator -- 15 min", answer3[i] == *titr3);
+ i++;
+ }
+ check("iterator -- 15 min", i == 6); // check the number of iterations
+
+ iterate_backward(answer3, 6, minutes(15));
+
+ //iterate by .1 seconds
+ const ptime answer4[] = {ptime(d), ptime(d,time_duration(0,0,0,1000)),
+ ptime(d,time_duration(0,0,0,2000)),
+ ptime(d,time_duration(0,0,0,3000))};
+ i=0;
+ time_iterator titr4(start,time_duration(0,0,0,1000));
+ for (; titr4 < ptime(d,time_duration(0,0,0,4000)); ++titr4) {
+ std::cout << to_simple_string(*titr4) << std::endl;
+ check("iterator -- tenth sec", answer4[i] == *titr4);
+ i++;
+ }
+ check("iterator -- tenth sec", i == 4); // check the number of iterations
+
+ iterate_backward(answer4, 4, time_duration(0,0,0,1000));
+
+ //iterate by crazy duration
+ time_duration crzyd = duration_from_string("2:18:32.423");
+ const ptime answer5[] = {ptime(d), ptime(d,crzyd),
+ ptime(d, crzyd * 2),
+ ptime(d, crzyd * 3)};
+ i=0;
+ time_iterator titr5(start,crzyd);
+ for (; titr5 < ptime(d,crzyd * 4); ++titr5) {
+ std::cout << to_simple_string(*titr5) << std::endl;
+ check("iterator -- crazy duration", answer5[i] == *titr5);
+ i++;
+ }
+ check("iterator -- crazy duration", i == 4); // check the number of iterations
+
+ iterate_backward(answer5, 4, crzyd);
+
+ //iterate up by neg_dur
+ time_duration pos_dur = minutes(3);
+ time_duration neg_dur = -pos_dur;
+ time_iterator up_itr(start, neg_dur), dn_itr(start, pos_dur);
+
+ for(i=0; i < 10; ++i)
+ {
+ check("up-by-neg == backward iterate", *up_itr == *dn_itr);
+ ++up_itr; // up by -3
+ --dn_itr; // down by 3
+ }
+
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/posix_time/testlocal_adjustor.cpp b/libs/date_time/test/posix_time/testlocal_adjustor.cpp
new file mode 100644
index 000000000..c84c6ba2b
--- /dev/null
+++ b/libs/date_time/test/posix_time/testlocal_adjustor.cpp
@@ -0,0 +1,177 @@
+/* Copyright (c) 2002,2003, 2007 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time_adjustor.hpp"
+#include "boost/date_time/local_timezone_defs.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date dst_start(2002,Apr, 7);
+ date dst_end_day(2002,Oct, 27);
+
+ typedef boost::date_time::utc_adjustment<time_duration,-5> us_eastern_offset_adj;
+ //Type that embeds rules for UTC-5 plus DST offset
+ typedef boost::date_time::static_local_time_adjustor<ptime,
+ us_dst,
+ us_eastern_offset_adj> us_eastern;
+
+ //test some times clearly not in DST
+ date d3(2002,Feb,1);
+ ptime t10(d3, hours(4));
+ ptime t10_check(d3, hours(9)); //utc is 5 hours ahead
+ time_duration td = us_eastern::local_to_utc_offset(t10);//dst flag is defaulted
+ check("check local calculation", td == hours(5));
+ ptime t10_local = t10 + td;
+ std::cout << to_simple_string(t10_local)
+ << std::endl;
+ check("check local calculation", t10_local == t10_check);
+ check("check utc is dst",
+ us_eastern::utc_to_local_offset(t10) == hours(-5));
+
+
+ //something clearly IN dst
+ date d4(2002,May,1);
+ ptime t11(d4, hours(3));
+ check("check local offset",us_eastern::local_to_utc_offset(t11) == hours(4));
+ std::cout << to_simple_string(us_eastern::local_to_utc_offset(t11)) << std::endl;
+ ptime t11_check(d4, hours(7));//now utc offset is only 4 hours
+ ptime t11_local = t11 + us_eastern::local_to_utc_offset(t11);
+ std::cout << to_simple_string(t11_local) << " "
+ << to_simple_string(t11_check)
+ << std::endl;
+ check("check local calculation", t11_local == t11_check);
+ //should get same offset with DST flag set
+ check("check local offset-dst flag on",
+ us_eastern::local_to_utc_offset(t11, boost::date_time::is_dst) == hours(4));
+ check("check local offset-dst flag override",
+ us_eastern::local_to_utc_offset(t11, boost::date_time::not_dst) == hours(5));
+
+
+ //Check the start of dst boundary
+ ptime l_not_dst(dst_start, time_duration(1,59,59)); //2002-Apr-07 01:59:59
+ check("check local dst start boundary case",
+ us_eastern::local_to_utc_offset(l_not_dst) == hours(5));
+ ptime u_not_dst(dst_start, time_duration(6,59,59));
+ check("check utc dst start boundary case",
+ us_eastern::utc_to_local_offset(u_not_dst) == hours(-5));
+ ptime l_in_dst(dst_start, hours(3)); //2002-Apr-07 03:00:00 1st sec of dst
+ check("check local dst start boundary case",
+ us_eastern::local_to_utc_offset(l_in_dst, boost::date_time::is_dst) == hours(4));
+ ptime u_in_dst(dst_start, hours(7));
+ check("check utc dst start boundary case",
+ us_eastern::utc_to_local_offset(u_in_dst) == hours(-4));
+
+
+ //Check the end of dst boundary
+ ptime dst_end(dst_end_day, time_duration(1,59,59)); //2002-Oct-27 01:00:00 DST
+ check("check local dst end boundary case - still dst",
+ us_eastern::local_to_utc_offset(dst_end, boost::date_time::is_dst) == hours(4));
+ check("check local dst end boundary case - still dst",
+ us_eastern::local_to_utc_offset(dst_end, boost::date_time::not_dst) == hours(5));
+ ptime u_dst_end1(dst_end_day, time_duration(5,59,59));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end1) == hours(-4));
+ ptime u_dst_end2(dst_end_day, time_duration(6,0,0));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end2) == hours(-5));
+ ptime u_dst_end3(dst_end_day, time_duration(6,59,59));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end3) == hours(-5));
+ ptime u_dst_end4(dst_end_day, time_duration(7,0,0));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end4) == hours(-5));
+
+
+ //Now try a local adjustments without dst
+ typedef boost::date_time::utc_adjustment<time_duration,-7> us_az_offset_adj;
+ typedef boost::date_time::null_dst_rules<date, time_duration> us_az_dst_adj;
+ //Type that embeds rules for UTC-7 with no dst
+ typedef boost::date_time::static_local_time_adjustor<ptime,
+ us_az_dst_adj,
+ us_az_offset_adj> us_az;
+
+ check("check local offset - no dst",
+ us_az::local_to_utc_offset(t10) == hours(7));
+ check("check local offset - no dst",
+ us_az::local_to_utc_offset(t11) == hours(7));
+ check("check local offset - no dst",
+ us_az::utc_to_local_offset(t10) == hours(-7));
+ check("check local offset - no dst",
+ us_az::utc_to_local_offset(t11) == hours(-7));
+
+
+ //Arizona timezone is utc-7 with no dst
+ typedef boost::date_time::local_adjustor<ptime, -7, no_dst> us_arizona;
+
+ ptime t7(date(2002,May,31), hours(17));
+ ptime t8 = us_arizona::local_to_utc(t7);
+ ptime t9 = us_arizona::utc_to_local(t8);
+ //converted to local then back ot utc
+ check("check us_local_adjustor", t9 == t7);
+
+ typedef boost::date_time::local_adjustor<ptime, -5, us_dst> us_eastern2;
+
+ ptime t7a(date(2002,May,31), hours(17));
+ ptime t7b = us_eastern2::local_to_utc(t7a);
+ ptime t7c = us_eastern2::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor", t7c == t7a);
+
+
+ typedef boost::date_time::us_dst_trait<date> us_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration, us_dst_traits>
+ us_dst_calc2;
+
+ typedef boost::date_time::local_adjustor<ptime, -5, us_dst_calc2> us_eastern3;
+ {
+ ptime t7a(date(2002,May,31), hours(17));
+ ptime t7b = us_eastern3::local_to_utc(t7a);
+ ptime t7c = us_eastern3::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor3", t7c == t7a);
+ }
+
+ {
+ ptime t7a(date(2007,Mar,11), hours(4));
+ ptime t7b = us_eastern3::local_to_utc(t7a);
+ ptime t7c = us_eastern3::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor3 2007", t7c == t7a);
+ }
+
+ {
+ ptime t7a(date(2007,Mar,11), hours(3));
+ ptime t7b = us_eastern3::local_to_utc(t7a);
+ ptime t7c = us_eastern3::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor3 2007 a", t7c == t7a);
+ }
+
+ //still experimental
+ typedef boost::date_time::dynamic_local_time_adjustor<ptime, us_dst> lta;
+// lta adjustor(hours(-7));
+ check("dst start", lta::local_dst_start_day(2002) == dst_start);
+ check("dst end", lta::local_dst_end_day(2002) == dst_end_day);
+ check("dst boundary", lta::is_dst_boundary_day(dst_start));
+ check("dst boundary", lta::is_dst_boundary_day(dst_end_day));
+// check("check non-dst offset", adjustor.utc_offset(false)==hours(-7));
+// check("check dst offset", adjustor.utc_offset(true)==hours(-6));
+
+
+ check("dst start", lta::local_dst_start_day(2007) == date(2007,Mar,11));
+ check("dst end", lta::local_dst_end_day(2007) == date(2007,Nov,4));
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp b/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp
new file mode 100644
index 000000000..e3fa020ff
--- /dev/null
+++ b/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp
@@ -0,0 +1,112 @@
+/* Copyright (c) 2002,2003 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)
+
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/microsec_time_clock.hpp"
+#include "../testfrmwk.hpp"
+#if defined(BOOST_HAS_FTIME)
+#include <windows.h>
+#endif
+
+int
+main()
+{
+#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+
+ using namespace boost::posix_time;
+
+ // ptime last = boost::date_time::microsec_resolution_clock<ptime>::local_time();
+ ptime last = microsec_clock::local_time();
+
+ int max = 30;
+ int i = 0;
+ for (i = 0; i<max; i++)
+ {
+ for (int j=0; j<100000; j++)
+ {
+ // some systems loop too fast so "last is less" tests fail
+ // due to 'last' & 't2' being equal. These calls slow
+ // it down enough to make 'last' & 't2' different
+#if defined(BOOST_HAS_GETTIMEOFDAY)
+ timeval tv;
+ gettimeofday(&tv, 0);
+#endif
+#if defined(BOOST_HAS_FTIME)
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+#endif
+ }
+
+ ptime t1 = second_clock::local_time();
+ std::cout << to_simple_string(t1) << std::endl;
+
+ ptime t2 = microsec_clock::local_time();
+ std::cout << to_simple_string(t2) << std::endl;
+ check("hours match", t1.time_of_day().hours() == t2.time_of_day().hours());
+ check("minutes match",
+ t1.time_of_day().minutes() == t2.time_of_day().minutes());
+ check("seconds match",
+ t1.time_of_day().minutes() == t2.time_of_day().minutes());
+ check("hours date", t1.date() == t2.date());
+ if( !check("last is less", last <= t2) ) {
+ std::cout << to_simple_string(last) << " < "
+ << to_simple_string(t2) << std::endl;
+ }
+ last = t2;
+
+
+ }
+
+
+ std::cout << "Now do the same test for universal time -- a few less iterations" << std::endl;
+ max = 10;
+ last = microsec_clock::universal_time();
+ for (i = 0; i<max; i++)
+ {
+ for (int j=0; j<100000; j++)
+ {
+ // some systems loop too fast so "last is less" tests fail
+ // due to 'last' & 't2' being equal. These calls slow
+ // it down enough to make 'last' & 't2' different
+#if defined(BOOST_HAS_GETTIMEOFDAY)
+ timeval tv;
+ gettimeofday(&tv, 0);
+#endif
+#if defined(BOOST_HAS_FTIME)
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+#endif
+ }
+
+ ptime t1 = second_clock::universal_time();
+ std::cout << to_simple_string(t1) << std::endl;
+
+ ptime t2 = microsec_clock::universal_time();
+ std::cout << to_simple_string(t2) << std::endl;
+ check("hours match", t1.time_of_day().hours() == t2.time_of_day().hours());
+ check("minutes match",
+ t1.time_of_day().minutes() == t2.time_of_day().minutes());
+ check("seconds match",
+ t1.time_of_day().minutes() == t2.time_of_day().minutes());
+ check("hours date", t1.date() == t2.date());
+ //following check might be equal on a really fast machine
+ if( !check("last is less", last <= t2) ) {
+ std::cout << to_simple_string(last) << " < "
+ << to_simple_string(t2) << std::endl;
+ }
+ last = t2;
+
+
+ }
+
+#else
+ check("Get time of day micro second clock not supported due to inadequate compiler/platform", false);
+#endif
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testparse_time.cpp b/libs/date_time/test/posix_time/testparse_time.cpp
new file mode 100644
index 000000000..d56ed6a4f
--- /dev/null
+++ b/libs/date_time/test/posix_time/testparse_time.cpp
@@ -0,0 +1,224 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+
+int
+main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+
+ std::string s1("12:11:10.123456789");
+ time_duration td1= duration_from_string(s1);
+ check("parse time duration: " + s1,
+ td1 == time_duration(12,11,10,123456789));
+ std::string s2("12:11:10,123456789");
+ time_duration td2= boost::date_time::parse_delimited_time_duration<time_duration>(s2);
+ check("parse time duration: " + s2,
+ td2 == time_duration(12,11,10,123456789));
+ std::string s3("12:11:10");
+ time_duration td3= boost::date_time::parse_delimited_time_duration<time_duration>(s3);
+ check("parse time duration: " + s3,
+ td3 == time_duration(12,11,10,0));
+ std::string s4("23:59:59.000000001");
+ time_duration td4= boost::date_time::parse_delimited_time_duration<time_duration>(s4);
+ check("parse time duration: " + s4,
+ td4 == time_duration(23,59,59)+nanosec(1));
+ std::string s5("23:59:59.999999999");
+ time_duration td5= boost::date_time::parse_delimited_time_duration<time_duration>(s5);
+ check("parse time duration: " + s5,
+ td5 == time_duration(23,59,59)+nanosec(999999999));
+ std::string s5b("-23:59:59.999999999");
+ time_duration td5b= boost::date_time::parse_delimited_time_duration<time_duration>(s5b);
+ check("parse time duration: " + s5b,
+ td5b == time_duration(-23,59,59)-nanosec(999999999));
+
+ std::string s6b("1:00:00.1"); // we want 1/10th
+ time_duration td6b= boost::date_time::parse_delimited_time_duration<time_duration>(s6b);
+ check("parse time duration: " + s6b,
+ td6b == time_duration(1,0,0)+nanosec(100000000)); // we want 1/10th
+
+ std::string s7b("-1:00:00.0010"); // we want 1/1000th
+ time_duration td7b= boost::date_time::parse_delimited_time_duration<time_duration>(s7b);
+ check("parse time duration: " + s7b,
+ td7b == time_duration(-1,0,0)-nanosec(1000000)); // we want 1/1000th
+
+ std::string s8b("1:22:33.123456789321"); // too many digits
+ time_duration td8b= boost::date_time::parse_delimited_time_duration<time_duration>(s8b);
+ check("parse time duration: " + s8b,
+ td8b == time_duration(1,22,33,123456789)); // excess digits should be dropped
+#endif
+
+#if defined(BOOST_DATE_TIME_HAS_MICROSECONDS) && (!defined(BOOST_DATE_TIME_HAS_NANOSECONDS))
+ {
+ std::string s1("12:11:10.123456");
+ time_duration td1= duration_from_string(s1);
+ check("parse time duration: " + s1,
+ td1 == time_duration(12,11,10,123456));
+ std::string s2("12:11:10,123456");
+ time_duration td2= boost::date_time::parse_delimited_time_duration<time_duration>(s2);
+ check("parse time duration: " + s2,
+ td2 == time_duration(12,11,10,123456));
+ std::string s3("12:11:10");
+ time_duration td3= boost::date_time::parse_delimited_time_duration<time_duration>(s3);
+ check("parse time duration: " + s3,
+ td3 == time_duration(12,11,10,0));
+ std::string s4("23:59:59.000001");
+ time_duration td4= boost::date_time::parse_delimited_time_duration<time_duration>(s4);
+ check("parse time duration: " + s4,
+ td4 == time_duration(23,59,59)+microsec(1));
+ std::string s5("23:59:59.999999");
+ time_duration td5= boost::date_time::parse_delimited_time_duration<time_duration>(s5);
+ check("parse time duration: " + s5,
+ td5 == time_duration(23,59,59)+microsec(999999));
+ std::string s5b("-23:59:59.999999");
+ time_duration td5b= boost::date_time::parse_delimited_time_duration<time_duration>(s5b);
+ check("parse time duration: " + s5b,
+ td5b == time_duration(-23,59,59)-microsec(999999));
+
+ std::string s6b("1:00:00.1"); // we want 1/10th
+ time_duration td6b= boost::date_time::parse_delimited_time_duration<time_duration>(s6b);
+ check("parse time duration: " + s6b,
+ td6b == time_duration(1,0,0)+microsec(100000)); // we want 1/10th
+
+ std::string s7b("-1:00:00.0010"); // we want 1/1000th
+ time_duration td7b= boost::date_time::parse_delimited_time_duration<time_duration>(s7b);
+ check("parse time duration: " + s7b,
+ td7b == time_duration(-1,0,0)-microsec(1000)); // we want 1/1000th
+
+ std::string s8b("1:22:33.123456321"); // too many digits
+ time_duration td8b= boost::date_time::parse_delimited_time_duration<time_duration>(s8b);
+ check("parse time duration: " + s8b,
+ td8b == time_duration(1,22,33,123456)); // excess digits should be dropped
+ }
+#endif
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+
+ std::string ts2("2002-12-31 00:00:00.999999999");
+ ptime t2 = time_from_string(ts2);
+ check("parse time: " + ts2,
+ t2 == ptime(date(2002,12,31),time_duration(0,0,0)+nanosec(999999999)));
+ {
+ std::string ts2("2002-12-31 00:00:00.");
+ ptime t2 = time_from_string(ts2);
+ check("parse time (decimal but no digits): " + ts2,
+ t2 == ptime(date(2002,12,31),time_duration(0,0,0)));
+ }
+#endif
+
+
+ std::string date_1, tod_1;
+ std::string ts1("2002-01-20 23:59:59.000");
+ boost::date_time::split(ts1, ' ', date_1, tod_1);
+ check("split function date part of " + ts1,
+ date_1 == std::string("2002-01-20"));
+ check("time part of " + ts1,
+ tod_1 == std::string("23:59:59.000"));
+// std::cout << date_1 << "|" << std::endl;
+// std::cout << tod_1 << "|" << std::endl;
+
+
+ ptime t1 = time_from_string(ts1);
+ check("parse time: " + ts1,
+ t1 == ptime(date(2002,1,20),time_duration(23,59,59)));
+ {
+ std::string ts1("2002-01-20 23:59:59.");
+ ptime t1 = time_from_string(ts1);
+ check("parse time (decimal but no digits): " + ts1,
+ t1 == ptime(date(2002,1,20),time_duration(23,59,59)));
+ }
+
+ std::string s6("235859");
+ time_duration td6= boost::date_time::parse_undelimited_time_duration<time_duration>(s6);
+ check("parse time duration: " + s6,
+ td6 == time_duration(23,58,59));
+
+ s6 = "-235859";
+ td6= boost::date_time::parse_undelimited_time_duration<time_duration>(s6);
+ check("parse negative time duration: " + s6,
+ td6 == time_duration(-23,58,59));
+
+ std::string ts3("20020120T235859");
+ ptime t20 = from_iso_string(ts3);
+ check("parse iso time: " + ts3,
+ t20 == ptime(date(2002,1,20),time_duration(23,58,59)));
+
+
+ std::string ts4("19001231T000000");
+ ptime t21 = from_iso_string(ts4);
+ check("parse iso time: " + ts4,
+ t21 == ptime(date(1900,12,31),time_duration(0,0,0)));
+
+ std::string ts5("19001231T23");
+ ptime t22 = from_iso_string(ts5);
+ check("parse iso time: " + ts5,
+ t22 == ptime(date(1900,12,31),time_duration(23,0,0)));
+ {
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ std::string ts3("20020120T235859.123456789");
+ ptime t20 = from_iso_string(ts3);
+ check("parse iso time w/ frac sec: " + ts3,
+ t20 == ptime(date(2002,1,20),time_duration(23,58,59,123456789)));
+
+ std::string ts4("19001231T000000.123");
+ ptime t21 = from_iso_string(ts4);
+ check("parse iso time w/ frac sec (too short): " + ts4,
+ t21 == ptime(date(1900,12,31),time_duration(0,0,0,123000000)));
+
+ std::string ts5("19001231T230000.123456789876");
+ ptime t22 = from_iso_string(ts5);
+ check("parse iso time w/ frac sec (too long): " + ts5,
+ t22 == ptime(date(1900,12,31),time_duration(23,0,0,123456789)));
+
+ std::string ts6("19001231T230000.");
+ ptime t23 = from_iso_string(ts6);
+ check("parse iso time w/ frac sec (dec only): " + ts6,
+ t23 == ptime(date(1900,12,31),time_duration(23,0,0,0)));
+#else
+ std::string ts3("20020120T235859.123456");
+ ptime t20 = from_iso_string(ts3);
+ check("parse iso time w/ frac sec: " + ts3,
+ t20 == ptime(date(2002,1,20),time_duration(23,58,59,123456)));
+
+ std::string ts4("19001231T000000.123");
+ ptime t21 = from_iso_string(ts4);
+ check("parse iso time w/ frac sec (too short): " + ts4,
+ t21 == ptime(date(1900,12,31),time_duration(0,0,0,123000)));
+
+ std::string ts5("19001231T230000.123456789876");
+ ptime t22 = from_iso_string(ts5);
+ check("parse iso time w/ frac sec (too long): " + ts5,
+ t22 == ptime(date(1900,12,31),time_duration(23,0,0,123456)));
+
+ std::string ts6("19001231T230000.");
+ ptime t23 = from_iso_string(ts6);
+ check("parse iso time w/ frac sec (dec only): " + ts6,
+ t23 == ptime(date(1900,12,31),time_duration(23,0,0,0)));
+#endif // BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ }
+
+ std::string s7("-01:25:00"), s8("-00:40:00"), s9("0:45"), s10("0:-40");
+ time_duration tds1 = duration_from_string(s7);
+ time_duration tds2 = duration_from_string(s8);
+ time_duration tds3 = duration_from_string(s9);
+ time_duration tds4 = duration_from_string(s10);
+ check("from string construct", tds1 == time_duration(-1,25,0));
+ check("from string construct", tds2 == minutes(-40));
+ check("from string construct", tds3 == minutes(45));
+ // '-' in middle of string s10 should be ignored resulting in pos duration
+ check("from string construct", tds4 == minutes(40));
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testperiod.cpp b/libs/date_time/test/posix_time/testperiod.cpp
new file mode 100644
index 000000000..211412e60
--- /dev/null
+++ b/libs/date_time/test/posix_time/testperiod.cpp
@@ -0,0 +1,22 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include <iostream>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/posix_time/time_period.hpp"
+#include "../testfrmwk.hpp"
+
+int main()
+{
+
+ //FILE OBSOLETE: replace by testtime_period.cpp
+
+ return 1;
+ // return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/teststreams.cpp b/libs/date_time/test/posix_time/teststreams.cpp
new file mode 100644
index 000000000..d30692afa
--- /dev/null
+++ b/libs/date_time/test/posix_time/teststreams.cpp
@@ -0,0 +1,179 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+#ifndef BOOST_DATE_TIME_NO_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_special_value_names[]={"NichtDatumzeit","-unbegrenztheit", "+unbegrenztheit"};
+
+const char* const de_short_weekday_names[]={"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"};
+
+const char* const de_long_weekday_names[]={"Sonntag", "Montag", "Dienstag","Mittwoch", "Donnerstag", "Freitag", "Samstag"};
+
+#endif
+
+int
+main()
+{
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ std::stringstream ss;
+ date d1(2002,May,1);
+ ptime t1(d1, hours(12)+minutes(10)+seconds(5));
+ time_duration td0(12,10,5,123);
+ ptime t0(d1, td0);
+ ss << t0;
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ check("check time output: "+ss.str(),
+ ss.str() == std::string("2002-May-01 12:10:05.000000123"));
+#else
+ check("check time output: "+ss.str(),
+ ss.str() == std::string("2002-May-01 12:10:05.000123"));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ // ss.imbue(global);
+ time_period tp(t1, ptime(d1, hours(23)+time_duration::unit()));
+ ss.str("");
+ ss << tp;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("[2002-May-01 12:10:05/2002-May-01 23:00:00]"));
+
+ //Send out the same time with german
+ typedef boost::date_time::all_date_names_put<greg_facet_config> date_facet;
+
+ ss.imbue(std::locale(std::locale::classic(),
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ '.',
+ boost::date_time::ymd_order_dmy,
+ boost::date_time::month_as_short_string)));
+ ss.str("");
+ ss << t1;
+ check("check time output: "+ ss.str(),
+ ss.str() == std::string("01.Mai.2002 12:10:05"));
+
+
+ time_duration td(5,4,3);
+ time_duration td1(-1,25,0), td2(0,-40,0);
+ ss.str("");
+ ss << td;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("05:04:03"));
+ ss.str("");
+ ss << td1;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("-01:25:00"));
+ ss.str("");
+ ss << td2;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("-00:40:00"));
+
+
+ ss.str("");
+ ss << tp;
+ check("check time period output - german: "+ ss.str(),
+ ss.str() == std::string("[01.Mai.2002 12:10:05/01.Mai.2002 23:00:00]"));
+
+ /* Input streaming is only available for compilers that
+ * do not have BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS defined */
+#ifndef BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
+
+ /****** test streaming in for time classes ******/
+ {
+ std::istringstream iss("01:02:03.000004 garbage");
+ iss >> td;
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ check("Stream in time_duration", td == time_duration(1,2,3,4000));
+#else
+ check("Stream in time_duration", td == time_duration(1,2,3,4));
+#endif
+ }
+#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) // vc6 & vc7
+ {
+ std::istringstream iss("2003-May-13 01:02:03");
+ iss >> t1;
+ check("Stream in ptime", t1 == ptime(date(2003,May,13), time_duration(1,2,3)));
+ std::istringstream iss2("2003-January-13 01:02:03");
+ iss2 >> t1;
+ check("Stream in ptime2", t1 == ptime(date(2003,Jan,13), time_duration(1,2,3)));
+ std::istringstream iss3("2003-feb-13 11:10:09");
+ iss3 >> t1;
+ check("Stream in ptime3", t1 == ptime(date(2003,Feb,13), time_duration(11,10,9)));
+
+ try {
+ std::istringstream iss4("2003-xxx-13 11:10:09");
+ iss3 >> t1;
+ check("Stream bad ptime", false); //never reach here, bad month exception
+ }
+ catch(std::exception& e) {
+ std::cout << "Got expected exception: " << e.what() << std::endl;
+ check("Stream bad ptime", true);
+ }
+
+ }
+ {
+ date d1(2001,Aug,1), d2(2003,May,13);
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ time_duration td1(15,32,18,20304000), td2(1,2,3);
+#else
+ time_duration td1(15,32,18,20304), td2(1,2,3);
+#endif
+
+ time_period result(ptime(d1,td1), ptime(d2,td2));
+ std::istringstream iss("[2001-Aug-01 15:32:18.020304/2003-May-13 01:02:03]");
+ iss >> tp;
+ check("Stream in time_period", tp == result);
+ }
+
+#if !defined(BOOST_NO_STD_WSTRING)
+ /*** wide streaming ***/
+ {
+ std::wistringstream wiss1(L"01:02:03");//.000004");
+ wiss1 >> td;
+ check("Wide stream in time_duration", td == time_duration(1,2,3));
+
+ std::wistringstream wiss2(L"2003-May-23 03:20:10");
+ wiss2 >> t1;
+ check("Wide stream in ptime", t1 == ptime(date(2003,May,23), time_duration(3,20,10)));
+
+ std::wistringstream wiss3(L"[2004-Jan-01 02:03:04/2004-May-13 01:00:00]");
+ wiss3 >> tp;
+ date d1 = date(2004,Jan,1);
+ date d2 = date(2004,May,13);
+ time_duration td1 = time_duration(2,3,4);
+ time_duration td2 = time_duration(1,0,0);
+ time_period result = time_period(ptime(d1,td1), ptime(d2,td2));
+ check("Wide stream in time_period", tp == result);
+ }
+#else
+ check("Wide streaming not available for this compiler", false);
+#endif // BOOST_NO_STD_WSTRING
+
+#else // BOOST_NO_STD_ITERATOR_TRAITS
+ check("Streaming in of alphabetic dates (Ex: 2003-Aug-21) \
+ not supported by this compiler", false);
+#endif // BOOST_NO_STD_ITERATOR_TRAITS
+
+#else // BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
+ check("Streaming in of time classes not supported by this compiler", false);
+#endif // BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
+
+#else //BOOST_DATE_TIME_NO_LOCALE
+ check("No tests executed - Locales not supported by this compiler", false);
+#endif //BOOST_DATE_TIME_NO_LOCALE
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/posix_time/testtime.cpp b/libs/date_time/test/posix_time/testtime.cpp
new file mode 100644
index 000000000..054377c0c
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime.cpp
@@ -0,0 +1,331 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include <iostream>
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+void special_values_tests()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ time_duration td_pi(pos_infin), td_ni(neg_infin), td_ndt(not_a_date_time);
+ date_duration dd_pi(pos_infin), dd_ni(neg_infin), dd_ndt(not_a_date_time);
+ date d_pi(pos_infin), d_ni(neg_infin), d_ndt(not_a_date_time);
+ time_duration td(1,2,3,4);
+ date_duration dd(1234);
+ date d(2003,Oct,31);
+
+#if !defined(DATE_TIME_NO_DEFAULT_CONSTRUCTOR)
+ { // default constructor
+ ptime def;
+ check("Default constructor", def == ptime(not_a_date_time));
+ }
+#endif // DATE_TIME_NO_DEFAULT_CONSTRUCTOR
+
+ { // special values construction tests
+ ptime p_sv1(pos_infin);
+ std::string s("+infinity");
+ check("from special value +infinity", to_simple_string(p_sv1) == s);
+ ptime result = p_sv1 + dd;
+ check("Special value (pos infin) + date_duration = +infinity", to_iso_extended_string(result) == s);
+ check("is_special function - pos infin", result.is_special());
+ result = p_sv1 - dd;
+ check("Special value (pos infin) - date_duration = +infinity", to_iso_extended_string(result) == s);
+ result = p_sv1 - dd_ni;
+ check("Special value (pos infin) - date_duration (neg infin) = +infinity", to_iso_extended_string(result) == s);
+ ptime p_sv2(neg_infin);
+ s = "-infinity";
+ check("from special value -infinity", to_iso_string(p_sv2) == s);
+ result = p_sv2 - td_pi;
+ check("Special value (neg infin) - special time_duration (pos infin) = -infinity", to_iso_extended_string(result) == s);
+ ptime p_sv3(not_a_date_time);
+ check("is_special function - not_a_date_time", p_sv3.is_special());
+ s = "not-a-date-time";
+ check("from special value NADT", to_iso_extended_string(p_sv3) == s);
+ result = p_sv3 + td;
+ check("Special value (NADT) + time_duration = NADT", to_iso_extended_string(result) == s);
+ result = p_sv3 - td;
+ check("Special value (NADT) - time_duration = NADT", to_iso_extended_string(result) == s);
+ result = p_sv2 + td_pi;
+ check("Special value (neg infin) + special time_duration (pos infin) = NADT", to_iso_extended_string(result) == s);
+ result = p_sv1 + dd_ni;
+ check("Special value (pos infin) + date_duration (neg infin) = NADT", to_iso_extended_string(result) == s);
+ result = p_sv1 + dd_ndt;
+ check("Special value (pos infin) - date_duration (NADT) = NADT", to_iso_extended_string(result) == s);
+ }
+ { // special values construction tests
+ ptime p_sv1(d_pi, td);
+ std::string s("+infinity");
+ check("duration & special_date", to_simple_string(p_sv1) == s);
+ ptime p_sv2(d_ni, td);
+ s = "-infinity";
+ check("duration & special_date", to_iso_string(p_sv2) == s);
+ ptime p_sv3(d_ndt, td);
+ s = "not-a-date-time";
+ check("duration & special_date", to_iso_extended_string(p_sv3) == s);
+ }
+ { // special values construction tests
+ ptime p_sv1(d_ndt, td);
+ std::string s("not-a-date-time");
+ check("NADT & duration", to_simple_string(p_sv1) == s);
+ ptime p_sv2(d, td_ndt);
+ check("date & NADT", to_iso_string(p_sv2) == s);
+ ptime p_sv3(d_pi, td_ni);
+ check("+infinity_date & -infinity_duration",
+ to_iso_extended_string(p_sv3) == s);
+
+ }
+ { // special values tests
+ ptime p_sv1(d, td_pi), pt(d,td);
+ std::string s("+infinity");
+ check("special_duration & date", to_simple_string(p_sv1) == s);
+ check("ptime::date() +infinity", to_simple_string(p_sv1.date()) == s);
+ ptime p_sv2(d, td_ni);
+ s = "-infinity";
+ check("special_duration & date", to_iso_string(p_sv2) == s);
+ check("ptime::time_of_day() -infinity",
+ to_simple_string(p_sv2.time_of_day()) == s);
+ ptime p_sv3(d, td_ndt);
+ s = "not-a-date-time";
+ check("special_duration & date", to_iso_extended_string(p_sv3) == s);
+ check("ptime::date() - NADT", to_simple_string(p_sv3.date()) == s);
+ check("ptime::time_of_day() - NADT",
+ to_simple_string(p_sv3.time_of_day()) == s);
+ check("-infinity less than ...", p_sv2 < p_sv1);
+ check("-infinity less than ...", p_sv2 < pt);
+ check("+infinity greater than ...", pt < p_sv1);
+ check("-infinity less than equal to ...", p_sv2 <= p_sv2);
+ check("-infinity less than equal to ...", p_sv2 <= pt);
+ check("+infinity greater than equal to ...", p_sv1 >= pt);
+ check("not equal", p_sv1 != p_sv2);
+ check("not equal", p_sv3 != p_sv2);
+ check("not equal", pt != p_sv1);
+
+ check("is_pos_infinity", p_sv1.is_infinity() && p_sv1.is_pos_infinity());
+ check("is_neg_infinity", p_sv2.is_infinity() && p_sv2.is_neg_infinity());
+ check("is_not_a_date_time", !p_sv3.is_infinity() && p_sv3.is_not_a_date_time());
+
+ check("special_ptime + date_duration", p_sv1 + dd == p_sv1);
+ check("ptime - special_date_duration", pt - dd_pi == p_sv2);
+ check("ptime - special_date_duration", pt - dd_ndt == p_sv3);
+
+ check("special_ptime + time_duration", p_sv2 + td == p_sv2);
+ check("special_ptime - time_duration", pt - td_ni == p_sv1);
+ check("ptime + special_time_duration", pt + td_ndt == p_sv3);
+ check("ptime - special_ptime", pt - p_sv1 == td_ni);
+ check("ptime - special_ptime", pt - p_sv2 == td_pi);
+ check("ptime - special_ptime", pt - p_sv3 == td_ndt);
+ check("special_ptime - special_ptime", p_sv2 - p_sv2 == td_ndt);
+ }
+}
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date d(2001,Dec,1);
+ time_duration td(5,4,3);
+ ptime t1(d, td); //2001-Dec-1 05:04:03
+ check("date part check", t1.date() == d);
+ check("time part check", t1.time_of_day() == td);
+ check("ptime with more than 24 hours", ptime(date(2005,10,30), hours(25)) == ptime(date(2005,10,31),hours(1)));
+ ptime t2(t1); //copy constructor
+ ptime t3 = t2; //assignment
+ check("date part check", t3.date() == d);
+ check("time part check", t3.time_of_day() == td);
+ check("equality", t1 == t3);
+ date d2(2001,Jan,1);
+ ptime t4(d2, td); //2001-Jan-1 05:04:03
+ check("equality - not equal", !(t1 == t4));
+ time_duration td1(5,4,0);
+ ptime t5(d, td1); //2001-Dec-1 05:04:00
+ check("equality - not equal", !(t1 == t5));
+ check("not equal - not equal", t1 != t5);
+
+ check("less - not less", !(t1 < t1));
+ check("less - less", t4 < t1);
+ check("less - less", t5 < t1);
+ check("less equal - equal", t1 <= t1);
+ check("greater equal - equal", t1 >= t1);
+
+ date_duration twodays(2);
+ ptime t6 = t1 + twodays;
+ date d3(2001,Dec,3);
+ check("operator+(date_duration)", t6 == ptime(d3,td));
+ ptime t7 = t1 - twodays;
+ check("operator-(date_duration)", t7 == ptime(date(2001,Nov,29),td));
+ {
+ ptime t6b(date(2003,Oct,31),time_duration(10,0,0,0));
+ t6b += date_duration(55);
+ check("operator +=(date_duration)", t6b ==
+ ptime(date(2003,Dec,25), time_duration(10,0,0,0)));
+ t6b += hours(6);
+ check("operator +=(time_duration)", t6b ==
+ ptime(date(2003,Dec,25), time_duration(16,0,0,0)));
+ t6b -= date_duration(55);
+ check("operator -=(date_duration)", t6b ==
+ ptime(date(2003,Oct,31), time_duration(16,0,0,0)));
+ t6b -= hours(6);
+ check("operator -=(time_duration)", t6b ==
+ ptime(date(2003,Oct,31), time_duration(10,0,0,0)));
+ t6b += hours(25);
+ check("operator +=(time_duration, more than 24 hours)", t6b ==
+ ptime(date(2003,Nov,1), time_duration(11,0,0,0)));
+ t6b -= hours(49);
+ check("operator -=(time_duration, more than 48 hours)", t6b ==
+ ptime(date(2003,Oct,30), time_duration(10,0,0,0)));
+ }
+ time_duration td2(1,2,3);
+ ptime t8(date(2001,Dec,1)); //midnight
+ ptime t9 = t8 + td2; //Dec 2 at 01:02:03
+ ptime t10(date(2001,Dec,1),time_duration(1,2,3));
+ std::cout << to_simple_string(t9) << std::endl;
+ std::cout << to_simple_string(t10) << std::endl;
+ std::cout << to_simple_string(td2) << std::endl;
+ check("add 2001-Dec-01 0:0:0 + 01:02:03", t9 == t10);
+ {
+ ptime t9(date(2001,Dec,1), time_duration(12,0,0)); //Dec 1 at Noon
+ time_duration td3(-4,0,0);
+ check("add 2001-Dec-01 12:00:00 + (-04:00:00)",
+ t9+td3 == ptime(date(2001,Dec,1), time_duration(8,0,0)) );
+ std::cout << to_simple_string(t9-td3) << std::endl;
+ }
+ time_duration td3(24,0,0); // a day
+ check("add 2001-Dec-01 0:0:0 + 24:00:00", t8+td3 == ptime(date(2001,Dec,2)));
+ time_duration td4(24,0,1); // a day, 1 second
+ check("add 2001-Dec-01 0:0:0 + 24:00:01", t8+td4
+ == ptime(date(2001,Dec,2), time_duration(0,0,1)));
+ //looks like this fails b/c limits are exceeded now that we have subseconds..
+ time_duration td5(168,0,1); //one week 24X7
+ check("add 2001-Dec-01 0:0:0 + 168:00:01", t8+td5
+ == ptime(date(2001,Dec,8), time_duration(0,0,1)));
+
+ // ptime t10a = t8+td5;
+ // std::cout << to_simple_string(t10a) << std::endl;
+
+ //Subtraction of time duration -- add more!!
+ ptime t11(date(2001,Dec,1), time_duration(12,0,0)); //noon
+ time_duration td6(12,0,1);
+ ptime t12 = t11-td6;
+ check("sub 2001-Dec-01 12:0:0 - 12:00:01",
+ t12 == ptime(date(2001,Nov,30), time_duration(23,59,59)));
+
+ check("sub 2001-Dec-01 12:0:0 - 13:00:00",
+ (t11-time_duration(13,0,0))== ptime(date(2001,Nov,30),
+ time_duration(23,0,0)));
+ check("sub 2001-Dec-01 12:0:0 - (-13:00:00)",
+ (t11-time_duration(-13,0,0))== ptime(date(2001,Dec,2),
+ time_duration(1,0,0)));
+ // std::cout << to_simple_string(t12.date()) << std::endl;
+
+ ptime t13(d, hours(3));
+ ptime t14(d, hours(4));
+ ptime t14a(d+date_duration(1), hours(4));
+ //Subtract 2 times
+ std::cout << to_simple_string(t14-t13) << std::endl;
+ // time_duration td7 =
+ check("time subtraction positive result",
+ t14-t13 == hours(1));
+ std::cout << to_simple_string(t13-t14) << std::endl;
+ check("time subtraction negative result",
+ t13-t14 == hours(-1));
+ check("time subtraction positive result",
+ t14a-t14 == hours(24));
+
+
+ ptime t15(d, time_duration(0,0,0,1));
+ ptime t16(d, time_duration(0,0,0,2));
+ check("time subsecond add test",
+ t15 + time_duration::unit() == t16);
+ check("time subsecond sub test",
+ t16 - time_duration::unit() == t15);
+
+ ptime t17 = ptime(d) - time_duration::unit();
+ std::cout << to_simple_string(t17) << std::endl;
+
+ ptime t18(d, hours(25));
+ std::cout << to_simple_string(t18) << std::endl;
+
+ //time_t conversions:
+ t18 = from_time_t(0); //1970-1-1 0:0:0
+ check("time_t conversion of 0", t18 == ptime(date(1970,1,1)));
+
+ std::time_t tt(500000000);
+ t18 = from_time_t(tt); //1985-11-5 0:53:20
+ check("time_t conversion of 500000000",
+ t18 == ptime(date(1985,11,5), time_duration(0,53,20)));
+
+ std::time_t tt1(1060483634);
+ t18 = from_time_t(tt1); //2003-08-10 2:47:14
+ check("time_t conversion of 1060483634",
+ t18 == ptime(date(2003,8,10), time_duration(2,47,14)));
+
+ std::time_t tt2(1760483634);
+ t18 = from_time_t(tt2); //2025-10-14 23:13:54
+ check("time_t conversion of 1760483634",
+ t18 == ptime(date(2025,10,14), time_duration(23,13,54)));
+
+ std::time_t tt3(1960483634);
+ t18 = from_time_t(tt3); //2032-2-15 18:47:14
+ check("time_t conversion of 1960483634",
+ t18 == ptime(date(2032,2,15), time_duration(18,47,14)));
+
+ special_values_tests();
+
+ //min and max constructors
+ ptime min_ptime(min_date_time);
+ check("check min time constructor", min_ptime == ptime(date(1400,1,1), time_duration(0,0,0,0)));
+ // std::cout << min_ptime << std::endl;
+ ptime max_ptime(max_date_time);
+ check("check max time constructor", max_ptime == ptime(date(9999,12,31),
+ hours(24)-time_duration::unit()));
+ // std::cout << max_ptime << std::endl;
+
+ //tm conversion checks
+ //converts to date and back -- should get same result -- note no fractional seconds in these times
+ check("tm conversion functions 2001-12-1 05:04:03", ptime_from_tm(to_tm(t1)) == t1);
+ check("tm conversion functions min date 1400-1-1 ", ptime_from_tm(to_tm(min_ptime)) == min_ptime);
+ //this conversion will drop fractional seconds
+ check("tm conversion functions max date 9999-12-31 23:59:59.9999 - truncated frac seconds",
+ ptime_from_tm(to_tm(max_ptime)) == ptime(date(max_date_time), time_duration(23,59,59)));
+
+ try{
+ ptime pt(pos_infin);
+ tm pt_tm = to_tm(pt);
+ check("Exception not thrown (special_value to_tm)", false);
+ //following code does nothing useful but stops compiler from complaining about unused pt_tm
+ std::cout << pt_tm.tm_sec << std::endl;
+ }catch(std::out_of_range& e){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+ try{
+ // exception is only thrown from gregorian::to_tm. Needed to
+ // be sure it always gets thrown.
+ ptime pt(date(2002,Oct,31), hours(1));
+ pt += time_duration(pos_infin);
+ tm pt_tm = to_tm(pt);
+ check("Exception not thrown (special_value to_tm)", false);
+ //following code does nothing useful but stops compiler from complaining about unused pt_tm
+ std::cout << pt_tm.tm_sec << std::endl;
+ }catch(std::out_of_range& e){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testtime_facet.cpp b/libs/date_time/test/posix_time/testtime_facet.cpp
new file mode 100644
index 000000000..6df5dcefa
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime_facet.cpp
@@ -0,0 +1,458 @@
+
+/* Copyright (c) 2004 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-09-22 09:04:10 -0700 (Sat, 22 Sep 2012) $
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#include <fstream>
+#include <iostream>
+#include <sstream>
+
+template<class temporal_type, typename charT>
+inline
+void
+teststreaming(std::string testname,
+ temporal_type value,
+ std::basic_string<charT> expected_result,
+ const std::locale& locale = std::locale::classic())
+{
+ std::basic_stringstream<charT> ss;
+ ss.imbue(locale);
+ ss << value;
+ check_equal(testname, ss.str(), expected_result);
+}
+
+
+#if !defined(BOOST_NO_STD_WSTRING)
+static const wchar_t* long_month_names[] =
+ {L"Januar",L"Februar",L"Marz",L"April",L"Mai",L"Juni",L"Juli",L"August",
+ L"September",L"Oktober",L"November",L"Dezember"};
+static const wchar_t* short_month_names[]=
+ {L"Jan",L"Feb",L"Mar",L"Apr",L"Mai",L"Jun",L"Jul",L"Aug",
+ L"Sep",L"Okt",L"Nov",L"Dez"};
+
+std::vector<std::basic_string<wchar_t> > de_short_month_names;
+std::vector<std::basic_string<wchar_t> > de_long_month_names;
+#endif //
+
+int main() {
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+
+ try {
+ date d(2004,Oct,13);
+ date min_date(min_date_time);
+ date max_date(max_date_time);
+
+ date_period dp(d, d + date_duration(7));
+ ptime t(d, time_duration(18,01,56));
+ ptime tf = t + microseconds(3);
+ time_period tp(t, tf + days(7) + time_duration(1,1,1));
+ time_duration td = hours(3) + minutes(2) + seconds(1) + milliseconds(9);
+ time_duration longer_td = hours(10) + minutes(22) + seconds(15) + milliseconds(980); // two characters in hours
+ time_duration long_td = hours(300) + minutes(2) + seconds(1) + milliseconds(9); // more than two characters in hours
+ {
+ std::stringstream ss;
+ ss << t;
+ check("Stream and to_string formats match (ptime)",
+ to_simple_string(t) == ss.str());
+ std::cout << t << ' ' << td << std::endl;
+ ss.str("");
+ ss << tf;
+ check("Stream and to_string formats match (ptime w/ fracsec)",
+ to_simple_string(tf) == ss.str());
+ ss.str("");
+ ss << tp;
+ check("Stream and to_string formats match (time_period)",
+ to_simple_string(tp) == ss.str());
+ ss.str("");
+ ss << td;
+ check("Stream and to_string formats match (time_duration)",
+ to_simple_string(td) == ss.str());
+ std::cout << ss.str() << std::endl;
+
+ time_facet* f = new time_facet();
+ ss.imbue(std::locale(ss.getloc(), f));
+ ss.str("");
+
+ f->format("%Y-%b-%d %H:%M:%S %%d");
+ f->time_duration_format("%H:%M:%S %%S");
+ ss << t;
+ check("Literal '%' in format", ss.str() == std::string("2004-Oct-13 18:01:56 %d"));
+ ss.str("");
+ ss << td;
+ check("Literal '%' in time_duration format", ss.str() == std::string("03:02:01 %S"));
+ ss.str("");
+ f->format("%Y-%b-%d %H:%M:%S %%%d");
+ f->time_duration_format("%H:%M:%S %%%S");
+ ss << t;
+ check("Multiple literal '%'s in format", ss.str() == std::string("2004-Oct-13 18:01:56 %13"));
+ ss.str("");
+ ss << td;
+ check("Multiple literal '%'s in time_duration format", ss.str() == std::string("03:02:01 %01"));
+ ss.str("");
+
+ // Longer time durations
+ f->time_duration_format("%H:%M:%S");
+ ss << longer_td;
+ check("Longer time durations", ss.str() == std::string("10:22:15"));
+ ss.str("");
+
+ // Long time durations
+ f->time_duration_format("%O:%M:%S");
+ ss << long_td;
+ check("Long time durations", ss.str() == std::string("300:02:01"));
+ ss.str("");
+
+ // Short-hand format specifiers
+ f->format("%T");
+ f->time_duration_format("%T");
+ ss << t;
+ check("Short-hand '%T' in time format", ss.str() == std::string("18:01:56"));
+ ss.str("");
+ ss << td;
+ check("Short-hand '%T' in time_duration format", ss.str() == std::string("03:02:01"));
+ ss.str("");
+
+ f->format("%R");
+ f->time_duration_format("%R");
+ ss << t;
+ check("Short-hand '%R' in time format", ss.str() == std::string("18:01"));
+ ss.str("");
+ ss << td;
+ check("Short-hand '%R' in time_duration format", ss.str() == std::string("03:02"));
+ ss.str("");
+ }
+ { // negative time_duration tests
+ std::string result;
+ std::stringstream ss;
+ time_duration td1(2,0,0);
+ time_duration td2(1,0,0);
+ ss << td2 - td1;
+ result = "-01:00:00";
+ check("Negative time_duration", result == ss.str());
+ ss.str("");
+
+ time_duration td3(0,2,0);
+ time_duration td4(0,1,0);
+ ss << td4 - td3;
+ result = "-00:01:00";
+ check("Negative time_duration", result == ss.str());
+ ss.str("");
+
+ time_duration td5(0,0,2);
+ time_duration td6(0,0,1);
+ ss << td6 - td5;
+ result = "-00:00:01";
+ check("Negative time_duration", result == ss.str());
+ ss.str("");
+
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ result = "-00:00:00.000000001";
+#else
+ result = "-00:00:00.000001";
+#endif
+ time_duration td7(0,0,0,123);
+ time_duration td8(0,0,0,122);
+ ss << td8 - td7;
+ check("Negative time_duration: " + ss.str(), result == ss.str());
+
+ //reset the sign to always print
+ time_facet* f = new time_facet();
+ ss.imbue(std::locale(ss.getloc(), f));
+ f->time_duration_format("%+%H:%M:%S""%F");
+
+ ss.str("");
+ ss << td4 - td3;
+ result = "-00:01:00";
+ check("Negative time_duration sign always: " + ss.str(), result == ss.str());
+
+ ss.str("");
+ ss << td3 - td4;
+ result = "+00:01:00";
+ check("time_duration sign always: " + ss.str(), result == ss.str());
+
+
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ result = "-00:00:00.000000001";
+#else
+ result = "-00:00:00.000001";
+#endif
+ ss.str("");
+ ss << td8 - td7;
+ check("Negative time_duration: " + ss.str(), result == ss.str());
+
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ result = "+00:00:00.000000001";
+#else
+ result = "+00:00:00.000001";
+#endif
+ ss.str("");
+ ss << td7 - td8;
+ check("time_duration sign bit always: " + ss.str(), result == ss.str());
+
+ f->time_duration_format("%-%H hours and %-%M minutes");
+ ss.str("");
+ ss << td4 - td3;
+ result = "-00 hours and -01 minutes";
+ check("Negative time_duration two sign flags" + ss.str(), result == ss.str());
+ ss.str("");
+
+ // Longer time durations
+ f->time_duration_format("%-%H:%M:%S");
+ ss << -longer_td;
+ check("Longer negative time durations", ss.str() == std::string("-10:22:15"));
+ ss.str("");
+
+ // Long time durations
+ f->time_duration_format("%-%O:%M:%S");
+ ss << -long_td;
+ check("Long negative time durations", ss.str() == std::string("-300:02:01"));
+ ss.str("");
+ }
+
+ // The test verifies that #2698 is fixed. That is, the time and date facet should
+ // not dereference end() iterator for the format string in do_put_tm.
+ {
+ boost::gregorian::date date(2009, 1, 1);
+ boost::posix_time::time_duration td(0, 0, 0, 0);
+ boost::posix_time::ptime boost_time(date, td);
+ std::stringstream sstr;
+
+ boost::posix_time::time_facet* pFacet = new boost::posix_time::time_facet("");
+ sstr.imbue(std::locale(std::locale::classic(), pFacet));
+
+ sstr << boost_time;
+ }
+
+#if !defined(BOOST_NO_STD_WSTRING)
+ std::copy(&short_month_names[0],
+ &short_month_names[12],
+ std::back_inserter(de_short_month_names));
+
+ std::copy(&long_month_names[0],
+ &long_month_names[12],
+ std::back_inserter(de_long_month_names));
+
+
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+ teststreaming("widestream default classic time", t,
+ //std::wstring(L"Wed Oct 13 18:01:56 2004"),
+ std::wstring(L"10/13/04 18:01:56"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+ teststreaming("widestream default classic time with fractional seconds truncated", t,
+ //std::wstring(L"Wed Oct 13 18:01:56 2004"),
+ std::wstring(L"10/13/04 18:01:56"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+ teststreaming("widestream default time period with fractional seconds truncated", tp,
+ //std::wstring(L"[Wed Oct 13 18:01:56 2004/Wed Oct 20 19:02:57 2004]"),
+ std::wstring(L"[10/13/04 18:01:56/10/20/04 19:02:57]"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(L"%Y-%b-%d %I:%M:%S %p");
+ teststreaming("widestream time in 12 hours format w/ (AM/PM)", tp.begin(),
+ std::wstring(L"2004-Oct-13 06:01:56 PM"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000000"),
+ std::locale(std::locale::classic(), timefacet));
+#else
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000"),
+ std::locale(std::locale::classic(), timefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000000"));
+#else
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000"));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+
+ //wtime_facet *timefacet = new wtime_facet();
+ //std::locale cloc = std::locale(std::locale::classic(), timefacet);
+ //ss.imbue(cloc);
+// ss << L"classic date: " << d << std::endl;
+// ss << L"classic dateperiod: " << dp << std::endl;
+ //ss << L"classic time: " << t << std::endl;
+ //ss << L"classic timefrac: " << tf << std::endl;
+ //ss << L"classic timeperiod: " << tp << std::endl;
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"day: %j date: %Y-%b-%d weekday: %A time: %H:%M:%s");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time facet narly format", t,
+ std::wstring(L"day: 287 date: 2004-Oct-13 weekday: Wednesday time: 18:01:56.000000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time facet narly format", t,
+ std::wstring(L"day: 287 date: 2004-Oct-13 weekday: Wednesday time: 18:01:56.000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif
+ }
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S,%f");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time fractional seconds: %Y-%b-%d %H:%M:%S,%f", t,
+ std::wstring(L"2004-Oct-13 18:01:56,000000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time fractional seconds: %Y-%b-%d %H:%M:%S,%f", t,
+ std::wstring(L"2004-Oct-13 18:01:56,000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S");
+ teststreaming("widestream custom time no frac seconds: %Y-%b-%d %H:%M:%S", t,
+ std::wstring(L"2004-Oct-13 18:01:56"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S");
+ wtimefacet->short_month_names(de_short_month_names);
+ teststreaming("widestream custom time no frac seconds, german months: %Y-%b-%d %H:%M:%S", t,
+ std::wstring(L"2004-Okt-13 18:01:56"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet();
+ wtimefacet->format(L"%B %b %Y");
+ wtimefacet->short_month_names(de_short_month_names);
+ wtimefacet->long_month_names(de_long_month_names);
+ teststreaming("widestream custom time no frac seconds, german months: %B %b %Y", t,
+ std::wstring(L"Oktober Okt 2004"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S" L"%F");
+ teststreaming("widestream custom time no frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", t,
+ std::wstring(L"2004-Oct-13 18:01:56"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S" L"%F");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time with frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tf,
+ std::wstring(L"2004-Oct-13 18:01:56.000003000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time with frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tf,
+ std::wstring(L"2004-Oct-13 18:01:56.000003"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+ {
+ wtime_facet* wtimefacet = new wtime_facet();
+ wtimefacet->set_iso_format();
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time iso format", tf,
+ std::wstring(L"20041013T180156.000003000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time iso format", tf,
+ std::wstring(L"20041013T180156.000003"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+ {
+ wtime_facet* wtimefacet = new wtime_facet();
+ wtimefacet->set_iso_extended_format();
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time iso extended format", tf,
+ std::wstring(L"2004-10-13 18:01:56.000003000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time iso extended format", tf,
+ std::wstring(L"2004-10-13 18:01:56.000003"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S" L"%F");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream time period frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tp,
+ std::wstring(L"[2004-Oct-13 18:01:56/2004-Oct-20 19:02:57.000002999]"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream time period frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tp,
+ std::wstring(L"[2004-Oct-13 18:01:56/2004-Oct-20 19:02:57.000002]"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%s");
+ wperiod_formatter pf(wperiod_formatter::AS_OPEN_RANGE, L" / ", L"[ ", L" )", L" ]");
+ wtimefacet->period_formatter(pf);
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time : %Y-%b-%d %H:%M:%s", tp,
+ std::wstring(L"[ 2004-Oct-13 18:01:56.000000000 / 2004-Oct-20 19:02:57.000003000 )"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time : %Y-%b-%d %H:%M:%s", tp,
+ std::wstring(L"[ 2004-Oct-13 18:01:56.000000 / 2004-Oct-20 19:02:57.000003 )"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+
+ {
+ ptime nt(not_a_date_time);
+ teststreaming("widestream custom time : not a datetime", nt,
+ std::wstring(L"not-a-date-time"));
+ }
+
+
+
+
+// //Denmark English has iso extended default format...
+// std::locale gloc("en_DK");
+// ss.imbue(gloc);
+// ss << L"default english-denmark date: " << d << std::endl;
+// ss << L"default english-denmark dateperiod: " << dp << std::endl;
+// ss << L"default english-denmark time: " << t << std::endl;
+// ss << L"default english-denmark timefrac: " << tf << std::endl;
+// ss << L"default english-denmark timeperiod: " << tp << std::endl;
+
+
+
+#endif
+ }
+ catch(std::exception& e) {
+ std::cout << "Caught std::exception: " << e.what() << std::endl;
+ }
+ catch(...) {
+ std::cout << "bad exception" << std::endl;
+ }
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/posix_time/testtime_formatters.cpp b/libs/date_time/test/posix_time/testtime_formatters.cpp
new file mode 100644
index 000000000..bafeda954
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime_formatters.cpp
@@ -0,0 +1,106 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ date d1(2002,Jan,1);
+ std::string d1_string("2002-Jan-01");
+ std::string t1_string("01:02:03");
+ std::string t1_result = d1_string + " " + t1_string;
+ ptime t1(d1,time_duration(1,2,3)); //2002-Jan-1 01:02:03
+ std::cout << to_simple_string(t1) << std::endl;
+ check("simple: " + t1_result, t1_result == to_simple_string(t1));
+ std::string iso_result = "20020101T010203";
+ check("iso: " + iso_result, iso_result == to_iso_string(t1));
+ std::string iso_ext_result = "2002-01-01T01:02:03";
+ check("iso ext: " + iso_ext_result, iso_ext_result == to_iso_extended_string(t1));
+
+
+
+#ifdef BOOST_DATE_TIME_HAS_MILLISECONDS
+
+ if (time_duration::resolution() == boost::date_time::milli) {
+ ptime t4(d1,hours(1)+minutes(2)+seconds(3)+millisec(4));
+ std::string r3 = to_simple_string(t4);
+ check("simple subsecond: "+r3 ,
+ std::string("2002-Jan-01 01:02:03.004000") == r3);
+ }
+
+#endif
+
+#ifdef BOOST_DATE_TIME_HAS_MICROSECONDS
+
+ if (time_duration::resolution() == boost::date_time::micro) {
+ ptime t3(d1,hours(1)+minutes(2)+seconds(3)+microsec(4));
+ std::string result = to_simple_string(t3);
+ check("microsecond: "+result ,
+ std::string("2002-Jan-01 01:02:03.000004") == to_simple_string(t3));
+
+ time_duration td2 = hours(-12)+minutes(4)+seconds(2)+microsec(1);
+ // time_duration td2 = hours(-12)+minutes(4)+seconds(2)+millisec(1);
+ std::string r2 = to_simple_string(td2);
+ check("microseond neg subsecond duration: "+r2 ,
+ std::string("-11:55:57.999999") == r2);
+
+ std::string s1("-01:25:00"), s2("-00:40:00"), is1("-012500"), is2("-004000");
+ time_duration td1(-1,25,0);
+ time_duration tds2(0,-40,0);
+ check("to string: " + to_simple_string(td1), to_simple_string(td1) == s1);
+ check("to string: " + to_simple_string(tds2), to_simple_string(tds2) == s2);
+ check("to string: " + to_iso_string(td1), to_iso_string(td1) == is1);
+ check("to string: " + to_iso_string(tds2), to_iso_string(tds2) == is2);
+ }
+#endif
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+
+ if (time_duration::resolution() == boost::date_time::nano) {
+ ptime t2(d1,hours(12) + minutes(5) + seconds(1));
+ time_period p1(t1,t2); //last value in period is 12:05:00 1/10000 sec less than t2
+ std::string period_result("["+t1_result + "/" + d1_string + " " + "12:05:00.999999999]" );
+ check("simple: " + period_result + "==" + to_simple_string(p1), period_result == to_simple_string(p1));
+
+ ptime t3(d1,hours(1)+minutes(2)+seconds(3)+nanosec(4));
+ std::string result = to_simple_string(t3);
+ check("simple subsecond: "+result ,
+ std::string("2002-Jan-01 01:02:03.000000004") == to_simple_string(t3));
+
+
+ std::string s1("-01:25:00"), s2("-00:40:00"), is1("-012500"), is2("-004000");
+ time_duration td1(-1,25,0);
+ time_duration tds2(0,-40,0);
+ check("to string: " + to_simple_string(td1), to_simple_string(td1) == s1);
+ check("to string: " + to_simple_string(tds2), to_simple_string(tds2) == s2);
+ check("to string: " + to_iso_string(td1), to_iso_string(td1) == is1);
+ check("to string: " + to_iso_string(tds2), to_iso_string(tds2) == is2);
+
+ time_duration td2 = hours(-12)+minutes(4)+seconds(2)+nanosec(100);
+ std::string r2 = to_simple_string(td2);
+ check("neg subsecond duration: "+r2 ,
+ std::string("-11:55:57.999999900") == r2);
+
+ ptime t4(d1,hours(1)+minutes(2)+seconds(3)+millisec(4));
+ std::string r3 = to_simple_string(t4);
+ check("simple subsecond: "+r3 ,
+ std::string("2002-Jan-01 01:02:03.004000000") == r3);
+ }
+#endif
+
+
+ return printTestStats();
+
+
+}
+
+
diff --git a/libs/date_time/test/posix_time/testtime_input_facet.cpp b/libs/date_time/test/posix_time/testtime_input_facet.cpp
new file mode 100644
index 000000000..d1fc100d6
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime_input_facet.cpp
@@ -0,0 +1,435 @@
+/* Copyright (c) 2005 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)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2012-09-22 09:04:10 -0700 (Sat, 22 Sep 2012) $
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+// for tests that are expected to fail and throw exceptions
+template<class temporal_type, class exception_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ exception_type const& /*except*/,
+ boost::posix_time::time_input_facet* facet)
+{
+ using namespace boost::posix_time;
+ bool result = false;
+ std::istringstream iss(input);
+ iss.exceptions(std::ios_base::failbit); // turn on exceptions
+ iss.imbue(std::locale(std::locale::classic(), facet));
+ try {
+ iss >> component;
+ }
+ catch(exception_type& e) {
+ std::cout << "Expected exception caught: \""
+ << e.what() << "\"" << std::endl;
+ result = iss.fail(); // failbit must be set to pass test
+ }
+ catch(...) {
+ result = false;
+ }
+
+ return result;
+}
+
+// for tests that are expected to fail quietly
+template<class temporal_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ boost::posix_time::time_input_facet* facet)
+{
+ using namespace boost::posix_time;
+ std::istringstream iss(input);
+ /* leave exceptions turned off
+ * iss.exceptions(std::ios_base::failbit); */
+ iss.imbue(std::locale(std::locale::classic(), facet));
+ try {
+ iss >> component;
+ }
+ catch(...) {
+ std::cout << "Caught unexpected exception" << std::endl;
+ return false;
+ }
+
+ return iss.fail(); // failbit must be set to pass test
+}
+
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+
+void
+do_all_tests()
+{
+
+#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO) // skip this file
+ check("No tests run for this compiler. Incompatible IO", true);
+#else
+
+ // set up initial objects
+ time_duration td = hours(0);
+ ptime pt(not_a_date_time);
+ time_period tp(pt, td);
+ // exceptions for failure_tests
+ std::ios_base::failure e_failure("default");
+
+ /* test ptime, time_duration, time_period.
+ * test all formats.
+ * test for bad input.
+ * test special values.
+ * do not test custom names (done in gregorian).
+ *
+ * format flags to test H,M,S,s,F,f,j
+ */
+
+ // default format tests: time_duration, ptime
+ std::istringstream iss("09:59:01.321987654321 2005-Jan-15 10:15:03.123456789123");
+ iss >> td;
+ iss >> pt;
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ check_equal("Default format time_duration", td, time_duration(9,59,1,321987654));
+ check_equal("Default format ptime", pt, ptime(date(2005,01,15),time_duration(10,15,3,123456789)));
+#else
+ check_equal("Default format time_duration", td, time_duration(9,59,1,321987));
+ check_equal("Default format ptime", pt, ptime(date(2005,01,15),time_duration(10,15,3,123456)));
+#endif
+
+ // test all flags that appear in time_input_facet
+ iss.str("12:34:56 2005-Jan-15 12:34:56");
+ iss >> td;
+ iss >> pt;
+ check_equal("Default format time_duration no frac_sec", td, time_duration(12,34,56));
+ // the following test insures %F parsing stops at the appropriate point
+ check_equal("Default format ptime", pt, ptime(date(2005,01,15),time_duration(12,34,56)));
+
+ iss.str("14:13:12 extra stuff"); // using default %H:%M:%S%F format
+ iss >> td;
+ check_equal("Default frac_sec format time_duration", td, time_duration(14,13,12));
+
+ time_input_facet* facet = new time_input_facet();
+ std::locale loc(std::locale::classic(), facet);
+ facet->time_duration_format("%H:%M:%S""%f");
+ iss.imbue(loc);
+
+ iss.str("14:13:12.0 extra stuff");
+ iss >> td;
+ check_equal("Required-frac_sec format time_duration", td, time_duration(14,13,12));
+
+ iss.str("12");
+ facet->time_duration_format("%H");
+ iss >> td;
+ check_equal("Hours format", td, hours(12));
+
+ iss.str("05");
+ facet->time_duration_format("%M");
+ iss >> td;
+ check_equal("Minutes format", td, minutes(5));
+
+ iss.str("45");
+ facet->time_duration_format("%S");
+ iss >> td;
+ check_equal("Seconds w/o frac_sec format", td, seconds(45));
+
+ iss.str("10.01");
+ facet->time_duration_format("%s");
+ iss >> td;
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ check_equal("Seconds w/ frac_sec format", td, time_duration(0,0,10,10000000));
+#else
+ check_equal("Seconds w/ frac_sec format", td, time_duration(0,0,10,10000));
+#endif
+
+ iss.str("2005-105T23:59");
+ facet->format("%Y-%jT%H:%M"); // extended ordinal format
+ iss >> pt;
+ check_equal("Extended Ordinal format", pt, ptime(date(2005,4,15),time_duration(23,59,0)));
+
+ /* this is not implemented yet. The flags: %I & %p are not parsed
+ iss.str("2005-Jun-14 03:15:00 PM");
+ facet->format("%Y-%b-%d %I:%M:%S %p");
+ iss >> pt;
+ check_equal("12 hour time format (AM/PM)", pt, ptime(date(2005,6,14),time_duration(15,15,0)));
+ */
+
+ iss.str("2005-Jun-14 15:15:00 %d");
+ facet->format("%Y-%b-%d %H:%M:%S %%d");
+ iss >> pt;
+ check_equal("Literal '%' in format", pt, ptime(date(2005,6,14),time_duration(15,15,0)));
+ iss.str("15:15:00 %d");
+ facet->time_duration_format("%H:%M:%S %%d");
+ iss >> td;
+ check_equal("Literal '%' in time_duration format", td, time_duration(15,15,0));
+ iss.str("2005-Jun-14 15:15:00 %14");
+ facet->format("%Y-%b-%d %H:%M:%S %%%d"); // %% => % & %d => day_of_month
+ iss >> pt;
+ check_equal("Multiple literal '%'s in format", pt, ptime(date(2005,6,14),time_duration(15,15,0)));
+ iss.str("15:15:00 %15");
+ facet->time_duration_format("%H:%M:%S %%%M");
+ iss >> td;
+ check_equal("Multiple literal '%'s in time_duration format", td, time_duration(15,15,0));
+
+ { /****** iso format tests (and custom 'scrunched-together formats) ******/
+ time_input_facet *facet = new time_input_facet();
+ facet->set_iso_format();
+ facet->time_duration_format("%H""%M""%S""%F"); // iso format
+ std::stringstream ss;
+ ss.imbue(std::locale(std::locale::classic(), facet));
+ ptime pt(not_a_date_time);
+ time_duration td(not_a_date_time);
+ date d(2002,Oct,17);
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ time_duration td2(23,12,17,123450000);
+#else
+ time_duration td2(23,12,17,123450);
+#endif
+ ptime result(d, td2);
+
+ ss.str("20021017T231217.12345");
+ ss >> pt;
+ check_equal("iso_format ptime", pt, result);
+ ss.str("");
+ facet->set_iso_extended_format();
+ ss.str("2002-10-17 23:12:17.12345");
+ ss >> pt;
+ check_equal("iso_extended_format ptime", pt, result);
+ ss.str("");
+ ss.str("231217.12345");
+ ss >> td;
+ check_equal("iso_format time_duration", td, td2);
+ ss.str("");
+ ss.str("-infinity");
+ ss >> td;
+ check_equal("iso_format time_duration (special_value)",
+ td, time_duration(neg_infin));
+ ss.str("");
+ // the above tests prove correct parsing of time values in these formats.
+ // these tests show they also handle special_values & exceptions properly
+ time_duration nadt(not_a_date_time);
+ ss.exceptions(std::ios_base::failbit); // we need exceptions turned on here
+ int count = 0;
+ try {
+ facet->time_duration_format("%H""%M""%S""%F");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> td;
+ check_equal("special value w/ hours flag", td, nadt);
+ ss.str("");
+ facet->time_duration_format("%M""%S""%F");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> td;
+ check_equal("special value w/ minutes flag", td, nadt);
+ ss.str("");
+ facet->time_duration_format("%S""%F");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> td;
+ check_equal("special value w/ seconds flag", td, nadt);
+ ss.str("");
+ facet->time_duration_format("%s");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> td;
+ check_equal("special value w/ sec w/frac_sec (always) flag", td, nadt);
+ ss.str("");
+ facet->time_duration_format("%f");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> td;
+ check_equal("special value w/ frac_sec (always) flag", td, nadt);
+ ss.str("");
+ }
+ catch(...) {
+ // any exception is a failure
+ std::stringstream msg;
+ msg << "special_values with scrunched formats failed at test" << count;
+ check(msg.str(), false);
+ }
+ // exception tests
+ std::ios_base::failure exc("failure");
+ check("failure test w/ hours flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%H""%M""%S""%F")));
+ check("silent failure test w/ hours flag",
+ failure_test(td, "bad_input", new time_input_facet("%H""%M""%S""%F")));
+ check("failure test w/ minute flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%M""%S""%F")));
+ check("silent failure test w/ minute flag",
+ failure_test(td, "bad_input", new time_input_facet("%M""%S""%F")));
+ check("failure test w/ second flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%S""%F")));
+ check("silent failure test w/ second flag",
+ failure_test(td, "bad_input", new time_input_facet("%S""%F")));
+ check("failure test w/ sec w/frac (always) flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%s")));
+ check("silent failure test w/ sec w/frac (always) flag",
+ failure_test(td, "bad_input", new time_input_facet("%s")));
+ check("failure test w/ frac_sec flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%f")));
+ check("silent failure test w/ frac_sec flag",
+ failure_test(td, "bad_input", new time_input_facet("%f")));
+
+ }
+ // special_values tests. prove the individual flags catch special_values
+ // NOTE: these flags all by themselves will not parse a complete ptime,
+ // these are *specific* special_values tests
+ iss.str("+infinity -infinity");
+ facet->format("%H");
+ facet->time_duration_format("%H");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %H flag", pt, ptime(pos_infin));
+ check_equal("Special value: time_duration %H flag", td, time_duration(neg_infin));
+
+ iss.str("not-a-date-time +infinity");
+ facet->format("%M");
+ facet->time_duration_format("%M");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %M flag", pt, ptime(not_a_date_time));
+ check_equal("Special value: time_duration %M flag", td, time_duration(pos_infin));
+
+ iss.str("-infinity not-a-date-time ");
+ facet->format("%S");
+ facet->time_duration_format("%S");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %S flag", pt, ptime(neg_infin));
+ check_equal("Special value: time_duration %S flag", td, time_duration(not_a_date_time));
+
+ iss.str("+infinity -infinity");
+ facet->format("%s");
+ facet->time_duration_format("%s");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %s flag", pt, ptime(pos_infin));
+ check_equal("Special value: time_duration %s flag", td, time_duration(neg_infin));
+
+ iss.str("not-a-date-time +infinity");
+ facet->format("%j");
+ facet->time_duration_format("%f");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %j flag", pt, ptime(not_a_date_time));
+ check_equal("Special value: time_duration %f flag", td, time_duration(pos_infin));
+
+ // time_period tests - the time_period_parser is thoroughly tested in gregorian tests
+ // default period format is closed range so last ptime is included in peiod
+ iss.str("[2005-Jan-01 00:00:00/2005-Dec-31 23:59:59]");
+ facet->format(time_input_facet::default_time_input_format); // reset format
+ iss >> tp;
+ check("Time period, default formats",
+ (tp.begin() == ptime(date(2005,1,1),hours(0))) &&
+ (tp.last() == ptime(date(2005,12,31),time_duration(23,59,59))) &&
+ (tp.end() == ptime(date(2005,12,31),time_duration(23,59,59,1))) );
+ {
+ std::stringstream ss;
+ ptime pt(not_a_date_time);
+ ptime pt2 = second_clock::local_time();
+ ptime pt3(neg_infin);
+ ptime pt4(pos_infin);
+ time_period tp(pt2, pt); // ptime/nadt
+ time_period tp2(pt, pt); // nadt/nadt
+ time_period tp3(pt3, pt4);
+ ss << tp;
+ ss >> tp2;
+ check_equal("Special values period (reversibility test)", tp, tp2);
+ ss.str("[-infinity/+infinity]");
+ ss >> tp2;
+ check_equal("Special values period (infinities)", tp3, tp2);
+ }
+
+ // Failure tests
+ // faliure tests for date elements tested in gregorian tests
+ time_input_facet* facet2 = new time_input_facet();
+ facet2->time_duration_format("%H:%M:%S""%f");
+ check("Failure test: Missing frac_sec with %f flag (w/exceptions)",
+ failure_test(td, "14:13:12 extra stuff", e_failure, facet2));
+ time_input_facet* facet3 = new time_input_facet();
+ facet3->time_duration_format("%H:%M:%S""%f");
+ check("Failure test: Missing frac_sec with %f flag (no exceptions)",
+ failure_test(td, "14:13:12 extra stuff", facet3));
+
+ // Reversable format tests
+ time_duration td_io(10,11,12,1234567);
+ ptime pt_io(date(2004,03,15), td_io);
+ time_facet* otp_facet = new time_facet();
+ time_input_facet* inp_facet = new time_input_facet();
+ std::stringstream ss;
+ std::locale loc2(std::locale::classic(), otp_facet);
+ ss.imbue(std::locale(loc2, inp_facet)); // imbue locale containing both facets
+
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: default format", pt_io, pt);
+ ss.str("");
+ ss << td_io; // stream out td_io
+ ss >> td;
+ check_equal("Stream out one time_duration then into another: default format", td_io, td);
+
+ td_io = time_duration(1,29,59); // no frac_sec, default format has %F
+ pt_io = ptime(date(2004,2,29), td_io); // leap year
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: default format", pt_io, pt);
+ ss.str("");
+ ss << td_io; // stream out td_io
+ ss >> td;
+ check_equal("Stream out one time_duration then into another: default format", td_io, td);
+
+ td_io = time_duration(13,05,0); // no seconds as the next formats won't use them
+ pt_io = ptime(date(2004,2,29), td_io); // leap year
+ otp_facet->format("%Y-%jT%H:%M"); // extended ordinal
+ inp_facet->format("%Y-%jT%H:%M");
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: extended ordinal format", pt_io, pt);
+
+ otp_facet->format("Time: %H:%M, Date: %B %d, %Y"); // custom format with extra words
+ inp_facet->format("Time: %H:%M, Date: %B %d, %Y");
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: custom format (" + ss.str() + ")", pt_io, pt);
+
+ {
+ // fully parameterized constructor - compile only test, all other features tested in gregorian
+ boost::date_time::format_date_parser<date, char> fdp("%Y-%b-%d", std::locale::classic());
+ special_values_parser svp; // default constructor
+ period_parser pp; // default constructor
+ boost::date_time::date_generator_parser<date, char> dgp; // default constructor
+ time_input_facet tif("%Y-%m-%d %H:%M:%s", fdp, svp, pp, dgp);
+ }
+#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
+
+}
+
+
+
+int main(){
+
+ try { //wrap all the tests -- we don't expect an exception
+ do_all_tests();
+ }
+ catch(std::exception& e) {
+ std::string failure("std::exception caught: ");
+ failure += e.what();
+ check(failure, false);
+ }
+ catch(...) {
+ check("Unknown exception caught -- failing", false);
+ }
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/posix_time/testtime_period.cpp b/libs/date_time/test/posix_time/testtime_period.cpp
new file mode 100644
index 000000000..67dc4532d
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime_period.cpp
@@ -0,0 +1,77 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include <iostream>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/posix_time/time_period.hpp"
+#include "../testfrmwk.hpp"
+
+int main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ date d1(2001,Jan, 1);
+ ptime t1 (d1,hours(2));//2001-Jan-1 02:00:00
+ ptime t2 (d1,hours(3));//2001-Jan-1 03:00:00
+ time_period p1(t1,t2); //2001-Jan-1 02:59:59
+ time_period p2(p1);
+ check("copy construct & ==", p1 == p2);
+ time_period p3 = p2;
+ check("assignment", p3 == p2);
+ time_period p4(t1,hours(1));
+ check("length", p4.length() == hours(1));
+ std::cout << to_simple_string(t1) << std::endl;
+ std::cout << to_simple_string(p4) << std::endl;
+ std::cout << to_simple_string(p1) << std::endl;
+ check("construction and ==", p1 == p4);
+ check("begin", p1.begin() == t1);
+ check("last", p1.end() == t2);
+ check("end", p1.last() == t2-time_duration::unit());
+
+ std::cout << to_simple_string(p1) << std::endl;
+ // check("last", p1.() == t2);
+ check("contains begin", p1.contains(t1));
+ check("contains end-not", !p1.contains(t2));
+ check("contains last", p1.contains(t2-seconds(1)));
+ ptime t3(date(2001,Jan,1),hours(4));
+ time_period p5(t2,t3);
+ check("check contains", !p1.contains(p5.begin()));
+ check("check contains", !p5.contains(p1.begin()));
+ check("operator== not equal case", !(p1 == p5));
+ check("less than order", p1 < p5);
+ check("greater than order", p5 > p1);
+ check("not equal", p5 != p1);
+ check("intersects with myself", p1.intersects(p1));
+ check("not intersects", !(p1.intersects(p5)));
+ check("not intersects", !(p5.intersects(p1)));
+
+ time_period p6(p5);
+ p6.shift(minutes(30));
+ std::cout << to_simple_string(p5) << std::endl;
+ std::cout << to_simple_string(p6) << std::endl;
+ check("shifted intersects", p5.intersects(p6));
+ check("shifted intersects", p6.intersects(p5));
+ check("contains begin", p5.contains(p6.begin()));
+ p6.shift(minutes(30));
+ std::cout << to_simple_string(p5) << std::endl;
+ std::cout << to_simple_string(p6) << std::endl;
+ check("shifted !intersects", !p5.intersects(p6));
+ check("shifted !intersects", !p6.intersects(p5));
+ p6.shift(minutes(-30));
+ std::cout << to_simple_string(p5) << std::endl;
+ std::cout << to_simple_string(p6) << std::endl;
+ time_period p7 = p5.intersection(p6);
+ std::cout << to_simple_string(p7) << std::endl;
+ check("shifted intersection",
+ p7 == time_period(ptime(d1,time_duration(3,30,0)),
+ ptime(d1,time_duration(4,0,0))));
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/posix_time/testtime_serialize.cpp b/libs/date_time/test/posix_time/testtime_serialize.cpp
new file mode 100644
index 000000000..f5daaaa6a
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime_serialize.cpp
@@ -0,0 +1,121 @@
+/* Copyright (c) 2002-2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/time_serialize.hpp>
+#include "../testfrmwk.hpp"
+#include <sstream>
+
+using namespace boost;
+using namespace posix_time;
+using namespace gregorian;
+
+template<class archive_type, class temporal_type>
+void save_to(archive_type& ar, const temporal_type& tt)
+{
+ ar << tt;
+}
+
+int main(){
+ // originals
+ date d(2002, Feb, 14);
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ time_duration td(12,13,52,123456789);
+#else
+ time_duration td(12,13,52,123456);
+#endif
+ ptime pt(d, td);
+ time_period tp(pt, ptime(date(2002, Oct, 31), hours(19)));
+ ptime sv_pt1(not_a_date_time);
+ ptime sv_pt2(pos_infin);
+ time_duration sv_td(neg_infin);
+
+ // for loading in from archive
+ date d2(not_a_date_time);
+ time_duration td2(1,0,0);
+ ptime pt2(d2, td2);
+ time_period tp2(pt2, hours(1));
+ ptime sv_pt3(min_date_time);
+ ptime sv_pt4(min_date_time);
+ time_duration sv_td2(0,0,0);
+
+ std::ostringstream oss;
+
+ // NOTE: DATE_TIME_XML_SERIALIZE is only used in testing and is
+ // defined in the testing Jamfile
+#if defined(DATE_TIME_XML_SERIALIZE)
+ std::cout << "Running xml archive tests" << std::endl;
+ archive::xml_oarchive oa(oss);
+#else
+ std::cout << "Running text archive tests" << std::endl;
+ archive::text_oarchive oa(oss);
+#endif // DATE_TIME_XML_SERIALIZE
+
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ save_to(oa, BOOST_SERIALIZATION_NVP(pt));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_pt1));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_pt2));
+ save_to(oa, BOOST_SERIALIZATION_NVP(tp));
+ save_to(oa, BOOST_SERIALIZATION_NVP(td));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_td));
+#else
+ save_to(oa, pt);
+ save_to(oa, sv_pt1);
+ save_to(oa, sv_pt2);
+ save_to(oa, tp);
+ save_to(oa, td);
+ save_to(oa, sv_td);
+#endif // DATE_TIME_XML_SERIALIZE
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error writing to archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+
+ std::istringstream iss(oss.str());
+#if defined(DATE_TIME_XML_SERIALIZE)
+ archive::xml_iarchive ia(iss);
+#else
+ archive::text_iarchive ia(iss);
+#endif // DATE_TIME_XML_SERIALIZE
+
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ ia >> BOOST_SERIALIZATION_NVP(pt2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_pt3);
+ ia >> BOOST_SERIALIZATION_NVP(sv_pt4);
+ ia >> BOOST_SERIALIZATION_NVP(tp2);
+ ia >> BOOST_SERIALIZATION_NVP(td2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_td2);
+#else
+ ia >> pt2;
+ ia >> sv_pt3;
+ ia >> sv_pt4;
+ ia >> tp2;
+ ia >> td2;
+ ia >> sv_td2;
+#endif // DATE_TIME_XML_SERIALIZE
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error readng from archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+
+ check("ptime", pt == pt2);
+ check("special_values ptime (nadt)", sv_pt1 == sv_pt3);
+ check("special_values ptime (pos_infin)", sv_pt2 == sv_pt4);
+ check("time_period", tp == tp2);
+ check("time_duration", td == td2);
+ check("special_values time_duration (neg_infin)", sv_td == sv_td2);
+
+ return printTestStats();
+}
diff --git a/libs/date_time/test/posix_time/testtime_wstream.cpp b/libs/date_time/test/posix_time/testtime_wstream.cpp
new file mode 100644
index 000000000..e67c770aa
--- /dev/null
+++ b/libs/date_time/test/posix_time/testtime_wstream.cpp
@@ -0,0 +1,89 @@
+/* Copyright (c) 2003-2004 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)
+ * Author: Bart Garst
+ * $Date: 2008-11-26 13:07:14 -0800 (Wed, 26 Nov 2008) $
+ */
+#include <iostream>
+#include <sstream>
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include "../testfrmwk.hpp"
+#include <boost/lexical_cast.hpp>
+
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+using boost::lexical_cast;
+
+int main(){
+#if defined(BOOST_NO_STD_WSTRING) || \
+ defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+ check("No wstring/wstream support for this compiler", false);
+#else
+
+ std::wstring res, ws;
+ std::wstringstream wss;
+ /* time_period was used because all the time-type objects
+ * that have operator<< can be easily accessed from it.
+ * Tose are: ptime, time_duration, time_period */
+ date d1(2003,Jan,20), d2(2003,May,10);
+ time_period tp(ptime(d1,hours(1)), ptime(d2,hours(15)));
+
+ // ptime
+ wss << tp.begin();
+ res = L"2003-Jan-20 01:00:00";
+ check("ptime op<<", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(tp.begin());
+ check("ptime to_simple_wstring", res == ws);
+ res = L"20030120T010000";
+ ws = to_iso_wstring(tp.begin());
+ check("ptime to_iso_wstring", res == ws);
+ res = L"2003-01-20T01:00:00";
+ ws = to_iso_extended_wstring(tp.begin());
+ check("ptime to_iso_extended_wstring", res == ws);
+
+ // time_duration
+ wss << tp.length();
+ res = L"2654:00:00";
+ check("time_duration", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(tp.length());
+ check("time_duration to_simple_wstring", res == ws);
+ res = L"26540000";
+ ws = to_iso_wstring(tp.length());
+ check("time_duration to_iso_wstring", res == ws);
+
+ // time_period
+ wss << tp;
+#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ res = L"[2003-Jan-20 01:00:00/2003-May-10 14:59:59.999999999]";
+#else
+ res = L"[2003-Jan-20 01:00:00/2003-May-10 14:59:59.999999]";
+#endif
+ check("time_period", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(tp);
+ check("time_period to_simple_wstring", res == ws);
+
+ // special values
+ time_duration sv_td(neg_infin);
+ date sv_d(pos_infin);
+ ptime sv_tp(sv_d,hours(1));
+ res = L"+infinity";
+ wss << sv_tp;
+ check("ptime op<< special value", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(sv_tp);
+ check("ptime to_simple_wstring special value", res == ws);
+ res = L"-infinity";
+ wss << sv_td;
+ check("time_duration op<< special value", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(sv_td);
+ check("time_duration to_simple_wstring special value", res == ws);
+
+#endif
+ return printTestStats();
+}
diff --git a/libs/date_time/test/testconstrained_value.cpp b/libs/date_time/test/testconstrained_value.cpp
new file mode 100644
index 000000000..7db8d1077
--- /dev/null
+++ b/libs/date_time/test/testconstrained_value.cpp
@@ -0,0 +1,77 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/config.hpp"
+#include "boost/date_time/constrained_value.hpp"
+#include "testfrmwk.hpp"
+#include <iostream>
+
+class bad_day {}; //exception type
+
+
+class day_value_policies
+{
+public:
+ typedef unsigned int value_type;
+ static unsigned int min BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; };
+ static unsigned int max BOOST_PREVENT_MACRO_SUBSTITUTION () { return 31;};
+ static void on_error(unsigned int&, unsigned int, boost::CV::violation_enum)
+ {
+ throw bad_day();
+ }
+};
+
+struct range_error {}; //exception type
+typedef boost::CV::simple_exception_policy<int,1,10,range_error> one_to_ten_range_policy;
+
+int main()
+{
+ using namespace boost::CV;
+ constrained_value<day_value_policies> cv1(0), cv2(31);
+ check("not equal", cv1 != cv2);
+ check("equal", cv1 == cv1);
+ check("greater", cv2 > cv1);
+ check("greater or equal ", cv2 >= cv1);
+ //various running of the conversion operator
+ std::cout << cv1 << std::endl;
+ unsigned int i = cv1;
+ check("test conversion", i == cv1);
+
+
+ try {
+ constrained_value<one_to_ten_range_policy> cv2(11);
+ std::cout << "Not Reachable: " << cv2 << " ";
+ check("got range exception max", false);
+ }
+ catch(range_error& e) {
+ e = e; // removes compiler warning
+ check("got range exception max", true);
+ }
+
+ try {
+ constrained_value<one_to_ten_range_policy> cv3(0);
+ std::cout << "Not Reachable: " << cv3 << " ";
+ check("got range exception min", false);
+ }
+ catch(range_error& e) {
+ e = e; // removes compiler warning
+ check("got range exception min", true);
+ }
+
+ try {
+ constrained_value<one_to_ten_range_policy> cv4(1);
+ cv4 = 12;
+ check("range exception on assign", false);
+ }
+ catch(range_error& e) {
+ e = e; // removes compiler warning
+ check("range exception on assign", true);
+ }
+
+ return printTestStats();
+}
+
diff --git a/libs/date_time/test/testfrmwk.hpp b/libs/date_time/test/testfrmwk.hpp
new file mode 100644
index 000000000..f74cdb0a1
--- /dev/null
+++ b/libs/date_time/test/testfrmwk.hpp
@@ -0,0 +1,89 @@
+
+#ifndef TEST_FRMWK_HPP___
+#define TEST_FRMWK_HPP___
+
+/* Copyright (c) 2002,2003 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)
+ * $Date: 2010-06-09 10:36:07 -0700 (Wed, 09 Jun 2010) $
+ */
+
+
+#include <iostream>
+#include <string>
+#include <boost/config.hpp>
+
+//! Really simple test framework for counting and printing
+class TestStats
+{
+public:
+ static TestStats& instance() {static TestStats ts; return ts;}
+ void addPassingTest() {testcount_++; passcount_++;}
+ void addFailingTest() {testcount_++;}
+ unsigned int testcount() const {return testcount_;}
+ unsigned int passcount() const {return passcount_;}
+ void print(std::ostream& out = std::cout) const
+ {
+ out << testcount_ << " Tests Executed: " ;
+ if (passcount() != testcount()) {
+ out << (testcount() - passcount()) << " FAILURES";
+ }
+ else {
+ out << "All Succeeded" << std::endl;
+ }
+ out << std::endl;
+ }
+private:
+ TestStats() : testcount_(0), passcount_(0) {}
+ unsigned int testcount_;
+ unsigned int passcount_;
+};
+
+
+inline bool check(const std::string& testname, bool testcond)
+{
+ TestStats& stat = TestStats::instance();
+ if (testcond) {
+ std::cout << "Pass :: " << testname << " " << std::endl;
+ stat.addPassingTest();
+ return true;
+ }
+ else {
+ stat.addFailingTest();
+ std::cout << "FAIL :: " << testname << " " << std::endl;
+ return false;
+ }
+}
+
+template< typename T, typename U >
+inline bool check_equal(const std::string& testname, T const& left, U const& right)
+{
+ bool res = check(testname, left == right);
+ if (!res)
+ {
+ std::cout << " left = " << left << ", right = " << right << std::endl;
+ }
+ return res;
+}
+
+#ifndef BOOST_NO_STD_WSTRING
+inline bool check_equal(const std::string& testname, std::wstring const& left, std::wstring const& right)
+{
+ bool res = check(testname, left == right);
+ if (!res)
+ {
+ std::wcout << L" left = " << left << L", right = " << right << std::endl;
+ }
+ return res;
+}
+#endif
+
+inline int printTestStats()
+{
+ TestStats& stat = TestStats::instance();
+ stat.print();
+ return stat.testcount() - stat.passcount();
+}
+
+#endif
diff --git a/libs/date_time/test/testfrom_facet.cpp b/libs/date_time/test/testfrom_facet.cpp
new file mode 100644
index 000000000..75343d73a
--- /dev/null
+++ b/libs/date_time/test/testfrom_facet.cpp
@@ -0,0 +1,50 @@
+/* Copyright (c) 2004 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)
+ * Author: Jeff Garland
+ * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $
+ *
+ * This file isn't part of the official regression test suite at
+ * the moment, but it is a basic test of the strings_from_facet.hpp
+ * infrastructure that can be compiled trivially.
+ */
+
+
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <vector>
+#include <fstream>
+
+#include "boost/date_time/strings_from_facet.hpp"
+#include "algorithm_ext/container_print.hpp"
+
+
+
+int
+main()
+{
+ using boost::date_time::gather_month_strings;
+ using boost::date_time::gather_weekday_strings;
+
+ std::vector<std::string> data;
+ std::vector<std::wstring> wdata;
+
+ data = gather_month_strings<char>(std::locale::classic());
+ print(data, std::cout);
+ data = gather_month_strings<char>(std::locale::classic(), false);
+ print(data, std::cout);
+ data = gather_weekday_strings<char>(std::locale::classic());
+ print(data, std::cout);
+ data = gather_weekday_strings<char>(std::locale::classic(), false);
+ print(data, std::cout);
+
+ wdata = gather_month_strings<wchar_t>(std::locale::classic());
+ std::wofstream wof("from_facet_test.out");
+ int i=0;
+ while (i < wdata.size()) {
+ wof << wdata[i] << std::endl;
+ i++;
+ }
+}
diff --git a/libs/date_time/test/testgeneric_period.cpp b/libs/date_time/test/testgeneric_period.cpp
new file mode 100644
index 000000000..230c25c36
--- /dev/null
+++ b/libs/date_time/test/testgeneric_period.cpp
@@ -0,0 +1,281 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Bart Garst
+ */
+
+#include <iostream>
+#include "boost/date_time/period.hpp"
+#include "testfrmwk.hpp"
+
+/*! duration_rep parameter for period requires a func unit() that
+ * returns the smallest unit of measure for this type. This minimal
+ * class fulfills that, and other, requirements */
+template<class int_type>
+class duration_type {
+ public:
+ duration_type(int_type a = 0) : _val(a) {}
+ static int_type unit() { return 1; }
+ int_type get_rep() { return _val; }
+ bool operator==(duration_type<int_type> rhs) { return _val == rhs._val; }
+ bool operator<(duration_type<int_type> rhs) { return _val < rhs._val; }
+ bool operator>(duration_type<int_type> rhs) { return _val > rhs._val; }
+ private:
+ int_type _val;
+};
+//! To enable things like "cout << period.length()"
+template<class int_type>
+inline
+std::ostream& operator<<(std::ostream& os, duration_type<int_type> dt){
+ os << dt.get_rep();
+ return os;
+}
+//! this operator is needed because period adds a duration_rep to a point_rep
+template<class int_type>
+inline
+int_type operator+(int i, duration_type<int_type> dt){
+ return i + dt.get_rep();
+}
+
+//! this operator is needed because period adds a duration_rep to a point_rep
+template<class int_type>
+inline
+int_type operator-(int i, duration_type<int_type> dt){
+ return i - dt.get_rep();
+}
+
+
+int main(){
+ using namespace boost::date_time;
+ typedef period<int, duration_type<int> > a_period;
+
+ /*** check all functions - normal periods ***/
+
+ a_period p1(1, duration_type<int>(9));
+ check("Different constructors", p1 == a_period(1, 10));
+ check("First", p1.begin() == 1);
+ check("Last", p1.last() == 9);
+ check("End", p1.end() == 10);
+ check("Length", p1.length() == 9);
+ check("is_null (not)", !p1.is_null());
+ {
+ a_period p1(1, 10);
+ check("First", p1.begin() == 1);
+ check("Last", p1.last() == 9);
+ check("End", p1.end() == 10);
+ check("Length", p1.length() == 9);
+ check("is_null (not)", !p1.is_null());
+ }
+
+ a_period p2(5, 30);
+ check("First", p2.begin() == 5);
+ check("Last", p2.last() == 29);
+ check("End", p2.end() == 30);
+ check("Length", p2.length() == 25);
+ check("is_null (not)", !p2.is_null());
+
+ a_period p3(35, 81);
+ check("Operator ==", p1 == a_period(1,10));
+ check("Operator !=", p1 != p2);
+ check("Operator <", p1 < p3);
+ check("Operator >", p3 > p2);
+
+ {
+ a_period p(1,10);
+ p.shift(5);
+ check("Shift (right)", p == a_period(6,15));
+ p.shift(-15);
+ check("Shift (left)", p == a_period(-9,0));
+ }
+
+ check("Contains rep", p2.contains(20));
+ check("Contains rep (not)", !p2.contains(2));
+ check("Contains period", p1.contains(a_period(2,8)));
+ check("Contains period (not)", !p1.contains(p3));
+
+ check("Intersects", p1.intersects(p2));
+ check("Intersects", p2.intersects(p1));
+
+ check("Adjacent", p1.is_adjacent(a_period(-5,1)));
+ check("Adjacent", p1.is_adjacent(a_period(10,20)));
+ check("Adjacent (not)", !p1.is_adjacent(p3));
+
+ check("Is before", p1.is_before(15));
+ check("Is after", p3.is_after(15));
+
+ check("Intersection", (p1.intersection(p2) == a_period(5,10)));
+ check("Intersection", (p1.intersection(p3).is_null()));
+
+ check("Merge", p1.merge(p2) == a_period(1,30) );
+ check("Merge", p1.merge(p3).is_null());
+
+ check("Span", p3.span(p1) == a_period(1, 81));
+
+ /*** zero length period ***/
+
+ // treat a zero length period as a point
+ a_period zero_len(3,duration_type<int>(0));
+ check("Same beg & end == zero_length",
+ a_period(1,1) == a_period(1, duration_type<int>(0)));
+ check("2 point (zero length) == 1 point zero duration",
+ a_period(3,3) == zero_len);
+
+ // zero_length period always returns false for is_before & is_after
+ check("Is Before zero period", !zero_len.is_before(5));
+ check("Is After zero period (not)", !zero_len.is_after(5));
+ check("Is Before zero period (not)", !zero_len.is_before(-5));
+ check("Is After zero period", !zero_len.is_after(-5));
+
+ check("is_null", zero_len.is_null());
+ check("Contains rep (not)", !zero_len.contains(20));
+ // a null_period cannot contain any points
+ check("Contains rep", !zero_len.contains(3));
+ check("Contains period (not)", !zero_len.contains(a_period(5,8)));
+ check("Contains period", p1.contains(zero_len));
+ check("Intersects", zero_len.intersects(p1));
+ check("Intersects", p1.intersects(zero_len));
+ check("Adjacent", zero_len.is_adjacent(a_period(-10,3)));
+ check("Adjacent", a_period(-10,3).is_adjacent(zero_len));
+ check("Intersection", (zero_len.intersection(p1) == zero_len));
+ check("Span", zero_len.span(p2) == a_period(3,30));
+
+ /*** invalid period ***/
+
+ a_period null_per(5,1);
+
+ check("Is Before invalid period (always false)", !null_per.is_before(7));
+ check("Is After invalid period (always false)", !null_per.is_after(7));
+ check("Is Before invalid period (always false)", !null_per.is_before(-5));
+ check("Is After invalid period (always false)", !null_per.is_after(-5));
+
+ check("is_null", null_per.is_null());
+ check("Contains rep larger (always false)", !null_per.contains(20));
+ check("Contains rep in-between (always false)", !null_per.contains(3));
+ check("Contains period (not)", !null_per.contains(a_period(7,9)));
+ check("Contains period", p1.contains(null_per));
+ check("Intersects", null_per.intersects(p1));
+ check("Intersects", p1.intersects(null_per));
+ check("Adjacent", null_per.is_adjacent(a_period(-10,5)));
+ check("Adjacent", null_per.is_adjacent(a_period(1,10)));
+
+ // what should this next one do?
+ //check("Intersection", (null_per.intersection(p1) == zero_len));
+ check("Span", null_per.span(p3) == a_period(5,81));
+
+ {
+ std::cout << std::endl;
+ a_period p1(0, -2);
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == -3);
+ check("End", p1.end() == -2);
+ check("Length", p1.length() == -2);
+ check("is_null", p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, -1);
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == -2);
+ check("End", p1.end() == -1);
+ check("Length", p1.length() == -1);
+ check("is_null", p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, 0);
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == -1);
+ check("End", p1.end() == 0);
+ check("Length", p1.length() == 0);
+ check("is_null", p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, 1);
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == 0);
+ check("End", p1.end() == 1);
+ check("Length", p1.length() == 1);
+ check("is_null", !p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, 2);
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == 1);
+ check("End", p1.end() == 2);
+ check("Length", p1.length() == 2);
+ check("is_null", !p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, duration_type<int>(-1));
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == -2);
+ check("End", p1.end() == -1);
+ check("Length", p1.length() == -1);
+ check("is_null", p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, duration_type<int>(-2));
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == -3);
+ check("End", p1.end() == -2);
+ check("Length", p1.length() == -2);
+ check("is_null", p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, duration_type<int>(0));
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == -1);
+ check("End", p1.end() == 0);
+ check("Length", p1.length() == 0);
+ check("is_null", p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, duration_type<int>(1));
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == 0);
+ check("End", p1.end() == 1);
+ check("Length", p1.length() == 1);
+ check("is_null", !p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(0, duration_type<int>(2));
+ check("First", p1.begin() == 0);
+ check("Last", p1.last() == 1);
+ check("End", p1.end() == 2);
+ check("Length", p1.length() == 2);
+ check("is_null", !p1.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1(1,1); // length should be 0
+ a_period p2(1,2); // length should be 1
+ a_period p3(1,3); // length should be 2
+ check("Length p1", p1.length() == 0);
+ check("Length p2", p2.length() == 1);
+ check("Length p3", p3.length() == 2);
+ check("is_null p1 (not)", p1.is_null());
+ check("is_null p2 (not)", !p2.is_null());
+ }
+
+ {
+ a_period p1(1,2); // length should be 1
+ p1.shift(duration_type<int>(1));
+ a_period p2(2,3); // shifted result
+ check("shift", p1 == p2);
+ }
+ {
+ a_period p1(5,duration_type<int>(3));
+ a_period p2(3,10); // expanded result
+ p1.expand(duration_type<int>(2)); //from 2000-Jan-01--2000-Jan-04
+ check("expand", p1 == p2);
+ }
+ return printTestStats();
+}
diff --git a/libs/date_time/test/testgregorian_calendar.cpp b/libs/date_time/test/testgregorian_calendar.cpp
new file mode 100644
index 000000000..c0fedac09
--- /dev/null
+++ b/libs/date_time/test/testgregorian_calendar.cpp
@@ -0,0 +1,253 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/gregorian_calendar.hpp"
+#include "boost/date_time/year_month_day.hpp"
+#include "testfrmwk.hpp"
+#include <iostream>
+
+int
+main()
+{
+ typedef boost::date_time::year_month_day_base<unsigned long,
+ unsigned short,
+ unsigned short > simple_ymd_type;
+
+ typedef boost::date_time::gregorian_calendar_base<simple_ymd_type, unsigned long>
+ gregorian_calendar;
+
+ // using namespace boost::gregorian;
+ check("Day of week 2000-09-24 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,24))==0);
+ check("Day of week 2000-09-25 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,25))==1);
+ check("Day of week 2000-09-26 == 2 (Tue)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,26))==2);
+ check("Day of week 2000-09-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,27))==3);
+ check("Day of week 2000-09-28 == 4 (Thu)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,28))==4);
+ check("Day of week 2000-09-29 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,29))==5);
+ check("Day of week 2000-09-30 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,30))==6);
+ //see calendar FAQ 2.2 for reference
+ check("Day of week 1953-08-02 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,2))==0);
+ check("Day of week 1953-08-03 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,3))==1);
+ check("Day of week 1953-08-04 == 2 (Tue)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,4))==2);
+ check("Day of week 1953-08-05 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,5))==3);
+ check("Day of week 1953-08-06 == 4 (Thu)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,6))==4);
+ check("Day of week 1953-08-07 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,7))==5);
+ check("Day of week 1953-08-08 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,8))==6);
+ check("Day of week 2001-08-31 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2001,8,31))==5);
+
+ //Checked against Caledrical Calc M. Edition p 396 and www site
+ check("Day of week 1400-01-01 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1400,1,1))==3);
+ check("Day of week 1436-02-03 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1436,2,3))==3);
+ check("Day of week 1492-04-9 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1492,4,9))==6);
+ check("Day of week 1560-03-5 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1560,3,5))==6);
+ check("Day of week 1716-07-24 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1716,7,24))==5);
+ check("Day of week 1768-06-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1768,6,19))==0);
+ check("Day of week 1839-03-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1839,3,27))==3);
+ check("Day of week 1819-08-02 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1819,8,2))==1);
+ check("Day of week 1903-04-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1903,4,19))==0);
+ check("Day of week 1929-08-25 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1929,8,25))==0);
+ check("Day of week 2038-11-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2038,11,10))==3);
+ check("Day of week 2094-07-18 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2094,7,18))==0);
+ //verified against website applet
+ check("Day of week 3002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(3002,7,10))==6);
+ //verified against website applet
+ check("Day of week 4002-07-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(4002,7,10))==3);
+ //verified against website applet
+ check("Day of week 5002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(5002,7,10))==6);
+
+ check("1404 is a leap year", gregorian_calendar::is_leap_year(1404));
+ check("2000 is a leap year", gregorian_calendar::is_leap_year(2000));
+ check("2004 is a leap year", gregorian_calendar::is_leap_year(2004));
+ check("2400 is a leap year", gregorian_calendar::is_leap_year(2400));
+ check("4000 is a leap year", gregorian_calendar::is_leap_year(4000));
+ check("1400 is NOT a leap year", !gregorian_calendar::is_leap_year(1400));
+ check("1900 is NOT a leap year", !gregorian_calendar::is_leap_year(1900));
+ check("2100 is NOT a leap year", !gregorian_calendar::is_leap_year(2100));
+ check("1999 is NOT a leap year", !gregorian_calendar::is_leap_year(1999));
+ check("5000 is NOT a leap year", !gregorian_calendar::is_leap_year(5000));
+
+ int weeknum1 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2004,10,18));
+ check("ToWeekNumber 2004-10-18 is week 43", weeknum1 == 43);
+
+ int weeknum2 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2002,1,1));
+ check("ToWeekNumber 2002-1-1 is week 1", weeknum2 == 1);
+
+ int weeknum3 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2000,12,31));
+ check("ToWeekNumber 2000-12-31 is week 52", weeknum3 == 52);
+
+ //check for week when week==0.
+ int weeknum4 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2000,1,1));
+ check("ToWeekNumber 2000-1-1 is week 52", weeknum4 == 52);
+
+ //check for week when week==53 and day==6.
+ int weeknum5 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1998,12,31));
+ check("ToWeekNumber 1998-12-31 is week 53", weeknum5 == 53);
+
+ //check for week when week==53 day==5 and the year is a leap year.
+ int weeknum6 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1992,12,31));
+ check("ToWeekNumber 1992-12-31 is week 53", weeknum6 == 53);
+
+ //check for week when week==53 1993-Jan-1
+ int weeknum7 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,1));
+ check("ToWeekNumber 1993-1-1 is week 53", weeknum7 == 53);
+
+ //check for week when week==53 1993-Jan-2
+ int weeknum8 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,2));
+ check("ToWeekNumber 1993-Jan-2 is week 53", weeknum8 == 53);
+
+ //check for week when week==53 1993-Jan-3
+ int weeknum9 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,3));
+ check("ToWeekNumber 1993-Jan-3 is week 53", weeknum9 == 53);
+
+ //check for week when week==1 1993-Jan-4
+ int weeknum10 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,4));
+ check("ToWeekNumber 1993-Jan-4 is week 1", weeknum10 == 1);
+
+ //check for week when week=53 and day != 6 and != 5.
+ int weeknum11 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2001,12,31));
+ check("ToWeekNumber 2001-12-31 is week 1", weeknum11 == 1);
+
+ //test the boundaries of week_number
+ int weeknum12 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1400,1,1));
+ check("ToWeekNumber 1400-1-1 is week 1", weeknum12 == 1);
+
+ int weeknum13 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(9999,12,31));
+ check("ToWeekNumber 9999-12-31 is week 52", weeknum13 == 52);
+
+ int weeknum14 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2003,12,29));
+ check("ToWeekNumber 2003-12-29 is week 1", weeknum14 == 1);
+
+
+ unsigned long jday1 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,1,1));
+ unsigned long jday2 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2001,1,1));
+// unsigned short year, month, day;
+// //2451545 is 2000-1-1
+ check("ToDayNumber 2000-1-1 is day 2451545", jday1 == 2451545);
+ check("ToDayNumber 2001-1-1 is day 2451911", jday2 == 2451911);
+ gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(jday1);
+ check("from_day_number test 2000-1-1", (ymd.year==2000)&&
+ (ymd.month==1) &&
+ (ymd.day==1) );
+
+ unsigned long julianday1 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(2000,12,31));
+ check("ToJulianDayNumber 2000-12-31 is day 2451910", julianday1 == 2451910);
+ gregorian_calendar::ymd_type ymd1 = gregorian_calendar::from_julian_day_number(julianday1);
+ std::cout << ymd1.year << "-" << ymd1.month << "-" << ymd1.day << std::endl;
+ check("from_julian_day_number test 2000-12-31", (ymd1.year==2000) &&
+ (ymd1.month==12) &&
+ (ymd1.day==31) );
+ unsigned long julianday2 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(2000,12,31));
+ std::cout << julianday2 << std::endl;
+ check("TomodJulianDayNumber 2000-12-31 is day 51909", julianday2 == 51909);
+ gregorian_calendar::ymd_type ymd2 = gregorian_calendar::from_modjulian_day_number(julianday2);
+ check("from_modjulian_day_number test 2000-12-31", (ymd2.year==2000) &&
+ (ymd2.month==12) &&
+ (ymd2.day==31) );
+ unsigned long julianday3 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1400,1,1));
+ check("ToJulianDayNumber 1400-1-1 is day 2232400", julianday3 == 2232400);
+ gregorian_calendar::ymd_type ymd3 = gregorian_calendar::from_julian_day_number(julianday3);
+ check("from_julian_day_number test 1400-1-1", (ymd3.year==1400) &&
+ (ymd3.month==1) &&
+ (ymd3.day==1) );
+ long mjd3 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(1400,1,1));
+ std::cout << "mjd3: " << mjd3 << std::endl;
+ check("mod julian day 1400-1-1 is day -167601", mjd3 == -167601);
+ gregorian_calendar::ymd_type mjd_ymd3 = gregorian_calendar::from_modjulian_day_number(mjd3);
+ check("from_julian_day_number test 1400-1-1", (mjd_ymd3.year==1400) &&
+ (mjd_ymd3.month==1) &&
+ (mjd_ymd3.day==1) );
+
+
+ unsigned long julianday4 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1900,2,28));
+ check("ToJulianDayNumber 1900-2-28 is day 2415079", julianday4 == 2415079);
+ gregorian_calendar::ymd_type ymd4 = gregorian_calendar::from_julian_day_number(julianday4);
+ check("from_julian_day_number test 1900-2-28", (ymd4.year==1900) &&
+ (ymd4.month==2) &&
+ (ymd4.day==28) );
+
+ unsigned long julianday5 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1436,2,3));
+ check("ToJulianDayNumber 1436-2-3 is day 2245581", julianday5 == 2245581);
+ gregorian_calendar::ymd_type ymd5 = gregorian_calendar::from_julian_day_number(julianday5);
+ check("from_julian_day_number test 1436-2-3", (ymd5.year==1436) &&
+ (ymd5.month==2) &&
+ (ymd5.day==3) );
+
+ unsigned long julianday6 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1996,2,25));
+ check("ToJulianDayNumber 1996-2-25 is day 2450139", julianday6 == 2450139);
+ gregorian_calendar::ymd_type ymd6 = gregorian_calendar::from_julian_day_number(julianday6);
+ check("from_julian_day_number test 1996-2-25", (ymd6.year==1996) &&
+ (ymd6.month==2) &&
+ (ymd6.day==25) );
+ long mjd6 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(1996,2,25));
+ check("ToJulianDayNumber 1996-2-25 is day 50138", mjd6 == 50138);
+ gregorian_calendar::ymd_type mjd_ymd6 = gregorian_calendar::from_modjulian_day_number(mjd6);
+ check("from_julian_day_number test 1996-2-25", (mjd_ymd6.year==1996) &&
+ (mjd_ymd6.month==2) &&
+ (mjd_ymd6.day==25) );
+
+
+ unsigned long jday3 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(1999,1,1));
+ check("366 days between 2000-1-1 and 2001-1-1", (jday2-jday1) == 366);
+ check("731 days between 1999-1-1 and 2001-1-1 ",(jday2-jday3) == 731);
+
+ unsigned long jday4 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,2,28));
+ unsigned long jday5 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,3,1));
+ check("2 days between 2000-2-28 and 2000-3-1 ",(jday5-jday4) == 2);
+
+ check("31 days in month Jan 2000", gregorian_calendar::end_of_month_day(2000,1) == 31);
+ check("29 days in month Feb 2000", gregorian_calendar::end_of_month_day(2000,2) == 29);
+ check("28 days in month Feb 1999", gregorian_calendar::end_of_month_day(1999,2) == 28);
+ check("28 days in month Feb 2001", gregorian_calendar::end_of_month_day(2001,2) == 28);
+ check("31 days in month Mar 2000", gregorian_calendar::end_of_month_day(2000,3) == 31);
+ check("30 days in month Apr 2000", gregorian_calendar::end_of_month_day(2000,4) == 30);
+ check("31 days in month May 2000", gregorian_calendar::end_of_month_day(2000,5) == 31);
+ check("30 days in month Jun 2000", gregorian_calendar::end_of_month_day(2000,6) == 30);
+ check("31 days in month Jul 2000", gregorian_calendar::end_of_month_day(2000,7) == 31);
+ check("31 days in month Aug 2000", gregorian_calendar::end_of_month_day(2000,8) == 31);
+ check("30 days in month Sep 2000", gregorian_calendar::end_of_month_day(2000,9) == 30);
+ check("31 days in month Oct 2000", gregorian_calendar::end_of_month_day(2000,10) == 31);
+ check("30 days in month Nov 2000", gregorian_calendar::end_of_month_day(2000,11) == 30);
+ check("31 days in month Dec 2000", gregorian_calendar::end_of_month_day(2000,12) == 31);
+
+
+ std::cout << gregorian_calendar::epoch().year << std::endl;
+
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/testint64_range.cpp b/libs/date_time/test/testint64_range.cpp
new file mode 100644
index 000000000..fe4266348
--- /dev/null
+++ b/libs/date_time/test/testint64_range.cpp
@@ -0,0 +1,95 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+//#include "date_time/testfrmwk.hpp"
+#include <iostream>
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/cstdint.hpp"
+
+int
+main()
+{
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+ //skipping tests here due to lack of operator<< support in msvc6
+ // TODO: this is a bit misleading: using STLport, this should work.
+ std::cout << "Skipping tests on MSVC6" << std::endl;
+
+#else
+
+ std::cout << "int64_t max: "
+ << (std::numeric_limits<boost::int64_t>::max)()
+ << std::endl;
+ std::cout << "uint64_t max: "
+ << (std::numeric_limits<boost::uint64_t>::max)()
+ << std::endl;
+
+
+ boost::int64_t seconds_per_day = 60*60*24;
+ boost::int64_t microsec_per_sec = 1000000;
+ boost::int64_t microsec_per_day = seconds_per_day*microsec_per_sec;
+ std::cout << "microsec per day: "
+ << microsec_per_day
+ << std::endl;
+
+ boost::uint64_t total_days = (std::numeric_limits<boost::int64_t>::max)() / microsec_per_day;
+
+ std::cout << "Representable days: "
+ << total_days
+ << std::endl;
+
+ boost::int64_t approx_years = total_days / 366;
+
+ std::cout << "Approximate years: "
+ << approx_years
+ << std::endl;
+
+ //getting day count
+ // usec_count / (seconds_per_day*usec_per_sec);
+ boost::int64_t day_count = 1000;
+ boost::int64_t usec_count1000 = day_count*microsec_per_day + 999999;
+ std::cout << "usec count at day 1000 + 999999: "
+ << usec_count1000
+ << std::endl;
+
+ boost::int64_t day_count_calc = usec_count1000 / microsec_per_day;
+ std::cout << "calc day count at day 1000: "
+ << day_count_calc
+ << std::endl;
+
+ boost::int64_t remaining_usec_count = usec_count1000 % microsec_per_day;
+ std::cout << "remaining usec count: "
+ << remaining_usec_count
+ << std::endl;
+
+ boost::int32_t day_count3M = 3000000;
+ boost::int64_t usec_count3M = day_count3M*microsec_per_day + 999999;
+ std::cout << "usec count at day 3M + 999999: "
+ << usec_count3M
+ << std::endl;
+
+ boost::int64_t day_count_calc3M = usec_count3M / microsec_per_day;
+ std::cout << "calc day count at day 3M: "
+ << day_count_calc3M
+ << std::endl;
+
+ boost::int64_t remaining_usec_count3M = usec_count3M % microsec_per_day;
+ std::cout << "remaining usec count 3M: "
+ << remaining_usec_count3M
+ << std::endl;
+
+#endif
+
+// std::cout << "Days from: "
+// << to_simple_string(d1) << " to "
+// << to_simple_string(d2) << " = "
+// << day_count << std::endl;
+
+
+ // printTestStats();
+ return 0;
+};
+
diff --git a/libs/date_time/test/testint_adapter.cpp b/libs/date_time/test/testint_adapter.cpp
new file mode 100644
index 000000000..8abba211a
--- /dev/null
+++ b/libs/date_time/test/testint_adapter.cpp
@@ -0,0 +1,158 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/int_adapter.hpp"
+#include "testfrmwk.hpp"
+#include "boost/cstdint.hpp"
+#include <iostream>
+#include <sstream>
+
+template<typename int_type>
+void print()
+{
+ //MSVC 6 has problems with this, but it's not really important
+ //so we will just skip them....
+#if (defined(BOOST_DATE_TIME_NO_LOCALE)) || (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+
+#else
+ std::cout << "min: " << (int_type::min)().as_number() << std::endl;
+ std::cout << "max: " << (int_type::max)().as_number() << std::endl;
+ std::cout << "neg_infin: " <<
+ int_type::neg_infinity().as_number() << std::endl;
+ std::cout << "pos_infin: " <<
+ int_type::pos_infinity().as_number() << std::endl;
+ std::cout << "not a number: " <<
+ int_type::not_a_number().as_number() << std::endl;
+ std::stringstream ss("");
+ std::string s("");
+ int_type i = int_type::neg_infinity();
+ ss << i;
+ s = "-infinity";
+ check("streaming -infinity", ss.str() == s);
+
+ i = int_type::pos_infinity();
+ ss.str("");
+ ss << i;
+ s = "+infinity";
+ check("streaming +infinity", ss.str() == s);
+
+ i = int_type::not_a_number();
+ ss.str("");
+ ss << i;
+ s = "not-a-number";
+ check("streaming nan", ss.str() == s);
+
+ i = 12;
+ ss.str("");
+ ss << i;
+ s = "12";
+ check("streaming digits", ss.str() == s);
+#endif
+}
+
+
+template<typename int_type>
+void test_int()
+{
+ int_type i = int_type::neg_infinity();
+
+ check("is infinity", i.is_infinity());
+ check("is special_value (neg_inf)", i.is_special());
+ check("as_special convert", boost::date_time::neg_infin == i.as_special() );
+ check("as_special convert", boost::date_time::neg_infin == int_type::to_special(i.as_number()) );
+ int_type h = int_type::neg_infinity();
+ i = int_type::pos_infinity();
+ check("is infinity", i.is_infinity());
+ check("as_special convert", boost::date_time::pos_infin == i.as_special() );
+ check("infinity less", h < i);
+ check("infinity less", h < 0);
+ check("infinity greater", i > h);
+ check("infinity greater", i > 0);
+ h = int_type::not_a_number();
+ check("nan less", !(h < 0));
+ check("nan greater", !(h > 0));
+ check("nan equal", h == int_type::not_a_number());
+ i = 1;
+ check("is infinity", !i.is_infinity());
+ int_type j = int_type::neg_infinity();
+ check("infinity less", j < i);
+ check("infinity less", !(j < j));
+ check("infinity greater", (i > j));
+ check("infinity equal", !(j == i));
+ check("infinity equal", j == j);
+ check("infinity equal", !(j == 0));
+ check("infinity not equal", j != 0);
+
+ int_type k = 1;
+ check("as_special convert", boost::date_time::not_special == k.as_special() );
+ check("equal", i == k);
+ check("infinity not equal", i != int_type::neg_infinity());
+ check("infinity not equal", i != int_type::pos_infinity());
+ int_type l = i + int_type::pos_infinity();
+ check("is special_value (pos_inf)", l.is_special());
+ check("add infinity" , l == int_type::pos_infinity());
+ { // limiting the scope for these tests was easier than recalculating l
+ int_type l = i - int_type::pos_infinity();
+ check("value - +infinity", l == int_type::neg_infinity());
+ l = i + int_type::neg_infinity();
+ check("value + -infinity", l == int_type::neg_infinity());
+ }
+ check("inf - inf = nan", (l - l) == int_type::not_a_number());
+ check("-inf + inf = nan", (j + l) == int_type::not_a_number());
+ check("add 2", (i + 2) == 3);
+ i = int_type::not_a_number();
+ check("+inf * integer", (l * 2) == l);
+ check("+inf / integer", (l / 2) == l);
+ check("+inf % -integer", (l % -2) == j);
+ check("+inf % integer", (l % 2) == l);
+ check("+inf / -integer", (l / -2) == j);
+ check("+inf * -integer", (l * -2) == j);
+ check("+inf * -inf", (l * j) == j);
+ check("+inf / +inf", (l / l) == i);
+ check("+inf % +inf", (l % l) == i);
+ check("+inf * zero", (l * 0) == i);
+ check("is special_value (nan)", i.is_special());
+ check("as_special convert", boost::date_time::not_a_date_time == i.as_special() );
+ check("add not a number", (i + 2) == int_type::not_a_number());
+ check("sub not a number", (i - 2) == int_type::not_a_number());
+ check("sub from infin", (l - 2) == int_type::pos_infinity());
+ i = 5;
+ h = 3;
+ check("add zero ", (i + 0) == 5);
+ check("sub from 5-2 ", (i - 2) == 3);
+ check("remainder from 5/2 ", (i % 2) == 1);
+ check("remainder from 5/3 ", (i % h) == 2);
+ // std::cout << i.as_number() << std::endl;
+ check("from special ",
+ int_type::from_special(boost::date_time::pos_infin) == int_type::pos_infinity());
+ check("from special ",
+ int_type::from_special(boost::date_time::neg_infin) == int_type::neg_infinity());
+ check("from special ",
+ int_type::from_special(boost::date_time::not_a_date_time) == int_type::not_a_number());
+ check("from special ",
+ int_type::from_special(boost::date_time::min_date_time) == (int_type::min)());
+ check("from special ",
+ int_type::from_special(boost::date_time::max_date_time) == (int_type::max)());
+}
+
+int
+main()
+{
+ using namespace boost::date_time;
+
+ print< int_adapter<unsigned long> >();
+ test_int< int_adapter<unsigned long> >();
+ print< int_adapter<long> >();
+ test_int< int_adapter<long> >();
+ print< int_adapter<boost::int64_t> >();
+ test_int< int_adapter<boost::int64_t> >();
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/testtime_resolution_traits.cpp b/libs/date_time/test/testtime_resolution_traits.cpp
new file mode 100644
index 000000000..20d0ae3e7
--- /dev/null
+++ b/libs/date_time/test/testtime_resolution_traits.cpp
@@ -0,0 +1,72 @@
+/* Copyright (c) 2002,2003 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)
+ * Author: Jeff Garland
+ */
+
+#include "boost/date_time/time_resolution_traits.hpp"
+#include "testfrmwk.hpp"
+
+
+int
+main()
+{
+ using namespace boost::date_time;
+ check("milli traits num digits", milli_res::num_fractional_digits() == 3);
+ check("milli traits resolution adjust",
+ milli_res::res_adjust() == 1000);
+ check("milli tick calculations",
+ milli_res::to_tick_count(0,0,0,1) == 1);
+ check("milli tick calculations",
+ milli_res::to_tick_count(0,0,1,1) == 1001);
+ check("milli tick calculations",
+ milli_res::to_tick_count(0,1,0,0) == 60000);
+ boost::int64_t one_hour_milli = 3600*1000;
+ check("milli tick calculations",
+ milli_res::to_tick_count(1,0,0,0) == one_hour_milli);
+
+ check("micro traits num digits", micro_res::num_fractional_digits() == 6);
+ check("micro traits resolution adjust",
+ micro_res::res_adjust() == 1000000);
+ check("micro tick calculations",
+ micro_res::to_tick_count(0,0,0,1) == 1);
+ check("micro tick calculations",
+ micro_res::to_tick_count(0,0,1,1) == 1000001);
+ check("micro tick calculations",
+ micro_res::to_tick_count(0,1,0,0) == 60000000);
+ boost::int64_t one_hour_micro = 3600*1000;
+ one_hour_micro = one_hour_micro*1000; //avoid compiler overflow!
+ check("micro tick calculations",
+ micro_res::to_tick_count(1,0,0,0) == one_hour_micro);
+
+ check("nano traits num digits", nano_res::num_fractional_digits() == 9);
+ check("nano traits resolution adjust",
+ nano_res::res_adjust() == 1000000000);
+ check("nano tick calculations",
+ nano_res::to_tick_count(0,0,0,1) == 1);
+ check("nano tick calculations",
+ nano_res::to_tick_count(0,0,1,1) == 1000000001);
+ boost::int64_t one_minute_nano = 60*1000*1000;
+ one_minute_nano = one_minute_nano*1000;
+ check("nano tick calculations",
+ nano_res::to_tick_count(0,1,0,0) == one_minute_nano);
+
+ //skip io on VC6 b/c of lack of operator<< for int64
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+#else
+ std::cout << one_hour_micro << std::endl;
+#endif
+ boost::int64_t one_hour_nano = one_hour_micro*1000;
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+#else
+ std::cout << one_hour_nano << std::endl;
+#endif
+ check("nano tick calculations",
+ nano_res::to_tick_count(1,0,0,0) == one_hour_nano);
+
+
+ return printTestStats();
+
+}
+
diff --git a/libs/date_time/test/testwrapping_int.cpp b/libs/date_time/test/testwrapping_int.cpp
new file mode 100644
index 000000000..67f9bf70d
--- /dev/null
+++ b/libs/date_time/test/testwrapping_int.cpp
@@ -0,0 +1,138 @@
+/* Copyright (c) 2002,2003,2005 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)
+ * Author: Jeff Garland, Bart Garst
+ */
+
+#include "boost/date_time/wrapping_int.hpp"
+//#define BOOST_INCLUDE_MAIN
+//#include <boost/test/test_tools.hpp>
+#include "testfrmwk.hpp"
+#include "boost/cstdint.hpp"
+#include <iostream>
+
+
+int
+main()
+// int
+// test_main(int, char*[])
+{
+ using namespace boost::date_time;
+
+ wrapping_int<int, 3600> wi(3599);
+ check("construction/conversion", wi == 3599);
+ check("add with wrap", wi.add(1) == 1);
+ check("added value ok", wi == 0);
+ check("add with 2 wraps", wi.add(7201) == 2);
+ check("added value ok", wi == 1);
+ check("add with 3 wraps", wi.add(10800) == 3);
+ check("added value ok", wi == 1);
+ check("subtract no wrap", wi.subtract(1) == 0);
+ check("subtract val ok", wi == 0);
+ check("subtract no wrap", wi.subtract(3601) == 2);
+ check("subtract val ok", wi == 3599);
+ check("add again", (wi.add(2) == 1) && (wi == 1));
+ check("subtract again", (wi.subtract(2) == 1) && (wi == 3599));
+ check("add again", (wi.add(2) == 1) && (wi == 1));
+ check("subtract again", (wi.subtract(3600) == 1) && (wi == 1));
+ check("subtract again", (wi.subtract(3599) == 1) && (wi == 2));
+ check("subtract again", (wi.subtract(1) == 0) && (wi == 1));
+ std::cout << wi << std::endl;
+
+ wrapping_int<short, 60> wi2(0);
+ check("add with wrap - return", wi2.add(121) == 2);
+ check("add with wrap - value", wi2 == 1);
+
+ wrapping_int<short, 60> wi3(-5);
+ check("signed int - add return", wi3.add(5) == 0);
+ check("signed int - value", wi3 == 0);
+
+ { // subtracting negative values
+ wrapping_int<short, 10> wi3(5);
+ check("subtract negative value to cause wrap",
+ (wi3.subtract(-8) == -1 && wi3 == 3));
+ check("reset", wi3.add(2) == 0 && wi3 ==5);
+ check("add negative value to cause wrap",
+ (wi3.add(-8) == -1 && wi3 == 7));
+ }
+
+ wrapping_int2<short, 1, 5> wi4(1);
+ check("construct", wi4 == 1);
+ check("add up to wrap value", (wi4.add(4) == 0 && wi4 == 5));
+ check("add over the wrap value", (wi4.add(1) == 1 && wi4 == 1));
+ check("add over the wrap value X 2", (wi4.add(10) == 2 && wi4 == 1));
+ check("add over the wrap value X 3", (wi4.add(15) == 3 && wi4 == 1));
+
+ wrapping_int2<short, 1, 12> wi5(12);
+ check("construct", wi5 == 12);
+ check("add over the wrap value", (wi5.add(1) == 1 && wi5 == 1));
+
+ check("subtract of the wrap value", (wi5.subtract(1) == -1 && wi5 == 12));
+ check("subtract of the wrap value", (wi5.subtract(13) == -1 && wi5 == 11));
+
+ // min_values other than 1
+ wrapping_int2<short, 2, 6> wi6(2);
+ check("construct", wi6 == 2);
+ check("add up to wrap value", (wi6.add(4) == 0 && wi6 == 6));
+ check("add over the wrap value", (wi6.add(1) == 1 && wi6 == 2));
+ check("add over the wrap value X 2", wi6.add(11) == 2);
+ check("add over the wrap value X 2", wi6 == 3);
+ check("sub down to wrap value", wi6.subtract(1) == 0 && wi6 == 2);
+ check("sub under the wrap value", wi6.subtract(1) == -1 && wi6 == 6);
+ check("sub under the wrap value X 2", wi6.subtract(11) == -2 && wi6 == 5);
+ //std::cout << wi6 << std::endl;
+
+ // adding & subtracting negative values
+ wrapping_int2<short, 1, 12> wi7(6);
+ wrapping_int2<short, -5, 5> wi8(0);
+ check("add negative value", (wi7.add(-2) == 0 && wi7 == 4));
+ check("add negative value", (wi8.add(-2) == 0 && wi8 == -2));
+ check("add negative value to cause single wrap",
+ (wi7.add(-6) == -1 && wi7 == 10));
+ check("add negative value to cause single wrap",
+ (wi8.add(-5) == -1 && wi8 == 4));
+ check("add negative value to cause multiple wrap",
+ (wi7.add(-22) == -2 && wi7 == 12));
+ check("add negative value to cause multiple wrap",
+ (wi8.add(-22) == -2 && wi8 == 4));
+ // reset values to mid range
+ wi7.subtract(6);
+ check("reset", wi7 == 6);
+ wi8.subtract(4);
+ check("reset", wi8 == 0);
+ check("subtract negative value", (wi7.subtract(-2) == 0 && wi7 == 8));
+ check("subtract negative value", (wi8.subtract(-2) == 0 && wi8 == 2));
+ check("subtract negative value to cause single wrap",
+ (wi7.subtract(-6) == 1 && wi7 == 2));
+ check("subtract negative value to cause single wrap",
+ (wi8.subtract(-5) == 1 && wi8 == -4));
+ check("subtract negative value to cause multiple wrap",
+ (wi7.subtract(-23) == 2 && wi7 == 1));
+ check("subtract negative value to cause multiple wrap",
+ (wi8.subtract(-22) == 2 && wi8 == -4));
+
+// #ifdef BOOST_HAS_LONG_LONG
+// wrapping_int<boost::int64_t, 86400*100000LL> wi4(0);
+// check("construction/conversion", wi4 == 0);
+// boost::int64_t off2 = 372300000;
+// boost::int64_t wrap = 86400LL*100000LL;
+// boost::int64_t wrap2 = 86400000000;
+// wrapping_int<boost::int64_t,86400000000LL> wi5((3600*1 + 60*2 + 3)*100000);
+// std::cout << wi5 << std::endl;
+// boost::int64_t over = wi4.add(off2);
+// std::cout << over << std::endl;
+// std::cout << wrap << std::endl;
+// std::cout << wrap2 << std::endl;
+// // check("construction/conversion", wi4 == 0);
+// #endif
+
+// wrapping_int<int, 60> wi(121);
+// check("construction/conversion", wi == 121);
+// check("add with wrap", wi.add(1) == 1);
+
+ return printTestStats();
+
+}
+
+
diff --git a/libs/date_time/xmldoc/Jamfile.v2 b/libs/date_time/xmldoc/Jamfile.v2
new file mode 100644
index 000000000..4314dbe31
--- /dev/null
+++ b/libs/date_time/xmldoc/Jamfile.v2
@@ -0,0 +1,90 @@
+# 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)
+#
+
+import boostbook : boostbook ;
+import toolset ;
+import set ;
+toolset.using doxygen ;
+
+boostbook date_time : date_time.xml
+ :
+ <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
+ <dependency>date_time_autodoc
+ <dependency>gregorian_autodoc
+ <dependency>posix_time_autodoc
+ <dependency>local_time_autodoc
+ <xsl:param>boost.root=../../../..
+ ;
+
+# boostbook date_time_doc : exclusive_date_time.xml ;
+
+# file lists take the form of [ set.difference [ glob include/these ] : [ glob but/not/these ] ]
+
+local date_time_files = [ glob ../../../boost/date_time/*.hpp ] ;
+
+# local date_time_files = [ set.difference
+# [ glob ../../../boost/date_time/*.hpp ] :
+# [ glob ../../../boost/date_time/testfrmwk.hpp
+# # ../../../boost/date_time/time_zone_base.hpp
+# # ../../../boost/date_time/time_zone_names.hpp
+# # ../../../boost/date_time/tz_db_base.hpp
+# # ../../../boost/date_time/dst_transition_generators.hpp
+# ]
+# ] ;
+
+local gregorian_files = [ set.difference
+ [ glob ../../../boost/date_time/gregorian/*.hpp ] :
+ [ glob ../../../boost/date_time/gregorian/event_schedule.hpp ]
+ ] ;
+
+#ECHO $(date_time_files) ; # useful for debugging
+
+# to build the autodoc files, run bjam --v2 autodoc_target. copy generated
+# file from bin.v2 dir to here. run ref_tag_fix.pl.
+
+doxygen date_time_autodoc :
+ $(date_time_files) :
+ <doxygen:param>ENABLE_PREPROCESSING=NO
+ <xsl:param>boost.doxygen.reftitle="Date Time Reference"
+ <doxygen.doxproc.title>"Date Time Reference"
+ <doxygen.doxproc.id>"date_time_reference"
+ ;
+
+doxygen gregorian_autodoc :
+ $(gregorian_files) :
+ <doxygen:param>ENABLE_PREPROCESSING=NO
+ <xsl:param>boost.doxygen.reftitle="Gregorian Reference"
+ <doxygen.doxproc.title>"Gregorian Reference"
+ <doxygen.doxproc.id>"gregorian_reference"
+ ;
+
+doxygen posix_time_autodoc :
+ [ glob ../../../boost/date_time/posix_time/*.hpp ] :
+ <doxygen:param>ENABLE_PREPROCESSING=NO
+ <xsl:param>boost.doxygen.reftitle="Posix Time Reference"
+ <doxygen.doxproc.title>"Posix Time Reference"
+ <doxygen.doxproc.id>"posix_time_reference"
+ ;
+
+doxygen local_time_autodoc :
+ [ glob ../../../boost/date_time/local_time/*.hpp ] :
+ <doxygen:param>ENABLE_PREPROCESSING=NO
+ <xsl:param>boost.doxygen.reftitle="Local Time Reference"
+ <doxygen.doxproc.title>"Local Time Reference"
+ <doxygen.doxproc.id>"local_time_reference"
+ ;
+
+
+# Copyright (c) 2004
+# CrystalClear Software, Inc.
+#
+# Permission to use, copy, modify, distribute and sell this software
+# and its documentation for any purpose is hereby granted without fee,
+# provided that the above copyright notice appear in all copies and
+# that both that copyright notice and this permission notice appear
+# in supporting documentation. CrystalClear Software makes no
+# representations about the suitability of this software for any
+# purpose. It is provided "as is" without express or implied warranty.
diff --git a/libs/date_time/xmldoc/README b/libs/date_time/xmldoc/README
new file mode 100644
index 000000000..145fa97a7
--- /dev/null
+++ b/libs/date_time/xmldoc/README
@@ -0,0 +1,38 @@
+I couldn't get the date_time.xml to validate, however, it works anyway.
+The build process with fail with adequate error messages to fix
+any errors.
+
+/********************************/
+Do not place a dtd declaration in the doc xml files.
+Begin each file with:
+<section ...
+
+/********************************/
+Including files into sections has some quirks to it. Unless there is a
+section in the parent file, the first included file will display
+instead of link.
+
+Example.
+In date_time.xml:
+
+ <xi:include href="subsection.xml" />
+
+And in subsection/xml:
+ <section id="date_time.my_subsection"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <para>
+ ...
+ </para>
+ <xi:include href="another.xml" />
+
+/********************************/
+To crosslink use:
+<link linkend="date_time.section.subsection">optional text</link>
+
+If you use '<link linkend="top">top</link>' the link will automatically
+go to the top of the page it ends up in.
+
+# 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)
diff --git a/libs/date_time/xmldoc/acknowledgements.xml b/libs/date_time/xmldoc/acknowledgements.xml
new file mode 100644
index 000000000..36f540164
--- /dev/null
+++ b/libs/date_time/xmldoc/acknowledgements.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.acknowledgements">
+ <title>Acknowledgements</title>
+
+ <para>
+ Many people have contributed to the development of this library. In particular Hugo Duncan and Joel de Guzman for help with porting to various compilers. For initial development of concepts and design Corwin Joy and Michael Kenniston deserve special thanks. Also extra thanks to Michael for writing up the theory and tradeoffs part of the documentation. Dave Zumbro for initial inspiration and sage thoughts. Many thanks to boost reviewers and users including: William Seymour, Kjell Elster, Beman Dawes, Gary Powell, Andrew Maclean, William Kempf, Peter Dimov, Chris Little, David Moore, Darin Adler, Gennadiy Rozental, Joachim Achtzehnter, Paul Bristow, Jan Langer, Mark Rodgers, Glen Knowles, Matthew Denman, and George Heintzelman.
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/buildinfo.xml b/libs/date_time/xmldoc/buildinfo.xml
new file mode 100644
index 000000000..e77c6d7c2
--- /dev/null
+++ b/libs/date_time/xmldoc/buildinfo.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.buildinfo">
+ <title>Build-Compiler Information</title>
+
+ <para>
+ <link linkend="overview">Overview</link> --
+ <link linkend="compile_options">Compilation Options</link> --
+ <link linkend="portability">Compiler/Portability Notes</link> --
+ <link linkend="dir_structure">Directory Structure</link> --
+ <link linkend="other_boost_libs">Required Boost Libraries</link>
+ </para>
+
+ <anchor id="overview" />
+ <bridgehead renderas="sect3">Overview</bridgehead>
+ <para>
+ The library has a few functions that require the creation of a library file (mostly to_string, from_string functions). Most library users can make effective use of the library WITHOUT building the library, but simply including the required headers. If the library is needed, the Jamfile in the build directory will produce a "static" library (libboost_date_time) and a "dynamic/shared" library (boost_date_time) that contains these functions. Note that to use the library without the library (particularly on windows) may require using the BOOST_DATE_TIME_NO_LIB flag to the compilation options.
+ </para>
+
+ <anchor id="compile_options" />
+ <bridgehead renderas="sect3">Compilation Options</bridgehead>
+ <para>
+ By default the posix_time system uses a single 64 bit integer internally to provide a microsecond level resolution. As an alternative, a combination of a 64 bit integer and a 32 bit integer (96 bit resolution) can be used to provide nano-second level resolutions. The default implementation may provide better performance and more compact memory usage for many applications that do not require nano-second resolutions.
+ </para>
+ <para>
+ To use the alternate resolution (96 bit nanosecond) the variable <code>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG</code> must be defined in the library users project files (ie Makefile, Jamfile, etc). This macro is not used by the Gregorian system and therefore has no effect when building the library.
+ </para>
+ <para>As of version 1.33, the date_time library introduced a new IO streaming system. Some compilers are not capable of utilizing this new system. For those compilers the earlier ("legacy") IO system is still available. Non-supported compilers will select the legacy system automatically but the user can force the usage of the legacy system by defining <code>USE_DATE_TIME_PRE_1_33_FACET_IO</code>.</para>
+
+ <para>As a convenience, <code>date_time</code> has provided some <link linkend="additional_duration_types">additional duration types</link>. Use of these types may have unexpected results due to the snap-to-end-of-month behavior (see <link linkend="snap_to_details">Reversibility of Operations Pitfall</link> for complete details and examples). These types are enabled by default. To disable these types, simply undefine <code>BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES</code> in your project file.</para>
+
+ <para>Another convenience is the default constructors for <code><link linkend="date_time.gregorian.date_class">date</link></code>, and <code><link linkend="date_time.posix_time.ptime_class">ptime</link></code>. These constructors are enabled by default. To disable them, simply define <code>DATE_TIME_NO_DEFAULT_CONSTRUCTOR</code> in your project file.</para>
+
+ <anchor id="portability" />
+ <bridgehead renderas="sect3">Compiler/Portability Notes</bridgehead>
+ <para>
+ The Boost Date-Time library has been built and tested with many compilers and platforms. However, some compilers and standard libraries have issues. While some of these issues can be worked around, others are difficult to work around. The following compilers are known to fully support all aspects of the library:
+ <itemizedlist mark="bullet">
+ <listitem>Codewarrior 9.4 Windows</listitem>
+ <listitem>GCC 3.2 - 3.4, 4.x on Linux</listitem>
+ <listitem>GCC 3.3, 4.x on Darwin</listitem>
+ <listitem>GCC 3.3 - 3.4, 4.x on Solaris</listitem>
+ <listitem>GCC 3.3, 4.x on HP-UX</listitem>
+ <listitem>QCC 3.3.5 on QNX</listitem>
+ <listitem>MSVC 7.1 Windows </listitem>
+ <listitem>Intel 8.1-9.x Linux and Windows</listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ Unfortunately, the VC8 compiler has some issues with date-time code.
+ The most serious issue is a memory leak which was introduced into the
+ VC8 standard library basic_stream code. Date-time has code has been changed
+ to avoid this as much as possible, but if you are using the legacy IO option
+ (NOT the default with VC8) then the issue can still arise. See the
+
+ <ulink url="http://lists.boost.org/Archives/boost/2006/02/101122.php">mailing list archive</ulink> for more details.
+ </para>
+
+ <para>
+ In addition to the problem above, some versions of the VC8 library have limited
+ the range of allowed
+ values in the <code>std::tm</code> structure to positive values. This was a new
+ restriction added in the VC8. The effect is that dates prior to the year
+ 1900 will cause exceptions. There is, unfortunately, no easy workaround for
+ this issue. Note that the new 64bit version of the VC8 compiler
+ does not appear to have this limitation.
+ </para>
+
+ <para>
+ These compilers support all aspects of the library except <code>wstring/wstream</code>
+ output.
+ <itemizedlist mark="bullet">
+ <listitem>MinGW 3.2, 3.4, 3.5 *</listitem>
+ <listitem>GCC 3.2 (cygwin) *</listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ In particular, a lack of support for standard locales limits the ability of the library to support iostream based input output. For these compilers a set of more limited string based input-output is provided. Some compilers/standard libraries with this limitation include:
+ <itemizedlist mark="bullet">
+ <listitem>Borland 5.6</listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ Official support for some older compilers has now been dropped. This includes:
+ <itemizedlist mark="bullet">
+ <listitem>GCC 2.9x</listitem>
+ <listitem>Borland 5.1.1</listitem>
+ <listitem>MSVC 7.0 and 6 SP5 </listitem>
+ </itemizedlist>
+ </para>
+
+ <bridgehead renderas="sect5">Visual Studio &amp; STLPort</bridgehead>
+ <para>There is a known issue with Visual Studio (7.0 &amp; 7.1) and STLPort. The build errors typically make reference to a type issue or 'no acceptable conversion' and are attempting to instantiate a template with <code>wchar_t</code>. The default build of STLPort does not support <code>wchar_t</code>. There are two possible workarounds for this issue. The simplest is the user can build date_time with no wide stream/string etc. The other is to rebuild STLPort with wchar_t support.
+ </para>
+ <para>To build date_time with no wide stream/string etc, execute the following command from <code>$BOOST_ROOT</code>:
+ <screen>bjam -a "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=..." \
+ "-sBUILD=&lt;define>BOOST_NO_STD_WSTRING" \
+ --stagedir=... --with-date_time stage</screen>
+ (replace the ellipsis with the correct paths for the build system and adjust the <code>TOOLS</code> to the proper toolset if necessary)
+ </para>
+ <para>Rebuilding STLPort with <code>wchar_t</code> support involves placing <code>/Zc:wchar_t</code> in the STLPort makefile. Date_time should then be built with the following command from <code>$BOOST_ROOT</code>:
+ <screen>bjam -a "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=..." \
+ "-sBUILD=&amp;native-wchar_t>on" \
+ --stagedir=... --with-date_time stage</screen>
+ (replace the ellipsis with the correct paths for the build system and adjust the <code>TOOLS</code> to the proper toolset if necessary)
+ </para>
+
+ <anchor id="dir_structure" />
+ <bridgehead renderas="sect3">Directory Structure</bridgehead>
+ <para>
+ The directory tree has the following structure:
+ <programlisting>/boost/date_time -- common headers and template code
+/boost/date_time/gregorian -- Gregorian date system header files
+/boost/date_time/posix_time -- Posix time system headers
+/boost/date_time/local_time -- Local time system headers
+/libs/date_time/build -- build files and output directory
+/libs/date_time/test -- test battery for generic code
+/libs/date_time/test/gregorian -- test battery for the Gregorian system
+/libs/date_time/test/posix_time -- test battery for the posix_time system
+/libs/date_time/test/local_time -- test battery for the local_time system
+/libs/date_time/examples/gregorian -- example programs for dates
+/libs/date_time/examples/posix_time -- time example programs
+/libs/date_time/examples/local_time -- nifty example programs
+/libs/date_time/src/gregorian -- cpp files for libboost_date_time
+/libs/date_time/src/posix_time -- empty (one file, but no source code...)</programlisting>
+ </para>
+
+ <anchor id="other_boost_libs" />
+ <bridgehead renderas="sect3">Required Boost Libraries</bridgehead>
+ <para>
+ Various parts of date-time depend on other boost libraries. These include:
+ <itemizedlist mark="bullet">
+ <listitem><ulink url="boost:/libs/tokenizer/index.html">boost.tokenizer</ulink> </listitem>
+ <listitem><ulink url="boost:/libs/integer/doc/html/boost_integer/cstdint.html">boost.integer(cstdint)</ulink> </listitem>
+ <listitem><ulink url="boost:/libs/utility/operators.htm">boost.operators</ulink> </listitem>
+ <listitem><ulink url="boost:/libs/conversion/lexical_cast.htm">boost.lexical_cast </ulink> </listitem>
+ <listitem><ulink url="boost:/libs/smart_ptr/smart_ptr.htm">boost.smart_ptr (local time only)</ulink> </listitem>
+ <listitem><ulink url="boost:/libs/algorithm/string/index.html">boost::string_algorithms </ulink> </listitem>
+ <listitem><ulink url="boost:/libs/serialization/index.html">boost::serialize (serialization code only) </ulink> </listitem>
+ </itemizedlist>
+ so these libraries need to be installed.
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/calculations.xml b/libs/date_time/xmldoc/calculations.xml
new file mode 100644
index 000000000..6abe98265
--- /dev/null
+++ b/libs/date_time/xmldoc/calculations.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.calculations">
+ <title>Calculations</title>
+
+ <para>
+ <link linkend="timepoints">Timepoints</link> --
+ <link linkend="durations">Durations</link> --
+ <link linkend="intervals">Intervals (Periods)</link> --
+ <link linkend="special_value_handling">Special Value Handling</link>
+ </para>
+ <anchor id="timepoints" />
+ <bridgehead renderas="sect3">Timepoints</bridgehead>
+ <para>
+ This section describes some of basic arithmetic rules that can be performed with timepoints. In general, Timepoints support basic arithmetic in conjunction with Durations as follows:
+ <programlisting>
+ Timepoint + Duration --> Timepoint
+ Timepoint - Duration --> Timepoint
+ Timepoint - Timepoint --> Duration
+ </programlisting>
+ Unlike regular numeric types, the following operations are undefined:
+ <programlisting>
+ Duration + Timepoint --> Undefined
+ Duration - Timepoint --> Undefined
+ Timepoint + Timepoint --> Undefined
+ </programlisting>
+ </para>
+ <anchor id="durations" />
+ <bridgehead renderas="sect3">Durations</bridgehead>
+ <para>
+ Durations represent a length of time and can have positive and negative values. It is frequently useful to be able to perform calculations with other durations and with simple integral values. The following describes these calculations:
+ <programlisting>
+ Duration + Duration --> Duration
+ Duration - Duration --> Duration
+
+ Duration * Integer --> Duration
+ Integer * Duration --> Duration
+ Duration / Integer --> Duration (Integer Division rules)
+ </programlisting>
+ </para>
+ <anchor id="intervals" />
+ <bridgehead renderas="sect3">Intervals (Periods)</bridgehead>
+ <para>
+ Interval logic is extremely useful for simplifying many 'calculations' for dates and times. The following describes the operations provided by periods which are based on half-open range. The following operations calculate new time periods based on two input time periods:
+ <programlisting>
+Timeperiod intersection Timeperiod --> Timeperiod
+ (null interval if no intersection)
+Timeperiod merge Timeperiod --> Timeperiod
+ (null interval if no intersection)
+Timeperiod shift Duration --> Timeperiod
+ (shift start and end by duration amount)
+ </programlisting>
+ In addition, periods support various queries that calculate boolean results. The first set is caluculations with other time periods:
+ <programlisting>
+ Timeperiod == Timeperiod --> bool
+ Timeperiod &lt; Timeperiod --> bool (true if lhs.last &lt;= rhs.begin)
+ Timeperiod intersects Timeperiod --> bool
+ Timeperiod contains Timeperiod --> bool
+ Timeperiod is_adjacent Timeperiod --> bool
+ </programlisting>
+ The following calculations are performed versus the Timepoint.
+ <programlisting>
+ Timeperiod contains Timepoint --> bool
+ Timeperiod is_before Timepoint --> bool
+ Timeperiod is_after Timepoint --> bool
+ </programlisting>
+ </para>
+ <anchor id="special_value_handling" />
+ <bridgehead renderas="sect3">Special Value Handling</bridgehead>
+ <para>
+ For many temporal problems it is useful for Duration and Timepoint types to support special values such as Not A Date Time (NADT) and infinity. In general special values such as Not A Date Time (NADT) and infinity should follow rules like floating point values. Note that it should be possible to configure NADT based systems to throw an exception instead of result in NADT.
+ <programlisting>
+ Timepoint(NADT) + Duration --> Timepoint(NADT)
+ Timepoint(&#8734;) + Duration --> Timepoint(&#8734;)
+ Timepoint + Duration(&#8734;) --> Timepoint(&#8734;)
+ Timepoint - Duration(&#8734;) --> Timepoint(-&#8734;)
+ </programlisting>
+ When performing operations on both positive and negative infinities, the library will produce results consistent with the following.
+ <programlisting>
+ Timepoint(+&#8734;) + Duration(-&#8734;) --> NADT
+ Duration(+&#8734;) + Duration(-&#8734;) --> NADT
+ Duration(&#177;&#8734;) * Zero --> NADT
+
+ Duration(&#8734;) * Integer(Not Zero) --> Duration(&#8734;)
+ Duration(+&#8734;) * -Integer --> Duration(-&#8734;)
+ Duration(&#8734;) / Integer --> Duration(&#8734;)
+ </programlisting>
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/changes.xml b/libs/date_time/xmldoc/changes.xml
new file mode 100644
index 000000000..295920e1d
--- /dev/null
+++ b/libs/date_time/xmldoc/changes.xml
@@ -0,0 +1,796 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2006 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.changes">
+ <title>Change History</title>
+
+ <!-- if each new change tgroup has a "Bug Fix" as the first "Type", the columns will line up nicely -->
+
+ <bridgehead renderas="sect3">Changes from Boost 1.41 to 1.44 (date_time 1.08 to 1.09)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ The "%T" and "%R" format specifiers are now processed by the library rather than underlying standard facet.
+ This fixes the cases when the placeholders are not supported by the facet
+ (<ulink url="https://svn.boost.org/trac/boost/ticket/3876">#3876</ulink>).
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead renderas="sect3">Changes from Boost 1.40 to 1.41 (date_time 1.07 to 1.08)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry>Change</entry>
+ <entry>
+ The default format for time durations is now "%-%O:%M:%S%F" instead of "%-%H:%M:%S%F" that was used previously. In order to retain the old behavior, the format string has to be specified explicitly during the time IO facet construction (<ulink url="https://svn.boost.org/trac/boost/ticket/1861">#1861</ulink>).
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Gregorian dates now use 32-bit integer type internally on 64-bit platforms (<ulink url="https://svn.boost.org/trac/boost/ticket/3308">#3308</ulink>).
+ </entry>
+ </row>
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Adjusted UTC time zone offset boundaries in order to allow offsets up to +14 hours (<ulink url="https://svn.boost.org/trac/boost/ticket/2213">#2213</ulink>).
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead renderas="sect3">Changes from Boost 1.38 to 1.40 (date_time 1.06 to 1.07)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Minor bug fixes (<ulink url="https://svn.boost.org/trac/boost/ticket/2809">#2809</ulink>,
+ <ulink url="https://svn.boost.org/trac/boost/ticket/2824">#2824</ulink>,
+ <ulink url="https://svn.boost.org/trac/boost/ticket/3015">#3015</ulink>,
+ <ulink url="https://svn.boost.org/trac/boost/ticket/3105">#3105</ulink> and others).
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead renderas="sect3">Changes from Boost 1.34 to 1.38 (date_time 1.05 to 1.06)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Feature</entry>
+ <entry>
+ Added support for formatting and reading time durations longer than 24 hours.
+ A new formatter <code>%O</code> is used indicate such long durations in the
+ format string. The old <code>%H</code> format specifier is thus restricted
+ to represent durations that fit into two characters, in order to retain support
+ for reading durations in ISO format. In case if it is detected that the <code>%H</code>
+ format specifier is used with longer durations, the results are not specified
+ (an assertion in debug builds is raised).
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Added support for GCC 4.3. Several compilation issues were solved, as well as
+ compiler warnings were taken care of.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Added missing streaming operators for the <code>local_time_period</code> class.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Added several missing includes in different places. Some includes that are
+ not needed in some configurations were made conditional.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Solved compilation problem that was caused by not finding streaming operators
+ for <code>gregorian::date_duration</code> via ADL. The type is now made actually
+ a class rather a typedef for the <code>date_time::date_duration</code> template.
+ The similar change was done for <code>gregorian::weeks</code>.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Added a correctly spelled <code>date_time::hundredth</code> time resolution enum
+ value. The old one <code>date_time::hundreth</code> is considered deprecated and
+ to be removed in future releases.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Fixed compilation error in <code>format_date_parser.hpp</code> because of incorrect
+ stream type being used.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ On Windows platform made inclusion of <code>windows.h</code> optional. The header is only used
+ when the <code>BOOST_USE_WINDOWS_H</code> macro is defined. Otherwise (and by default),
+ the library uses internal definitions of symbols from this header.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ On Windows platform function <code>from_ftime</code> could return incorrect time if
+ the <code>FILETIME</code> that is being passed to the function contained dates before 1970-Jan-01.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Fixed a possible crash in <code>gregorian::special_value_from_string</code> if the string
+ did not represent a valid special value.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Removed the <code>testfrmwk.hpp</code> file from the public include directory. This file
+ was internal for the library tests and was not documented.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Fixed missing include in <code>filetime_functions.hpp</code>
+ (<ulink url="https://svn.boost.org/trac/boost/ticket/2688">#2688</ulink>).
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug fix</entry>
+ <entry>
+ Fixed dereferencing end string iterators in different places of code,
+ which could cause crashes on MSVC
+ (<ulink url="https://svn.boost.org/trac/boost/ticket/2698">#2698</ulink>).
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+
+ <bridgehead renderas="sect3">Changes from Boost 1.33 to 1.34 (date_time 1.04 to 1.05)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Feature</entry>
+ <entry>
+ Updated the data in the date_time_zonespec.csv file to reflect new US/Canada
+ daylight savings time rules for 2007. If you upgrade to the new file, be aware
+ that the library will only give correct answers for current/future date
+ conversions. So if you are converting dates from earlier years the answers
+ will reflect current time zone rules not past rules. The library doesn't support
+ historic timezone rules presently.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>
+ Two other dst calculation features have also been update to reflect the new
+ US/Canada timzone rules. This is the boost::date_time::us_dst_rules and
+ dst_calc_engine. While the us_dst_rules is officially deprecated, a patch
+ by Graham Bennett has been applied which allows this class to work correctly
+ for both historical and future dates. The dst_calc_engine was updated to also
+ work for historical and future times. This allows the various local_adjustor
+ classes to work correctly. There was an interface change for classes using the
+ dst_calc_engine with custom dst traits classes. The traits classes signatures
+ changed to take a 'year' parameter on most of the methods such as end_month.
+ In addition, 2 new functions are needed on the traits classes:
+ <code>static date_type local_dst_start_day(year_type year)</code> and
+ <code>static date_type local_dst_end_day(year_type year)</code>.
+ Implementers should see <code>date_time/local_timezone_defs.hpp</code> for
+ examples.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fix DST traits for Austrialia (sf# 1672139) to set end of DST at 3:00 am instead of 2:00 am.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fix a problem with potential linking error with multiple definitions due
+ to I/O code.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Changed serialization code in both greg_serialize.hpp and time_serialize.hpp
+ to eliminate warnings due to unused variables for version and file_version.
+ Thanks to Caleb Epstein for the patch suggestion.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fix regression errors that showed up under FreeBSD with GCC and the
+ LANG environment set to russian -- changed parser to use classic
+ locale instead of blank locale.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Changes for tracker issue 1178092 -- change in convert_to_lower to make
+ local a const static and speed up parsing.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Patches from Ulrich Eckhardt to fix support for EVC++ 4.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Feature</entry>
+ <entry>Reduce the usage of basic_stringstream as much a possible to work around
+ a bug in the VC8 standard library. See
+ <ulink url="http://lists.boost.org/Archives/boost/2006/02/101122.php">mailing list archive</ulink>
+ for more information.
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <bridgehead renderas="sect3">Changes from Boost 1.32 to 1.33 (date_time 1.03 to 1.04)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Period lengths, when beginning and end points are the same, or are consecutive, were being incorrectly calculated. The corrected behavior, where end and beginning points are equal, or a period is created with a zero duration, now return a length of zero. A period where beginning and end points are consecutive will return a length of one.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Time_input_facet was missing functions to set iso formats. It also failed to parse time values that did not use a separator (%H%M%S). Both these bugs have been corrected.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Preliminary names of ptime_facet and ptime_input_facet changed to simply time_facet and time_input_facet. The ptime_* versions have been removed all together.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>The from_iso_string function failed to parse fractional digits. We added code that correctly parses when input has more digits, or too few digits, that the compiled library precision. Ptimes with only a decimal are also correctly parsed.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>The parsing mechanism in the new IO would consume the next character after a match was made. This bug presented itself when attempting to parse a period that had special value for it's beginning point.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>The new IO system failed to provide the ability for the user to "turn on" exceptions on the stream. The failbit was also not set when parsing failed. Both of these problems have been fixed.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Parsing of special values, by means of from_*_string functions, has been fixed. This also effects the libraries ability to serialize special values. Time_duration now serializes as either a string or individual fields (depending on is_special()).
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Previously, output streaming of <code>partial_date</code> would display the day as either a single or double digit integer (ie '1', or '12'). This has been corrected to always display a double digit integer (ie '01').
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Major new features related to management of local times.
+ This includes the introduction of a series of new classes to
+ represent time zones and local times (see <link linkend="date_time.local_time">Date Time Local Time</link> for complete details).
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Input and output facets have been re-written to support format-based
+ redefinition of formats (see <link linkend="date_time.date_time_io">Date Time IO</link> for complete details).
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Functions have been added to facilitate conversions between <code>tm</code> structs for <code>date</code>, <code>ptime</code>, <code>time_duration</code>, and <code>local_date_time</code>. Functions for converting <code>FILETIME</code>, and <code>time_t</code> to <code>ptime</code> are also provided. See the individual sections for details.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>A <code>universal_time</code> function has been added to the <code>microsec_time_clock</code> (full details of this function can be found <link linkend="ptime_from_clock">here</link>).
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Functions have been added to facilitate conversions between <code>tm</code> structs for <code>date</code>, <code>ptime</code>, <code>time_duration</code>, and <code>local_date_time</code>. Functions for converting <code>FILETIME</code>, and <code>time_t</code> to <code>ptime</code> are also provided. See the individual sections for details.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>A <code>universal_time</code> function has been added to the <code>microsec_time_clock</code> (full details of this function can be found <link linkend="ptime_from_clock">here</link>).
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Date-time now uses reentrant POSIX functions on those platforms that
+ support them when BOOST_HAS_THREADS is defined.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed a bug in serialization code where special values
+ (not-a-date-time, infinities, etc) for
+ ptime, time_duration would not read back correctly from an archive.
+ The output serialization code wrote subfields such
+ as time_duration.seconds() which are invalid for special values and
+ thus undefined values. Thus when read back the values could cause
+ strange behavior including execeptions on construction.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed multiple warnings generated with various platforms/compilers.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Construction of a ptime with a time_duration beyond the range of 00:00 to 23:59:59.9... now adjusts the date and time to make the time_duration fall within this range (ie <code>ptime(date(2005,2,1), hours(-5))</code> -> "2005-Jan-31 19:00:00" &amp; <code>ptime(date(2005,2,1), hours(35))</code> -> "2005-Feb-02 11:00:00").
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Time parsing now correctly handles excessive digits for fractional seconds. Leading zeros are dropped ("000100" -> 100 frac_sec), and excessive digits are truncated at the proper place ("123456789876" -> 123456 or 123456789 depending on what precision the library was compiled with).
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Changes to the <code>boost::serialization</code> interface broke serialization compatibility for <code>date_time</code>. The user must provide a function to insure <code>date_time</code> objects are <code>const</code> before they are serialized. The function should be similar to:
+ <screen>template&lt;class archive_type, class temporal_type>
+void save_to(archive_type&amp; ar,
+ const temporal_type&amp; tt)
+{
+ ar &lt;&lt; tt;
+}</screen>
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Use of the depricated <code>boost::tokenizer</code> interface has been updated to the current interface. This fixes compiler errors on some older compilers.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Templatized formatters in the legacy IO system to accept char type. Also removed calls to <code>boost::lexical_cast</code>.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <bridgehead renderas="sect3">Changes from Boost 1.31 to 1.32 (date_time 1.02 to 1.03)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Snap to end of month behavior corrected for year_functor. Previously, starting
+ from 2000-Feb-28 (leap year and not end of month) and iterating through the next
+ leap year would result in 2004-Feb-29 instead of 2004-Feb-28. This behavior has
+ been corrected to produce the correct result of 2004-Feb-28. Thanks to Bart Garst
+ for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Free function for creating a ptime object from a FILETIME struct. This function
+ is only available on platforms that define BOOST_HAS_FTIME.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Microsecond time clock is now available on most windows compilers as well as
+ Unix.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Use of the boost::serialization library is now available with most of the
+ date_time classes. Classes capable of serialization are: date_generator classes,
+ date, days, date_period, greg_month, greg_weekday, greg_day, ptime, time_duration,
+ and time_period. Thanks to Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Functions added to convert date and time classes to wstring. The library now
+ provides to_*_wstring as well as to_*_string functions for: simple, iso,
+ iso_extended, and sql for dates and compilers that support wstrings. Thanks to
+ Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Period classes now handle zero length and NULL periods correctly. A NULL period
+ is a period with a negative length. Thanks to Frank Wolf and Bart Garst for this
+ change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added end_of_month function to gregorian::date to return the last day of
+ the current month represented by the date. Result is undefined for
+ not_a_date_time or infinities.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Removed incorrect usage of BOOST_NO_CWCHAR macro throughout library.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>New names added for some date classes. Original names are still valid but may
+ some day be deprecated. Changes are:
+ <simplelist type='horiz' columns='3'>
+ <member>date_duration</member>
+ <member>is now</member>
+ <member>days</member>
+ <member>nth_kday_of_month</member>
+ <member>is now</member>
+ <member>nth_day_of_the_week_in_month</member>
+ <member>first_kday_of_month</member>
+ <member>is now</member>
+ <member>first_day_of_the_week_in_month</member>
+ <member>last_kday_of_month</member>
+ <member>is now</member>
+ <member>last_day_of_the_week_in_month</member>
+ <member>first_kday_after</member>
+ <member>is now</member>
+ <member>first_day_of_the_week_after</member>
+ <member>first_kday_before</member>
+ <member>is now</member>
+ <member>first_day_of_the_week_before</member>
+ </simplelist>
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Free functions for date generators added. Functions are: days_until_weekday, days_before_weekday, next_weekday, and previous_weekday.
+ <screen>days days_until_weekday(date, greg_weekday);
+days days_before_weekday(date, greg_weekday);
+date next_weekday(date, greg_weekday);
+date previous_weekday(date, greg_weekday);</screen>
+ Thanks to Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>New experimental duration types added for months, years, and weeks. These classes
+ also provide mathematical operators for use with date and time classes. Be aware
+ that adding of months or years a time or date past the 28th of a month may show
+ non-normal mathematical properties. This is a result of 'end-of-month'
+ snapping used in the calculation. The last example below illustrates the
+ issue.
+
+ <screen>months m(12);
+years y(1);
+m == y; // true
+days d(7);
+weeks w(1);
+d == w; // true
+ptime t(...);
+t += months(3);
+date d(2004,Jan,30);
+d += months(1); //2004-Feb-29
+d -= months(1); //2004-Jan-29</screen>
+ Input streaming is not yet implemented for these types.
+ Thanks to Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Unifying base class for date_generators brought in to gregorian namespace. See <link linkend="date_time.examples.print_holidays">Print Holidays Example</link>.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added constructors for date and ptime that allow for default construction (both)
+ and special values construction (ptime, both now support this). Default
+ constructors initialize the objects to not_a_date_time (NADT).
+ <screen>ptime p_nadt(not_a_date_time);
+ptime p_posinf(pos_infin);
+ptime p; // p == NADT
+date d; // d == NADT</screen>
+ Thanks to Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Output streaming now supports wide stream output on compiler / standard library combinations that support wide streams. This allows code like:
+ <screen>std::wstringstream wss;
+date d(2003,Aug,21);
+wss &lt;&lt; d;</screen>
+ Thanks to Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Input streaming for date and time types is now supported on both wide and narrow streams:
+ <screen>date d(not_a_date_time);
+std::stringstream ss("2000-FEB-29");
+ss &gt;&gt; d; //Feb 29th, 2000
+std::wstringstream ws("2000-FEB-29");
+ws &gt;&gt; d; //Feb 29th, 2000</screen>
+ Thanks to Bart Garst for this change.
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry> Fixed bug in duration_from_string() where a string formatted with
+ less than full amount of fractional digits created an incorrect
+ time_duration. With microsecond resolution for time durations
+ the string "1:01:01.010" created a time duration of
+ 01:01:01.000010 instead of 01:01:01.010000
+ </entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed the special value constructor for gregorian::date and posix_time::ptime
+ when constructing with min_date_time or max_date_time. The wrong value was
+ constructed for these.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead renderas="sect3">Changes from Boost 1.30 to 1.31 (date_time 1.01 to 1.02)</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Build configuration updated so dll, statically, and dynamically linkable library files are now produced with MSVC compilers. See <link linkend="date_time.buildinfo">Build/Compiler Information</link> for more details.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Time_duration from_string is now correctly constructed from a negative value. (ie "-0:39:00.000") Code provided by Bart Garst.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed many MSVC compiler warnings when compiled with warning level 4.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added prefix decrement operator (--) for date and time iterators. See <link linkend="date_time.posix_time.time_iterators">Time Iterators</link> and <link linkend="date_time.gregorian.date_iterators">Date Iterators</link> for more details. Code provided by Bart Garst.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Special_values functionality added for date_duration, time_duration and time classes. Code provided by Bart Garst.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed time_duration_traits calculation bug which was causing time duration to be limited to 32bit range even when 64 bits were available. Thanks to Joe de Guzman for tracking this down.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Provided additional operators for duration types (eg: date_duration, time_duration). This includes dividable by integer and fixes to allow +=, -= operators. Thanks to Bart Garst for writing this code. Also, the documentation of <link linkend="date_time.calculations">Calculations</link> has been improved.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Added typedefs to boost::gregorian gregorian_types.hpp various date_generator function classes.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added from_time_t function to convert time_t to a ptime.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added a span function for combining periods. See <link linkend="date_time.gregorian.date_period">date period</link> and <link linkend="date_time.posix_time.time_period">time period</link> docs.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added a function to time_duration to get the total number of seconds in a
+ duration truncating any fractional seconds. In addition, other resolutions
+ were added to allow for easy conversions. For example
+ <screen>seconds(1).total_milliseconds() == 1000
+seconds(1).total_microseconds() == 1000000
+hours(1).total_milliseconds() == 3600*1000 //3600 sec/hour
+seconds(1).total_nanoseconds() == 1000000000</screen>
+
+ </entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added output streaming operators for the <link linkend="date_time.gregorian.date_algorithms">date generator</link> classes - partial_date, first_kday_after, first_kday_before, etc. Thanks to Bart Garst for this work.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added unary- operators for durations for reversing the sign of a time duration. For example:
+ <screen>time_duration td(5,0,0); //5 hours
+td = -td; //-5 hours</screen>
+ Thanks to Bart Garst for this work.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added support for parsing strings with 'month names'. Thus creating a date object from string now accepts multiple formats ("2003-10-31","2003-Oct-31", and "2003-October-31"). Thus, date d = from_simple_string("2003-Feb-27") is now allowed. A bad month name string ( from_simple_string("2003-SomeBogusMonthName-27")) will cause a bad_month exception. On most compilers the string compare is case insensitive. Thanks to Bart Garst for this work.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>In addition to support for month names or numbers, functions have been added to create date objects from multi-ordered date strings. Ex: "January-21-2002", "2002-Jan-21", and "21-Jan-2003". See <link linkend="date_time.gregorian.date_class">Date Class</link> for more details.</entry>
+ </row>
+ <row>
+ <entry>Bug-Fix</entry><!-- leave '-' so table cell doesn't wrap -->
+ <entry>Various documentation fixes. Thanks to Bart Garst for updates.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead renderas="sect3">Changes from Boost 1.29 to 1.30 (date_time 1.00 to 1.01)</bridgehead>
+ <para>
+ Notice: The interface to the partial_date class (see <link linkend="date_time.gregorian.date_algorithms">date_algorithms</link>) was changed. The order of construction parameters was changed which will cause some code to fail execution. This change was made to facilitate more generic local time adjustment code. Thus instead of specifying partial_date pd(Dec,25) the code needs to be changed to partial_date pd(25, Dec);
+ </para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Added new experimental feature for Daylight Savings Time calculations. This allows traits based specification of dst rules.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Added new interfaces to calculate julian day and modified julian day to the gregorian date class. See <link linkend="date_time.gregorian.date_class">boost::gregorian::date</link>.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Add new interface to calculate iso 8601 week number for a date. See <link linkend="date_time.gregorian.date_class">boost::gregorian::date</link>.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry>Add an iso 8601 time date-time format (eg: YYYYMMDDTHHHMMSS) parsing function. See <link linkend="date_time.posix_time.ptime_class">Class ptime</link> for more information.</entry>
+ </row>
+ <row>
+ <entry>Feature</entry>
+ <entry> Added a length function to the period template so that both date_periods and time_periods will now support this function.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Split Jamfiles so that libs/date_time/build/Jamfile only builds library and /libs/date_time/libs/test/Jamfile which runs tests.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed many minor documentation issues.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Removed the DATE_TIME_INLINE macro which was causing link errors. This macro is no longer needed in projects using the library.</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Added missing typedef for year_iterator to gregorian_types.hpp</entry>
+ </row>
+ <row>
+ <entry>Bug Fix</entry>
+ <entry>Fixed problem with gregorian ostream operators that prevented the use of wide streams.</entry>
+ </row>
+ <row>
+ <entry>Bug-Fix</entry><!-- leave '-' so table cell doesn't wrap -->
+ <entry>Tighten error handling for dates so that date(2002, 2, 29) will throw a bad_day_of_month exception. Previously the date would be incorrectly constructed. Reported by sourceforge bug: 628054 among others.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</section>
diff --git a/libs/date_time/xmldoc/conceptual.xml b/libs/date_time/xmldoc/conceptual.xml
new file mode 100644
index 000000000..d0130a352
--- /dev/null
+++ b/libs/date_time/xmldoc/conceptual.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.conceptual" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Conceptual</title>
+
+ <xi:include href="motivation.xml"/>
+ <xi:include href="domain_concepts.xml"/>
+ <xi:include href="design_concepts.xml"/>
+
+
+</section>
+
diff --git a/libs/date_time/xmldoc/custom_time_zone.xml b/libs/date_time/xmldoc/custom_time_zone.xml
new file mode 100644
index 000000000..c0d919492
--- /dev/null
+++ b/libs/date_time/xmldoc/custom_time_zone.xml
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time.custom_time_zone">
+ <title>Custom Time Zone</title>
+
+ <link linkend="custom_time_zone_intro">Introduction</link> --
+ <link linkend="custom_time_zone_header">Header</link> --
+ <link linkend="custom_time_zone_constr">Construction</link> --
+ <link linkend="custom_time_zone_accessors">Accessors</link> --
+ <link linkend="custom_time_zone_dependents">Dependent Types</link>
+
+ <anchor id="custom_time_zone_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ A custom_time_zone object is a set of data and rules that provide information about a time zone. Information such as the offset from UTC, it's name and abbreviation, as well as daylight savings rules, called <link linkend="date_time.local_time.dst_calc_rules">dst_calc_rules</link>. These rules are handled via a boost::shared_ptr&lt;dst_calc_rules&gt;. Not all time zones utilize daylight savings, therefore, time_zone objects can be used with a NULL-assigned shared_ptr.
+ </para>
+ <para>
+ As a convenience, a typedef for shared_ptr&lt;dst_calc_rules&gt; is provided.
+ <programlisting>typedef boost::shared_ptr&lt;dst_calc_rules&gt; local_time::dst_calc_rule_ptr;</programlisting>
+ </para>
+ <anchor id="date_time.local_time.custom_time_zone_ptr" />
+ <para>
+ The time_zone objects are used via a boost::shared_ptr&lt;local_time::time_zone&gt;. As a convenience, a typedef for boost::shared_ptr&lt;local_time::time_zone&gt; is provided:
+ <programlisting>typedef boost::shared_ptr&lt;time_zone&gt; local_time::time_zone_ptr;</programlisting>
+ </para>
+
+ <anchor id="custom_time_zone_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ The inclusion of a single header will bring in all boost::local_time types, functions, and IO operators.
+ <programlisting>#include "boost/date_time/local_time/local_time.hpp"</programlisting>
+ </para>
+
+ <anchor id="custom_time_zone_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ Construction of a custom_time_zone is dependent on four objects: a
+ <link linkend="date_time.posix_time.time_duration">time_duration</link>, a <link linkend="time_zone_names">time_zone_names</link>, a <link linkend="dst_adjustment_offsets">dst_adjustment_offsets</link>, and a shared_ptr to a <link linkend="date_time.local_time.dst_calc_rules">dst_calc_rule</link>.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>custom_time_zone(...)
+ Parameters:
+ <link linkend="time_zone_names">names</link>,
+ <link linkend="date_time.posix_time.time_duration">gmt_offset</link>,
+ <link linkend="dst_adjustment_offsets">dst_offsets</link>,
+ <link linkend="date_time.local_time.dst_calc_rules">dst_rules</link> </screen></entry>
+ <entry>See <link linkend="date_time.examples.simple_time_zone">simple_time_zone</link> example for time_zone usage</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="custom_time_zone_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string dst_zone_abbrev()</screen></entry>
+ <entry>Returns the daylight savings abbreviation for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr->dst_zone_abbrev();
+// "EDT"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string std_zone_abbrev()</screen></entry>
+ <entry>Returns the standard abbreviation for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr->std_zone_abbrev();
+// "EST"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string dst_zone_name()</screen></entry>
+ <entry>Returns the daylight savings name for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr->dst_zone_name();
+// "Eastern Daylight Time"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string std_zone_name()</screen></entry>
+ <entry>Returns the standard name for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr->std_zone_name();
+// "Eastern Standard Time"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool has_dst()</screen></entry>
+ <entry>Returns true when custom_time_zone's shared_ptr to dst_calc_rules is not NULL.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr->has_dst();
+// true
+phx_zone_sh_ptr->has_dst();
+// false</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>dst_local_start_time(...)
+ Return Type:
+ ptime
+ Parameter:
+ greg_year</screen></entry>
+ <entry>The date and time daylight savings time begins in given year. Returns not_a_date_time if this zone has no daylight savings.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_ptr->dst_local_start_time(2004);
+// 2004-Apr-04 02:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>dst_local_end_time(...)
+ Return Type:
+ ptime
+ Parameter:
+ greg_year</screen></entry>
+ <entry>The date and time daylight savings time ends in given year. Returns not_a_date_time if this zone has no daylight savings.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_ptr->dst_local_end_time(2004);
+// 2004-Oct-31 02:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration base_utc_offset()</screen></entry>
+ <entry>The amount of time offset from UTC (typically in hours).</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_ptr->base_utc_offset();
+// -05:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration dst_offset()</screen></entry>
+ <entry>The amount of time shifted during daylight savings.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr->dst_offset();
+// 01:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_posix_string()</screen></entry>
+ <entry>Returns a posix time zone string representation of this time_zone object. Depending on how the time_zone object was created, the date-spec format of the string will be in either 'M' notation or 'n' notation. Every possible date-spec that can be represented in 'J' notation can also be represented in 'n' notation. The reverse is not true so only 'n' notation is used for these types of date-specs. For a detailed description of a posix time zone string see <link linkend="date_time.local_time.posix_time_zone">posix_time_zone</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_ptr->to_posix_string();
+// "EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"
+phx_ptr->to_posix_string();
+// "MST-07"
+ </screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="custom_time_zone_dependents" />
+ <bridgehead renderas="sect3">Dependent Types</bridgehead>
+ <link linkend="time_zone_names">Time Zone Names</link> --
+ <link linkend="dst_adjustment_offsets">Dst Adjustment Offsets</link> --
+ <link linkend="date_time.local_time.dst_calc_rules">Daylight Savings Calc Rules</link>
+ <anchor id="time_zone_names" />
+ <bridgehead renderas="sect3">Time Zone Names</bridgehead>
+ <para>
+ The time_zone_names_base type is an immutable template class of four strings. One each for the name and abbreviation in standard time and daylight savings time. The time_zone_names type is a typedef of time_zone_names_base&lt;char&gt;.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_zone_names(...)
+ Parameters:
+ string std_name
+ string std_abbrev
+ string dst_name
+ string dst_abbrev</screen></entry>
+ <entry>The only constructor, all four strings must be provided.</entry>
+ </row>
+ <row>
+ <entry><screen>string sn("Eastern Standard Time");
+string sa("EST");
+string dn("Eastern Daylight Time");
+string da("EDT");
+time_zone_names nyc_names(sn, sa,
+ dn, da);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string std_zone_name()</screen></entry>
+ <entry>Returns the standard zone name</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_names.std_zone_name();
+// "Eastern Standard Time"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string std_zone_abbrev()</screen></entry>
+ <entry>Returns the standard zone abbreviation</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_names.std_zone_abbrev();
+// "EST"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string dst_zone_name()</screen></entry>
+ <entry>Returns the daylight savings zone name</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_names.std_zone_name();
+// "Eastern Daylight Time"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string dst_zone_abbrev()</screen></entry>
+ <entry>Returns the daylight savings zone abbreviation</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_names.std_zone_abbrev();
+// "EDT"</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="dst_adjustment_offsets" />
+ <bridgehead renderas="sect3">Dst Adjustment Offsets</bridgehead>
+ <para>
+ The dst_adjustment_offsets type is a collection of three <link linkend="date_time.posix_time.time_duration">time_duration</link> objects.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>dst_adjustment_offsets(...)
+ Parameters:
+ time_duration dst_adjust
+ time_duration start_offset
+ time_duration end_offset</screen></entry>
+ <entry>The first time_duration is the daylight savings adjustment. The second is the time which daylight savings starts on the start day. The third is the time daylight savings ends on the ending day.</entry>
+ </row>
+ <row>
+ <entry><screen>
+dst_adjustment_offsets(hours(1),
+ hours(2),
+ hours(2));</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="date_time.local_time.dst_calc_rules" />
+ <bridgehead renderas="sect3">Daylight Savings Calc Rules</bridgehead>
+ <para>
+ Daylight savings calc rules, named dst_calc_rules, are a series of objects that group appropriate <link linkend="date_time.gregorian.date_algorithms">date_generators</link> together to form rule sets. The individual rules objects are used via dst_calc_rule_ptr.
+ </para>
+ <para>
+ For a complete example of all five dst_calc_rule types, see: <link linkend="date_time.examples.calc_rules">calc_rules example</link>.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>partial_date_dst_rule(...)
+ Parameters:
+ start_rule
+ end_rule</screen></entry>
+ <entry>Both the start and end rules are of type gregorian::partial_date.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>first_last_dst_rule(...)
+ Parameters:
+ start_rule
+ end_rule</screen></entry>
+ <entry>The DST start rule is of type gregorian::first_day_of_the_week_in_month and the end rule is of type gregorian::last_day_of_the_week_in_month.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>last_last_dst_rule(...)
+ Parameters:
+ start_rule
+ end_rule</screen></entry>
+ <entry>Both the start and end rules are of type gregorian::last_day_of_the_week_in_month.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>nth_last_dst_rule(...)
+ Parameters:
+ start_rule
+ end_rule</screen></entry>
+ <entry>The DST start rule is of type gregorian::nth_day_of_the_week_in_month and the end rule is of type gregorian::last_day_of_the_week_in_month.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>nth_kday_dst_rule(...)
+ Parameters:
+ start_rule
+ end_rule)
+(see note* below)</screen>
+ </entry>
+ <entry>Both rules are of type gregorian::nth_day_of_the_week_in_month.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+ * Note: The name "nth_kday_dst_rule" is a bit cryptic. Therefore, a more descriptive name, "nth_day_of_the_week_in_month_dst_rule", is also provided.
+ </para>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/date_algorithms.xml b/libs/date_time/xmldoc/date_algorithms.xml
new file mode 100644
index 000000000..846e41e17
--- /dev/null
+++ b/libs/date_time/xmldoc/date_algorithms.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.gregorian.date_algorithms">
+ <title>Date Generators/Algorithms</title>
+ <bridgehead renderas="sect2">Date Generators/Algorithms</bridgehead>
+ <link linkend="algo_intro">Introduction</link> --
+ <link linkend="algo_header">Header</link> --
+ <link linkend="algo_overview">Class Overview</link> --
+ <link linkend="algo_func_overview">Function Overview</link>
+
+ <anchor id="algo_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ Date algorithms or generators are tools for generating other dates or schedules of dates. A generator function starts with some part of a date such as a month and day and is supplied another part to then generate a concrete date. This allows the programmer to represent concepts such as "The first Sunday in February" and then create a concrete set of dates when provided with one or more years.
+ <emphasis>Note</emphasis>: As of boost version 1_31_0, date generator names have been changed. Old names are still available but are no longer documented and may someday be deprecated
+ </para>
+ <para>Also provided are stand-alone functions for generating a date, or calculation a duration of days. These functions take a date object and a weekday object as parameters.
+ </para>
+ <para>All date generator classes and functions are in the boost::gregorian namespace.
+ </para>
+ <para>
+ The <link linkend="date_time.examples.print_holidays">print holidays</link> example shows a detailed usage example.
+ </para>
+
+ <anchor id="algo_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para><programlisting>#include "boost/date_time/gregorian/gregorian.hpp"</programlisting>
+ </para>
+
+ <anchor id="algo_overview" />
+ <bridgehead renderas="sect3">Overview</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Class and get_date Parameter</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>year_based_generator
+date get_date(greg_year year)</screen></entry>
+ <entry>A unifying (abstract) date_generator base type for: <code>partial_date</code>, <code>nth_day_of_the_week_in_month</code>, <code>first_day_of_the_week_in_month</code>, and <code>last_day_of_the_week_in_month</code>.</entry>
+ </row>
+ <row>
+ <entry>The <link linkend="date_time.examples.print_holidays">print holidays</link> example shows a detailed usage example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>last_day_of_the_week_in_month(greg_weekday,
+ greg_month)
+date get_date(greg_year year)</screen></entry>
+ <entry>Calculate something like last Monday of January</entry>
+ </row>
+ <row>
+ <entry><screen>last_day_of_the_week_in_month lwdm(Monday,Jan);
+date d = lwdm.get_date(2002);
+//2002-Jan-28</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>first_day_of_the_week_in_month(greg_weekday,
+ greg_month)
+date get_date(greg_year year)</screen></entry>
+ <entry>Calculate something like first Monday of January</entry>
+ </row>
+ <row>
+ <entry><screen>first_day_of_the_week_in_month fdm(Monday,Jan);
+date d = fdm.get_date(2002);
+//2002-Jan-07</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>nth_day_of_the_week_in_month(week_num,
+ greg_weekday,
+ greg_month)
+date get_date(greg_year year)</screen></entry>
+ <entry><code>week_num</code> is a public enum member of <code>nth_day_of_the_week_in_month</code>. Calculate something like first Monday of January, second Tuesday of March, Third Sunday of December, etc. (first through fifth are provided, fifth is the equivalent of last)</entry>
+ </row>
+ <row>
+ <entry><screen>typedef nth_day_of_the_week_in_month nth_dow;
+nth_dow ndm(nth_dow::third, Monday,Jan);
+date d = ndm.get_date(2002);
+//2002-Jan-21</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>partial_date(greg_day, greg_month)
+date get_date(greg_year year)</screen></entry>
+ <entry>Generates a date by applying the year to the given month and day.</entry>
+ </row>
+ <row>
+ <entry><screen>partial_date pd(1,Jan);
+date d = pd.get_date(2002);
+//2002-Jan-01</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>first_day_of_the_week_after(greg_weekday)
+date get_date(date d)</screen></entry>
+ <entry>Calculate something like First Sunday after Jan 1,2002</entry>
+ </row>
+ <row>
+ <entry><screen>first_day_of_the_week_after fdaf(Monday);
+date d = fdaf.get_date(date(2002,Jan,1));
+//2002-Jan-07</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>first_day_of_the_week_before(greg_weekday)
+date get_date(date d)</screen></entry>
+ <entry>Calculate something like First Monday before Feb 1,2002</entry>
+ </row>
+ <row>
+ <entry><screen>first_day_of_the_week_before fdbf(Monday);
+date d = fdbf.get_date(date(2002,Feb,1));
+//2002-Jan-28</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <anchor id="algo_func_overview" />
+ <bridgehead renderas="sect3">Function Overview</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Function Prototype</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>days days_until_weekday date, greg_weekday)</screen></entry>
+ <entry> Calculates the number of days from given date until given weekday.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2004,Jun,1); // Tuesday
+greg_weekday gw(Friday);
+days_until_weekday(d, gw); // 3 days</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>days days_before_weekday(date, greg_weekday)</screen></entry>
+ <entry> Calculates the number of day from given date to previous given weekday.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2004,Jun,1); // Tuesday
+greg_weekday gw(Friday);
+days_before_weekday(d, gw); // 4 days</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date next_weekday(date, greg_weekday)</screen></entry>
+ <entry> Generates a date object representing the date of the following weekday from the given date.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2004,Jun,1); // Tuesday
+greg_weekday gw(Friday);
+next_weekday(d, gw); // 2004-Jun-4</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date previous_weekday(date, greg_weekday)</screen></entry>
+ <entry> Generates a date object representing the date of the previous weekday from the given date.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2004,Jun,1); // Tuesday
+greg_weekday gw(Friday);
+previous_weekday(d, gw); // 2004-May-28</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+</section>
diff --git a/libs/date_time/xmldoc/date_class.xml b/libs/date_time/xmldoc/date_class.xml
new file mode 100644
index 000000000..b841811bb
--- /dev/null
+++ b/libs/date_time/xmldoc/date_class.xml
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2007 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.gregorian.date_class">
+ <title>Date</title>
+
+ <link linkend="date_intro">Introduction</link> --
+ <link linkend="date_header">Header</link> --
+ <link linkend="date_construction">Construction</link> --
+ <link linkend="date_construct_from_string">Construct from String</link> --
+ <link linkend="date_construct_from_clock">Construct from Clock</link> --
+ <link linkend="date_accessors">Accessors</link> --
+ <link linkend="date_convert_to_string">Convert to String</link> --
+ <link linkend="date_operators">Operators</link> --
+ <link linkend="date_tm_funcs">Struct tm Functions</link>
+
+ <anchor id="date_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::gregorian::date is the primary interface for date programming. In general,
+ the date class is immutable once constructed although it does allow assignment from another
+ date.
+ Techniques for creating dates include reading the
+ <link linkend="date_construct_from_clock">current date from the clock</link>,
+ using <link linkend="date_time.gregorian.date_iterators">date iterators</link>, and
+ <link linkend="date_time.gregorian.date_algorithms">date algorithms or generators</link>.
+ </para>
+
+ <para>
+ Internally boost::gregorian::date is stored as a 32 bit integer type. The class is specifically
+ designed to NOT contain virtual functions. This design allows for efficient
+ calculation and memory usage with large collections of dates.
+ </para>
+
+ <para>
+ The construction of a date validates all input so that it is not possible to
+ construct an 'invalid' date. That is 2001-Feb-29 cannot be constructed as a date.
+ Various exceptions derived from std::out_of_range are thrown to indicate which aspect
+ of the date input is invalid. Note that the
+ special value not-a-date-time can be used as 'invalid' or 'null' date if so desired.
+ </para>
+
+ <anchor id="date_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o
+or
+#include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="date_construction" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date(greg_year, greg_month, greg_day)</screen></entry>
+ <entry>Construct from parts of date. Throws bad_year, bad_day_of_month, or bad_day_month (derivatives of std::out_of_range) if the year, month or day are out of range.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date(date d)</screen></entry>
+ <entry>Copy constructor</entry>
+ </row>
+ <row>
+ <entry><screen>date d1(d);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date(special_values sv)</screen></entry>
+ <entry>Constructor for infinities, not-a-date-time, max_date_time, and min_date_time</entry>
+ </row>
+ <row>
+ <entry><screen>date d1(neg_infin);
+date d2(pos_infin);
+date d3(not_a_date_time);
+date d4(max_date_time);
+date d5(min_date_time);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date()</screen></entry>
+ <entry>Default constructor. Creates a date object initialized to not_a_date_time. NOTE: this constructor can be disabled by defining DATE_TIME_NO_DEFAULT_CONSTRUCTOR (see compiler_config.hpp)</entry>
+ </row>
+ <row>
+ <entry><screen>date d; // d =&gt; not_a_date_time</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="date_construct_from_string" />
+ <bridgehead renderas="sect3">Construct from String</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date from_string(std::string)</screen></entry>
+ <entry>From delimited date string where with order year-month-day eg: 2002-1-25</entry>
+ </row>
+ <row>
+ <entry><screen>std::string ds("2002/1/25");
+date d(from_string(ds));</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date from_undelimited_string(std::string)</screen></entry>
+ <entry>From iso type date string where with order year-month-day eg: 20020125</entry>
+ </row>
+ <row>
+ <entry><screen>std::string ds("20020125");
+date d(from_undelimited_string(ds));</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="date_construct_from_clock" />
+ <bridgehead renderas="sect3">Construct from Clock</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>day_clock::local_day()</screen></entry>
+ <entry>Get the local day based on the time zone settings of the computer.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(day_clock::local_day());</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>day_clock::universal_day()</screen></entry>
+ <entry>Get the UTC day.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(day_clock::universal_day());</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="date_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>greg_year year() const</screen></entry>
+ <entry>Get the year part of the date.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+d.year(); // --> 2002</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>greg_month month() const</screen></entry>
+ <entry>Get the month part of the date.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+d.month(); // --> 1</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>greg_day day() const</screen></entry>
+ <entry> Get the day part of the date.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+d.day(); // --> 10</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>greg_ymd year_month_day() const</screen></entry>
+ <entry>Return a year_month_day struct. More efficient when all 3 parts of the date are needed.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+date::ymd_type ymd = d.year_month_day();
+// ymd.year --> 2002,
+// ymd.month --> 1,
+// ymd.day --> 10</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>greg_day_of_week day_of_week() const</screen></entry>
+ <entry>Get the day of the week (Sunday, Monday, etc.)</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+d.day(); // --> Thursday</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>greg_day_of_year day_of_year() const</screen></entry>
+ <entry>Get the day of the year. Number from 1 to 366 </entry>
+ </row>
+ <row>
+ <entry><screen>date d(2000,Jan,10);
+d.day_of_year(); // --> 10</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date end_of_month() const</screen></entry>
+ <entry>Returns a <code>date</code> object set to the last day of the calling objects current month.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2000,Jan,10);
+d.end_of_month(); // --> 2000-Jan-31</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_infinity() const</screen></entry>
+ <entry>Returns true if date is either positive or negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>date d(pos_infin);
+d.is_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_neg_infinity() const</screen></entry>
+ <entry>Returns true if date is negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>date d(neg_infin);
+d.is_neg_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_pos_infinity() const</screen></entry>
+ <entry>Returns true if date is positive infinity</entry>
+ </row>
+ <row>
+ <entry><screen>date d(neg_infin);
+d.is_pos_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_not_a_date() const</screen></entry>
+ <entry>Returns true if value is not a date</entry>
+ </row>
+ <row>
+ <entry><screen>date d(not_a_date_time);
+d.is_not_a_date(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_special() const</screen></entry>
+ <entry>Returns true if date is any <code>special_value</code></entry>
+ </row>
+ <row>
+ <entry><screen>date d(pos_infin);
+date d2(not_a_date_time);
+date d3(2005,Mar,1);
+d.is_special(); // --> true
+d2.is_special(); // --> true
+d3.is_special(); // --> false</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>special_value as_special() const</screen></entry>
+ <entry>Returns represented <code>special_value</code> or <code>not_special</code> if the represented date is a normal date.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long modjulian_day() const</screen></entry>
+ <entry>Returns the modified julian day for the date.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long julian_day() const</screen></entry>
+ <entry>Returns the julian day for the date.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>int week_number() const</screen></entry>
+ <entry>Returns the ISO 8601 week number for the date.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+ <row>
+ <entry valign="top" morerows="1"><screen>date end_of_month() const</screen></entry>
+ <entry>Returns the last day of the month for the date.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2000,Feb,1);
+//gets Feb 29 -- 2000 was leap year
+date eom = d.end_of_month();</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="date_convert_to_string" />
+ <bridgehead renderas="sect3">Convert to String</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_simple_string(date d)</screen></entry>
+ <entry>To <code>YYYY-mmm-DD</code> string where <code>mmm</code> is a 3 char month name.</entry>
+ </row>
+ <row>
+ <entry><screen>"2002-Jan-01"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_iso_string(date d)</screen></entry>
+ <entry>To <code>YYYYMMDD</code> where all components are integers.</entry>
+ </row>
+ <row>
+ <entry><screen>"20020131"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_iso_extended_string(date d)</screen></entry>
+ <entry> To <code>YYYY-MM-DD</code> where all components are integers.</entry>
+ </row>
+ <row>
+ <entry><screen>"2002-01-31"</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="date_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;</screen></entry>
+ <entry>Stream output operator</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+std::cout &lt;&lt; d &lt;&lt; std::endl;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;&gt;</screen></entry>
+ <entry>Stream input operator. <emphasis role="strong">Note:</emphasis> As of version 1.33, streaming operations have been greatly improved. See <link linkend="date_time.date_time_io">Date Time IO System</link> for details on exceptions and error conditions.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(not_a_date_time);
+stringstream ss("2002-Jan-01");
+ss &gt;&gt; d;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=,
+operator>, operator&lt;,
+operator>=, operator&lt;=</screen></entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>d1 == d2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date operator+(date_duration) const</screen></entry>
+ <entry>Return a date adding a day offset</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+date_duration dd(1);
+date d2 = d + dd;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date operator-(date_duration) const</screen></entry>
+ <entry>Return a date by substracting a day offset</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+date_duration dd(1);
+date d2 = d - dd;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_duration operator-(date) const</screen></entry>
+ <entry>Return a date_duration by subtracting two dates</entry>
+ </row>
+ <row>
+ <entry><screen>date d1(2002,Jan,1);
+date d2(2002,Jan,2);
+date_duration dd = d2-d1;</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="date_tm_funcs" />
+ <bridgehead renderas="sect3">Struct tm Functions</bridgehead>
+ <para>Functions for converting a <code>date</code> object to, and from, a <code>tm</code> struct are provided.</para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>tm to_tm(date)</screen></entry>
+ <entry>A function for converting a <code>date</code> object to a <code>tm</code> struct. The fields: <code>tm_hour</code>, <code>tm_min</code>, and <code>tm_sec</code> are set to zero. The <code>tm_isdst</code> field is set to -1.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2005,Jan,1);
+tm d_tm = to_tm(d);
+/* tm_year => 105
+ tm_mon => 0
+ tm_mday => 1
+ tm_wday => 6 (Saturday)
+ tm_yday => 0
+ tm_hour => 0
+ tm_min => 0
+ tm_sec => 0
+ tm_isddst => -1 */</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date date_from_tm(tm datetm)</screen></entry>
+ <entry>A function for converting a <code>tm</code> struct to a <code>date</code> object. The fields: <code>tm_wday </code>, <code>tm_yday </code>, <code>tm_hour</code>, <code>tm_min</code>, <code>tm_sec</code>, and <code>tm_isdst</code> are ignored.</entry>
+ </row>
+ <row>
+ <entry><screen>tm d_tm;
+d_tm.tm_year = 105;
+d_tm.tm_mon = 0;
+d_tm.tm_mday = 1;
+date d = date_from_tm(d_tm);
+// d => 2005-Jan-01</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+</section>
diff --git a/libs/date_time/xmldoc/date_duration.xml b/libs/date_time/xmldoc/date_duration.xml
new file mode 100644
index 000000000..12d22ebca
--- /dev/null
+++ b/libs/date_time/xmldoc/date_duration.xml
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section xmlns:xi="http://www.w3.org/2001/XInclude" id="date_time.gregorian.date_duration">
+ <title>Date Duration (aka Days)</title>
+
+ <link linkend="duration_intro">Introduction</link> --
+ <link linkend="duration_header">Header</link> --
+ <link linkend="duration_construction">Construction</link> --
+ <link linkend="duration_accessors">Accessors</link> --
+ <link linkend="duration_operators">Operators</link> --
+ <link linkend="additional_duration_types">Additional Duration Types</link>
+
+ <anchor id="duration_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::gregorian::date_duration is a simple day count used for arithmetic with <link linkend="date_time.gregorian.date_class">gregorian::date</link>. A duration can be either positive or negative.
+ </para>
+ <para>
+ As of version 1_32 the date_duration class has been typedef'd as days in the boost::gregorian namespace. Throughout the examples you will find days used instead of date_duration.
+ </para>
+
+ <anchor id="duration_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o
+or
+#include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="duration_construction" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date_duration(long)</screen></entry>
+ <entry>Create a duration count.</entry>
+ </row>
+ <row>
+ <entry><screen>date_duration dd(3); //3 days</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>days(special_values sv)</screen></entry>
+ <entry>Constructor for infinities, not-a-date-time, max_date_time, and min_date_time</entry>
+ </row>
+ <row>
+ <entry><screen>days dd1(neg_infin);
+days dd2(pos_infin);
+days dd3(not_a_date_time);
+days dd4(max_date_time);
+days dd5(min_date_time);</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="duration_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>long days() const</screen></entry>
+ <entry>Get the day count.</entry>
+ </row>
+ <row>
+ <entry><screen>date_duration dd(3); dd.days() --> 3</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_negative() const</screen></entry>
+ <entry>True if number of days is less than zero.</entry>
+ </row>
+ <row>
+ <entry><screen>date_duration dd(-1); dd.is_negative() --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>static date_duration unit()</screen></entry>
+ <entry>Return smallest possible unit of duration type.</entry>
+ </row>
+ <row>
+ <entry><screen>date_duration::unit() --> date_duration(1)</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_special() const</screen></entry>
+ <entry>Returns true if days is any <code>special_value</code></entry>
+ </row>
+ <row>
+ <entry><screen>days dd(pos_infin);
+days dd2(not_a_date_time);
+days dd3(25);
+dd.is_special(); // --> true
+dd2.is_special(); // --> true
+dd3.is_special(); // --> false</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="duration_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;, operator&gt;&gt;</screen></entry>
+ <entry>Streaming operators. <emphasis role="strong">Note:</emphasis> As of version 1.33, streaming operations have been greatly improved. See <link linkend="date_time.date_time_io">Date Time IO System</link> for more details (including exceptions and error conditions).</entry>
+ </row>
+ <row>
+ <entry><screen>date d(not_a_date_time);
+stringstream ss("2002-Jan-01");
+ss &gt;&gt; d;
+std::cout &lt;&lt; d; // "2002-Jan-01"
+</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=,
+operator>, operator&lt;,
+operator>=, operator&lt;=</screen>
+ </entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>dd1 == dd2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_duration operator+(date_duration) const</screen></entry>
+ <entry>Add date durations.</entry>
+ </row>
+ <row>
+ <entry><screen>date_duration dd1(3);
+date_duration dd2(5);
+date_duration dd3 = dd1 + dd2;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_duration operator-(date_duration) const</screen></entry>
+ <entry>Subtract durations.</entry>
+ </row>
+ <row>
+ <entry><screen>date_duration dd1(3);
+date_duration dd2(5);
+date_duration dd3 = dd1 - dd2;</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="additional_duration_types" />
+ <bridgehead renderas="sect3">Additional Duration Types</bridgehead>
+ <para>These additional types are logical representations of spans of days.</para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>months(int num_of_months)</screen></entry>
+ <entry>A logical month representation. Depending on the usage, this <code>months</code> object may cover a span of 28 to 31 days. The objects also use a snap to end-of-month behavior when used in conjunction with a date that is the last day of a given month. <emphasis role="strong">WARNING: this behavior may lead to unexpected results.</emphasis> See: <link linkend="snap_to_details">Reversibility of Operations Pitfall</link> for complete details and alternatives.</entry>
+ </row>
+ <row>
+ <entry><screen>months single(1);
+date leap_year(2004,Jan,31);
+date norm_year(2005,Jan,31);
+leap_year + single; // => 2004-Feb-29
+norm_year + single; // => 2005-Feb-28
+date(2005,Jan,1) + single; // => 2005-Feb-01
+date(2005,Feb,1) + single; // => 2005-Mar-01
+date(2005,Feb,28) + single; // => 2005-Mar-31</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>years(int num_of_years)</screen></entry>
+ <entry>A logical representation of a year. The <code>years</code> object has the same behavior as the <code>months</code> objects with regards to the end-of-the-month.</entry>
+ </row>
+ <row>
+ <entry><screen>years single(1);
+date(2003,Feb,28) + single;
+// results in => 2004-Feb-29
+date(2004,Feb,29) + single;
+// results in => 2005-Feb-28</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>weeks(int num_of_weeks)</screen></entry>
+ <entry>A duration type representing a number of <code>n * 7</code> days.</entry>
+ </row>
+ <row>
+ <entry><screen>weeks single(1);
+date(2005,Jan,1) + single; // => 2005-Jan-08</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <xi:include href="snap_to_details.xml"/>
+
+</section>
diff --git a/libs/date_time/xmldoc/date_facet.xml b/libs/date_time/xmldoc/date_facet.xml
new file mode 100644
index 000000000..9721e3800
--- /dev/null
+++ b/libs/date_time/xmldoc/date_facet.xml
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.date_facet">
+ <title>Date Facet</title>
+
+ <link linkend="date_facet_intro">Introduction</link> -
+ <link linkend="date_facet_constr">Construction</link> -
+ <link linkend="date_facet_accessors">Accessors</link>
+
+ <anchor id="date_facet_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>The <code>boost::date_time::date_facet</code> enables users to have significant control over the output streaming of dates (and other gregorian objects). The date_facet is typedef'd in the <code>gregorian</code> namespace as <code>date_facet</code> and <code>wdate_facet</code>.
+ </para>
+
+ <anchor id="date_facet_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>date_facet()</screen></entry>
+ <entry>Default constructor</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_facet(...)
+ Parameters:
+ char_type* format
+ input_collection_type</screen></entry>
+ <entry>Format given will be used for date output. All other formats will use their defaults. Collection is the set of short names to be used for months. All other name collections will use their defaults.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_facet(...)
+ Parameters:
+ char_type* format
+ period_formatter_type
+ special_values_formatter_type
+ date_gen_formatter_type</screen></entry>
+ <entry>Format given will be used for date output. The remaining parameters are formatter objects. Further details on these objects can be found <link linkend="date_time.io_objects">here</link>. This constructor also provides default arguments for all parameters except the format. Therefore, <code>date_facet("%m %d %Y")</code> will work.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="date_facet_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>void format(char_type*)</screen></entry>
+ <entry>Set the format for dates.</entry>
+ </row>
+ <row>
+ <entry><screen>date_facet* f = new date_facet();
+f->format("%m %d %Y");</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_format()</screen></entry>
+ <entry>Sets the date format to ISO</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_format();
+// "%Y%m%d"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_extended_format()</screen></entry>
+ <entry>Sets the date format to ISO Extended</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_extended_format();
+// "%Y-%m-%d"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void month_format(char_type*)</screen></entry>
+ <entry>Set the format for months when they are 'put' individually.</entry>
+ </row>
+ <row>
+ <entry><screen>f->month_format("%B");
+ss &lt;&lt; greg_month(12); // "December"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void weekday_format(char_type*)</screen></entry>
+ <entry>Set the format for weekdays when they are 'put' individually.</entry>
+ </row>
+ <row>
+ <entry><screen>f->weekday_format("%a");
+ss &lt;&lt; greg_weekday(2); // "Tue"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void period_formatter(...)
+ Parameter:
+ period_formatter_type</screen></entry>
+ <entry>Replaces the period formatter object with a user created one.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void special_values_formatter(...)
+ Parameter:
+ special_values_formatter_type</screen></entry>
+ <entry>Replaces the special_values formatter object with a user created one.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void date_gen_phrase_strings(...)
+ Parameters:
+ input_collection_type
+ date_gen_formatter_type::
+ phrase_elements</screen></entry>
+ <entry>Sets new date generator phrase strings in date_gen_formatter. The input collection is a vector of strings (for details on these strings see <link linkend="io_objects.date_generators">date generator formatter/parser documentation</link>). The phrase_elements parameter is an enum, defined in the date_generator_formatter object, that has a default value of 'first'. It is used to indicate what the position of the first string in the collection will be.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void short_weekday_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'putting' short weekdays.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void long_weekday_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'putting' long weekdays.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void short_month_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'putting' short months.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void long_month_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'putting' long months.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(...)
+ Common parameters for all
+ 'put' functions:
+ OutItrT
+ ios_base
+ char_type
+ Unique parameter for 'put' funcs:
+ gregorian object</screen></entry>
+ <entry>There are 12 put functions in the date_facet. The common paraeters are: an iterator pointing to the next item in the stream, an ios_base object, and the fill character. Each unique gregorian object has it's own put function. Each unique put function is described below.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date)</screen></entry>
+ <entry>Puts a date object into the stream using the format set by <code>format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., days)</screen></entry>
+ <entry>Puts a days object into the stream as a number.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., month)</screen></entry>
+ <entry>Puts a month object into the stream using the format set by <code>month_format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., day)</screen></entry>
+ <entry>Puts a day of month object into the stream as a two digit number.</entry>
+ </row>
+ <row>
+ <entry><screen>"01" // January 1st</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., day_of_week)</screen></entry>
+ <entry>Puts a day of week object into the stream using the format set by <code>weekday_format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date_period)</screen></entry>
+ <entry>Puts a date_period into the stream. The format of the dates will use the format set by <code>format(..)</code> or the default date format. The type of period (open or closed range) and the delimiters used are those used by the period_formatter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., partial_date)</screen></entry>
+ <entry>Puts a partial_date date_generator object into the stream. The month format used is set by <code>month_format(..)</code> or the default. The day of month is represented as a two digit number.</entry>
+ </row>
+ <row>
+ <entry><screen>"01 Jan" // default formats
+"01 January" // long month format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date_generator)
+ Date Generator Type:
+ nth_day_of_the_week_in_month</screen></entry>
+ <entry>Puts a nth_day_of_the_week_in_month object into the stream. The month format is set by <code>month_format(...)</code> or the default. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_formatter</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"third Fri in May" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date_generator)
+ Date Generator Type:
+ first_day_of_the_week_in_month</screen></entry>
+ <entry>Puts a first_day_of_the_week_in_month object into the stream. The month format is set by <code>month_format(...)</code> or the default. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_formatter</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"first Wed of Jun" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date_generator)
+ Date Generator Type:
+ last_day_of_the_week_in_month</screen></entry>
+ <entry>Puts a last_day_of_the_week_in_month object into the stream. The month format is set by <code>month_format(...)</code> or the default. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_formatter</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"last Tue of Mar" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date_generator)
+ Date Generator Type:
+ first_day_of_the_week_after</screen></entry>
+ <entry>Puts a first_day_of_the_week_after object into the stream. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_formatter</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"first Sat after" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., date_generator)
+ Date Generator Type:
+ first_day_of_the_week_before</screen></entry>
+ <entry>Puts a first_day_of_the_week_before object into the stream. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_formatter</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"first Mon before" // defaults</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+</section>
+
+
diff --git a/libs/date_time/xmldoc/date_input_facet.xml b/libs/date_time/xmldoc/date_input_facet.xml
new file mode 100644
index 000000000..3eea356c0
--- /dev/null
+++ b/libs/date_time/xmldoc/date_input_facet.xml
@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.date_input_facet">
+ <title>Date Input Facet</title>
+
+ <link linkend="date_input_facet_intro">Introduction</link> -
+ <link linkend="date_input_facet_constr">Construction</link> -
+ <link linkend="date_input_facet_accessors">Accessors</link>
+
+ <anchor id="date_input_facet_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>The <code>boost::date_time::date_input_facet</code> enables users to have significant control how dates (and other gregorian objects) are streamed in. The date_input_facet is typedef'd in the <code>gregorian</code> namespace as <code>date_input_facet</code> and <code>wdate_input_facet</code>.
+ </para>
+
+ <anchor id="date_input_facet_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>date_input_facet()</screen></entry>
+ <entry>Default constructor</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_input_facet(string_type format)</screen></entry>
+ <entry>Format given will be used for date input. All other formats will use their defaults.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_input_facet(...)
+ Parameters:
+ string_type format
+ format_date_parser_type
+ special_values_parser_type
+ period_parser_type
+ date_gen_parser_type</screen></entry>
+ <entry>Format given will be used for date input. The remaining parameters are parser objects. Further details on these objects can be found <link linkend="date_time.io_objects">here</link>.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="date_input_facet_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>void format(char_type*)</screen></entry>
+ <entry>Set the format for dates.</entry>
+ </row>
+ <row>
+ <entry><screen>date_input_facet* f =
+ new date_input_facet();
+f->format("%m %d %Y");</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_format()</screen></entry>
+ <entry>Sets the date format to ISO</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_format();
+// "%Y%m%d"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_extended_format()</screen></entry>
+ <entry>Sets the date format to ISO Extended</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_extended_format();
+// "%Y-%m-%d"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void month_format(char_type*)</screen></entry>
+ <entry>Set the format when 'get'ing months individually.</entry>
+ </row>
+ <row>
+ <entry><screen>f->month_format("%B");
+ss.str("March");
+ss >> m; // March</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void weekday_format(char_type*)</screen></entry>
+ <entry>Set the format when 'get'ing weekdays individually.</entry>
+ </row>
+ <row>
+ <entry><screen>f->weekday_format("%a");
+ss.str("Sun");
+ss >> wd; // Sunday</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void year_format(char_type*)</screen></entry>
+ <entry>Set the format when 'get'ing years individually.</entry>
+ </row>
+ <row>
+ <entry><screen>f->weekday_format("%y");
+ss.str("04");
+ss >> year; // 2004</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void period_parser(...)
+ Parameter:
+ period_parser_type</screen></entry>
+ <entry>Replaces the period parser object with a user created one.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void special_values_parser(...)
+ Parameter:
+ special_values_parser_type</screen></entry>
+ <entry>Replaces the special_values parser object with a user created one.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void date_gen_phrase_strings(...)
+ Parameters:
+ input_collection_type</screen></entry>
+ <entry>Sets new date generator phrase strings in date_gen_parser. The input collection is a vector of strings (for details on these strings see <link linkend="io_objects.date_generators">date generator formatter/parser documentation</link>).</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void short_weekday_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'getting' short weekdays.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void long_weekday_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'getting' long weekdays.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void short_month_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'getting' short months.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void long_month_names(...)
+ Parameter:
+ input_collection_type</screen></entry>
+ <entry>Replace strings used when 'getting' long months.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(...)
+ Common parameters for all
+ 'get' functions:
+ InItrT from
+ InItrT to
+ ios_base
+ Unique parameter for 'get' funcs:
+ gregorian object</screen></entry>
+ <entry>There are 13 get functions in the date_input_facet. The common parameters are: an iterator pointing to the begining of the stream, an iterator pointing to the end of the stream, and an ios_base object. Each unique gregorian object has it's own get function. Each unique get function is described below.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date)</screen></entry>
+ <entry>Gets a date object from the stream using the format set by <code>format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen>ss.str("2005-Jan-01");
+ss >> d; // default format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., month)</screen></entry>
+ <entry>Gets a month object from the stream using the format set by <code>month_format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen>ss.str("Feb");
+ss >> m; // default format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., day_of_week)</screen></entry>
+ <entry>Gets a day of week object from the stream using the format set by <code>weekday_format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen>ss.str("Sun");
+ss >> dow; // default format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., day)</screen></entry>
+ <entry>Gets a day of month object from the stream as a two digit number.</entry>
+ </row>
+ <row>
+ <entry><screen>"01" // January 1st</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., year)</screen></entry>
+ <entry>Gets a year object from the stream as a number. The number of expected digits depends on the year format.</entry>
+ </row>
+ <row>
+ <entry><screen>ss/str("2005");
+ss >> y; // default format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., days)</screen></entry>
+ <entry>Gets a days object from the stream as a number.</entry>
+ </row>
+ <row>
+ <entry><screen>ss.str("356");
+ss >> dys; // a full year</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date_period)</screen></entry>
+ <entry>Gets a date_period from the stream. The format of the dates will use the format set by <code>format(..)</code> or the default date format. The type of period (open or closed range) and the delimiters used are those used by the period_parser.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., partial_date)</screen></entry>
+ <entry>Gets a partial_date date_generator object from the stream. The month format used is set by <code>month_format(..)</code> or the default. The day of month is represented as a two digit number.</entry>
+ </row>
+ <row>
+ <entry><screen>"01 Jan" // default formats
+"01 January" // long month format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date_generator)
+ Date Generator Type:
+ nth_day_of_the_week_in_month</screen></entry>
+ <entry>Gets a nth_day_of_the_week_in_month object from the stream. The month format is set by <code>month_format(...)</code> or the default. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_parser</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"third Fri in May" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date_generator)
+ Date Generator Type:
+ first_day_of_the_week_in_month</screen></entry>
+ <entry>Gets a first_day_of_the_week_in_month object from the stream. The month format is set by <code>month_format(...)</code> or the default. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_parser</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"first Wed of Jun" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date_generator)
+ Date Generator Type:
+ last_day_of_the_week_in_month</screen></entry>
+ <entry>Gets a last_day_of_the_week_in_month object from the stream. The month format is set by <code>month_format(...)</code> or the default. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_parser</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"last Tue of Mar" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date_generator)
+ Date Generator Type:
+ first_day_of_the_week_after</screen></entry>
+ <entry>Gets a first_day_of_the_week_after object from the stream. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_parser</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"first Sat after" // defaults</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., date_generator)
+ Date Generator Type:
+ first_day_of_the_week_before</screen></entry>
+ <entry>Gets a first_day_of_the_week_before object from the stream. The weekday format is set by <code>weekday_format(...)</code> or the default. The remaining phrase elements are set in the <link linkend ="io_objects.date_generators">date_generator_parser</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"first Mon before" // defaults</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/date_iterators.xml b/libs/date_time/xmldoc/date_iterators.xml
new file mode 100644
index 000000000..fbe42674f
--- /dev/null
+++ b/libs/date_time/xmldoc/date_iterators.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.gregorian.date_iterators">
+ <title>Date Iterators</title>
+
+ <link linkend="iterators_intro">Introduction</link> --
+ <link linkend="iterators_header">Header</link> --
+ <link linkend="iterators_overview">Overview</link>
+
+ <anchor id="iterators_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ Date iterators provide a standard mechanism for iteration through dates. Date iterators are a model of <ulink url="http://www.sgi.com/tech/stl/BidirectionalIterator.html">Bidirectional Iterator</ulink> and can be used to populate collections with dates and other date generation tasks. For example, the <link linkend="date_time.examples.print_month">print month</link> example iterates through all the days in a month and prints them.
+ </para>
+ <para>
+ All of the iterators here derive from boost::gregorian::date_iterator.
+ </para>
+
+ <anchor id="iterators_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o
+or
+#include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="iterators_overview" />
+ <bridgehead renderas="sect3">Overview</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date_iterator</screen></entry>
+ <entry>Common (abstract) base class for all day level iterators.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>day_iterator(date start_date, int day_count=1)</screen></entry>
+ <entry>Iterate <code>day_count</code> days at a time. This iterator does not provide postfix increment/decrement operators. Only prefix operators are provided.</entry>
+ </row>
+ <row>
+ <entry><screen>day_iterator day_itr(date(2005,Jan,1));
+++d_itr; // 2005-Jan-02
+day_iterator 2day_itr(date(2005,Feb,1),2);
+++2d_itr; // 2005-Feb-03</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>week_iterator(...)
+ Parameters:
+ date start_date
+ int week_offset (defaults to 1)</screen></entry>
+ <entry>Iterate <code>week_offset</code> weeks at a time. This iterator does not provide postfix increment/decrement operators. Only prefix operators are provided.</entry>
+ </row>
+ <row>
+ <entry><screen>week_iterator wk_itr(date(2005,Jan,1));
+++wk_itr; // 2005-Jan-08
+week_iterator 2wk_itr(date(2005,Jan,1),2);
+++2wk_itr; // 2005-Feb-15</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>month_iterator(...)
+ Parameters:
+ date start_date
+ int month_offset (defaults to 1)</screen></entry>
+<entry>Iterate <code>month_offset</code> months. There are special rules for handling the end of the month. These are: if start date is last day of the month, always adjust to last day of the month. If date is beyond the end of the month (e.g. Jan 31 + 1 month) adjust back to end of month (for more details and examples of this, see <link linkend="snap_to_details">Reversibility of Operations Pitfall</link>. <emphasis role="strong">NOTE:</emphasis> the <code>month_iterator</code> is not effected by this pitfall.) This iterator does not provide postfix increment/decrement operators. Only prefix operators are provided.</entry>
+ </row>
+ <row>
+ <entry><screen>month_iterator m_itr(date(2005,Jan,1));
+++m_itr; // 2005-Feb-01
+month_iterator 2m_itr(date(2005,Feb,1),2);
+++2m_itr; // 2005-Apr-01</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>year_iterator(...)
+ Parameters:
+ date start_date
+ int year_offset (defaults to 1)</screen></entry>
+ <entry>Iterate year_offset years. The year_iterator will always land on the day of the date parameter except when date is Feb 28 in a non-leap year. In this case the iterator will return Feb 29 for leap years (eg: 2003-Feb-28, 2004-Feb-29, 2005-Feb-28). This iterator does not provide postfix increment/decrement operators. Only prefix operators are provided.</entry>
+ </row>
+ <row>
+ <entry><screen>year_iterator y_itr(date(2005,Jan,1));
+++y_itr; // 2006-Jan-01
+year_iterator 2y_itr(date(2005,Feb,1),2);
+++2y_itr; // 2007-Feb-01</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+</section>
diff --git a/libs/date_time/xmldoc/date_period.xml b/libs/date_time/xmldoc/date_period.xml
new file mode 100644
index 000000000..64c363ec5
--- /dev/null
+++ b/libs/date_time/xmldoc/date_period.xml
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2006 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.gregorian.date_period">
+ <title>Date Period</title>
+
+ <link linkend="period_intro">Introduction</link> --
+ <link linkend="period_header">Header</link> --
+ <link linkend="period_construction">Construction</link> --
+ <link linkend="date_period_mutators">Mutators</link> --
+ <link linkend="period_accessors">Accessors</link> --
+ <link linkend="period_convert_to_string">Convert to String</link> --
+ <link linkend="period_operators">Operators</link>
+
+ <anchor id="period_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::gregorian::date_period provides direct representation for ranges between two dates. Periods provide the ability to simplify some types of calculations by simplifying the conditional logic of the program. For example, testing if a date is within an irregular schedule such as a weekend or holiday can be accomplished using collections of date periods. This is facilitated by several methods that allow evaluation if a date_period intersects with another date period, and to generate the period resulting from the intersection. The <link linkend="date_time.examples.date_period_calc">date period calculation example</link> provides an example of this.
+ </para>
+ <para>
+ A period that is created with beginning and end points being equal, or with a duration of zero, is known as a zero length period. Zero length periods are considered invalid (it is perfectly legal to construct an invalid period). For these periods, the <code>last</code> point will always be one unit less that the <code>begin</code> point.
+ </para>
+ <para>
+ Date periods used in combination with infinity values have the ability to represent complex concepts such as 'until further notice'.
+ </para>
+
+ <anchor id="period_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o
+or
+#include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="period_construction" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period(date, date)</screen></entry>
+ <entry>Create a period as [begin, end). If end is &lt;= begin then the period will be invalid.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,10),
+ date(2002,Jan,12));</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period(date, days)</screen></entry>
+ <entry>Create a period as [begin, begin+len) where end point would be begin+len. If len is &lt;= zero then the period will be defined as invalid.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,10),
+ days(2));</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period(date_period)</screen></entry>
+ <entry> Copy constructor</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(dp);</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <anchor id="date_period_mutators" />
+ <bridgehead renderas="sect3">Mutators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period shift(days)</screen></entry>
+ <entry>Add duration to both begin and end.</entry>
+ </row>
+ <row>
+ <entry>
+ <screen>
+date_period dp(date(2005,Jan,1), days(3));
+dp.shift(days(3));
+// dp == 2005-Jan-04 to 2005-Jan-07
+ </screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period expand(days)</screen></entry>
+ <entry>Subtract duration from begin and add duration to end.</entry>
+ </row>
+ <row>
+ <entry>
+ <screen>
+date_period dp(date(2005,Jan,2), days(2));
+dp.expand(days(1));
+// dp == 2005-Jan-01 to 2005-Jan-04
+ </screen>
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="period_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date begin()</screen></entry>
+ <entry> Return first day of period.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,1),
+ date(2002,Jan,10));
+dp.begin() --> 2002-Jan-01</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date last()</screen></entry>
+ <entry>Return last date in the period</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,1),
+ date(2002,Jan,10));
+dp.last() --> 2002-Jan-09</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date end()</screen></entry>
+ <entry>Return one past the last in period</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,1),
+ date(2002,Jan,10));
+dp.end() --> 2002-Jan-10</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>days length()</screen></entry>
+ <entry>Return the length of the date_period</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,1),
+ days(2));
+dp.length() --> 2</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_null()</screen></entry>
+ <entry>True if period is not well formed. eg: end less than or equal to begin.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp(date(2002,Jan,10),
+ date(2002,Jan,1));
+dp.begin() --> true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool contains(date)</screen></entry>
+ <entry>True if date is within the period. Zero length periods cannot contain any points</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+date_period dp(d, date(2002,Jan,10));
+dp.contains(date(2002,Jan,2));// true
+date_period dp2(d, d);
+dp.contains(date(2002,Jan,1));// false</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool contains(date_period)</screen></entry>
+ <entry>True if date period is within the period</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,10));
+date_period dp2(date(2002,Jan,2),
+ date(2002,Jan,3));
+dp1.contains(dp2) --> true
+dp2.contains(dp1) --> false</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool intersects(date_period)</screen></entry>
+ <entry>True if periods overlap</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,10));
+date_period dp2(date(2002,Jan,2),
+ date(2002,Jan,3));
+dp2.intersects(dp1) --> true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period intersection(date_period)</screen></entry>
+ <entry>Calculate the intersection of 2 periods. Null if no intersection.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,10));
+date_period dp2(date(2002,Jan,2),
+ date(2002,Jan,3));
+dp2.intersection(dp1) --> dp2</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period is_adjacent(date_period)</screen></entry>
+ <entry>Check if two periods are adjacent, but not overlapping.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,3));
+date_period dp2(date(2002,Jan,3),
+ date(2002,Jan,10));
+dp2.is_adjacent(dp1) --> true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period is_after(date)</screen></entry>
+ <entry>Determine the period is after a given date.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,10),
+ date(2002,Jan,30));
+date d(2002,Jan,3);
+dp1.is_after(d) --> true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period is_before(date)</screen></entry>
+ <entry>Determine the period is before a given date.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,3));
+date d(2002,Jan,10);
+dp1.is_before(d) --> true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period merge(date_period)</screen></entry>
+ <entry>Returns union of two periods. Null if no intersection.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,10));
+date_period dp2(date(2002,Jan,9),
+ date(2002,Jan,31));
+dp2.merge(dp1)
+// 2002-Jan-01/2002-Jan-31</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period span(date_period)</screen></entry>
+ <entry>Combines two periods and any gap between them such that begin = min(p1.begin, p2.begin) and end = max(p1.end , p2.end)</entry>
+ </row>
+ <row>
+ <entry><screen>
+date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,5));
+date_period dp2(date(2002,Jan,9),
+ date(2002,Jan,31));
+dp2.span(dp1); // 2002-Jan-01/2002-Jan-31</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period shift(days)</screen></entry>
+ <entry>Add duration to both begin and end.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,1),
+ date(2002,Jan,10));
+dp1.shift(days(1));
+// 2002-Jan-02/2002-Jan-11</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_period expand(days)</screen></entry>
+ <entry>Subtract duration from begin and add duration to end.</entry>
+ </row>
+ <row>
+ <entry><screen>date_period dp1(date(2002,Jan,4),
+ date(2002,Jan,10));
+dp1.expand(days(2));
+// 2002-Jan-02/2002-Jan-12</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <anchor id="period_convert_to_string" />
+ <bridgehead renderas="sect3">Convert to String</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_simple_string(date_period dp)</screen></entry>
+ <entry>To <code>[YYYY-mmm-DD/YYYY-mmm-DD]</code> string where <code>mmm</code> is 3 char month name.</entry>
+ </row>
+ <row>
+ <entry><screen>[2002-Jan-01/2002-Jan-31]</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <anchor id="period_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;</screen></entry>
+ <entry>ostream operator for date_period. Uses facet to format time points. Typical output: [2002-Jan-01/2002-Jan-31].</entry>
+ </row>
+ <row>
+ <entry><screen>std::cout &lt;&lt; dp &lt;&lt; std::endl;</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;&gt;</screen></entry>
+ <entry>istream operator for date_period. Uses facet to parse time points.</entry>
+ </row>
+ <row>
+ <entry><screen>"[2002-Jan-01/2002-Jan-31]"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=,
+operator&gt;, operator&lt;</screen>
+ </entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>dp1 == dp2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;</screen></entry>
+ <entry>True if dp1.end() less than dp2.begin()</entry>
+ </row>
+ <row>
+ <entry><screen>dp1 &lt; dp2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;</screen></entry>
+ <entry>True if dp1.begin() greater than dp2.end()</entry>
+ </row>
+ <row>
+ <entry><screen>dp1 &gt; dp2, etc</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+</section>
diff --git a/libs/date_time/xmldoc/date_time.xml b/libs/date_time/xmldoc/date_time.xml
new file mode 100644
index 000000000..5f0c69f51
--- /dev/null
+++ b/libs/date_time/xmldoc/date_time.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<library name="Date Time" dirname="date_time"
+ xmlns:xi="http://www.w3.org/2001/XInclude" id="date_time"
+ last-revision="$Date: 2005-06-12 13:53:10 -0700 (Sun, 12 Jun 2005) $">
+<libraryinfo>
+ <author>
+ <firstname>Jeff</firstname>
+ <surname>Garland</surname>
+ </author>
+
+ <copyright>
+ <year>2001</year>
+ <year>2002</year>
+ <year>2003</year>
+ <year>2004</year>
+ <year>2005</year>
+ <holder>CrystalClear Software, Inc</holder>
+ </copyright>
+
+ <legalnotice>
+ <para>Subject to the Boost Software License, Version 1.0. (See accompanying file
+ <filename>LICENSE_1_0.txt</filename> or copy at <ulink
+ url="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</ulink>)</para>
+ </legalnotice>
+
+ <librarypurpose>A set of facilities to ease programming with dates and times.
+ </librarypurpose>
+ <librarycategory name="category:misc"/>
+</libraryinfo>
+
+<title>Boost.Date_Time</title>
+<!-- <section id="date_time.intro"> -->
+ <bridgehead renderas="sect2">Introduction</bridgehead>
+
+ <para>
+ A set of date-time libraries based on generic programming concepts.
+ </para>
+
+ <para>This documentation is also available in PDF format. It can be found at:
+ <simplelist type="horiz" columns="1">
+ <member><ulink url="http://www.crystalclearsoftware.com/libraries/date_time/date_time.pdf" /></member>
+ </simplelist>
+ In addition, a full doxygen reference can be found at:
+ <simplelist type="horiz" columns="1">
+ <member><ulink url="http://www.crystalclearsoftware.com/libraries/date_time/ref_guide/index.html" /></member>
+ </simplelist>
+ The most current version of the documentation can be found at:
+ <simplelist type="horiz" columns="1">
+ <member><ulink url="http://www.crystalclearsoftware.com/libraries/date_time/index.html" /></member>
+ </simplelist>
+ </para>
+ <!-- </section> -->
+
+ <xi:include href="conceptual.xml"/>
+ <xi:include href="usage_examples.xml"/>
+ <xi:include href="gregorian.xml"/>
+ <xi:include href="posix_time.xml"/>
+ <xi:include href="local_time.xml"/>
+ <xi:include href="date_time_io.xml"/>
+ <xi:include href="serialization.xml" />
+ <xi:include href="details.xml"/>
+ <xi:include href="examples.xml"/>
+ <xi:include href="doxy.xml"/>
+<!-- add more sections here -->
+<!-- <xi:include href="local_date_time.xml"/> -->
+
+</library>
diff --git a/libs/date_time/xmldoc/date_time_docs_howto.html b/libs/date_time/xmldoc/date_time_docs_howto.html
new file mode 100644
index 000000000..ab451b381
--- /dev/null
+++ b/libs/date_time/xmldoc/date_time_docs_howto.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<head>
+ <title>Date Time Documentation Howto</title>
+ <meta name="GENERATOR" content="Quanta Plus">
+ <style type="text/css">
+ .copyright { color: #666666; font-size: small; }
+ .screen {
+ background: #EEF6FF;
+ font-family: monospace;
+ display: block;
+ margin-left: 4%;
+ margin-right: 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+ .fname { font-family: monospace; }
+ </style>
+</head>
+<body>
+ <h2>Date Time Documentation Howto</h2>
+ <h3>Instructions for:</h3>
+ <ol>
+ <li><A href="#exclusive_html">Building Exclusive Date Time HTML Documentation</A></li>
+ <li><A href="#exclusive_pdf">Building Exclusive Date Time PDF</A></li>
+ <li><A href="#doxy_ref">Generating Date Time Doxygen Reference</A></li>
+ <li><A href="#xsl_mods">Making further changes to the date_time_fo_stylesheet</A></li>
+ </ol>
+ <hr>
+ <A name="exclusive_html"><h3>Building Exclusive Date Time HTML Documentation</h3></A>
+ <p>No modifications are necessary to build an exclusive set of date time html documentation. Simply run bjam:<br>
+ <div class="screen">bjam --v2 date_time_doc</div><br>
+ The resulting html can be found in <font class="fname">xmldoc/html</font>. NOTE: the stylesheet may not be present. It can be copied from the <font class="fname">$BOOST_ROOT/doc/html</font> directory.</p>
+ <hr>
+ <a name="exclusive_pdf"><h3>Building Exclusive Date Time PDF</h3></a>
+ <p><strong>Prerequisite:</strong> bjam must be able to build documentation for 'fo' output (necessary aditions must have been added to <font class="fname">user-config.jam</font>).</p>
+
+ <p>Necessary modifications to build the date time pdf are:
+ <ol>
+ <li>Add the new stylesheet to <font class="fname">boostbook.jam</font>.<div class="screen">
+ <pre>
+rule docbook-to-fo ( target : source : properties * )
+{
+ #local native-path = [ path.native $(.boostbook-xsl-dir) ] ;
+ #local stylesheet = $(native-path:B=fo:S=.xsl) ;
+ local boost-root = [ modules.peek : BOOST_ROOT ];
+ local stylesheet = "$(boost-root)/libs/date_time/xmldoc/date_time_fo_stylesheet.xsl" ;
+ xslt $(target) : $(source) $(stylesheet) : $(properties) ;
+}</pre></div></li>
+ <li>Build <font class="fname">exclusive_date_time.fo</font>.
+ <div class="screen">bjam --v2 date_time_doc fo</div></li>
+ <li>Build the pdf.<div class="screen">fop ../../../bin.v2/libs/date_time/.../exclusive_date_time.fo date_time.pdf</div></li>
+ </ol>
+ </p>
+ <p><strong>BUILD ERRORS:</strong> During the fo->pdf step, an error stating that an id already exists may appear. This error appears to be introduced during the xml->fo step. There are two possible workarounds for this (depending on where the duplicated id apears). If the duplicate id appears in the reference section, find the offending id and change it manually (ex: "id2534038" -> "id2534039"). If the id appears in the documentation generated from the xml, change one of the anchor names in one of the xml files. <strong>Note:</strong> This does not mean there is an error in the xml. The anchor and link that is known to have an effect is <font class="fname">date_input_facet_intro</font> (change the 'd' to a 'f', or back, should do the trick).</p>
+ <hr>
+ <a name="doxy_ref"><h3>Generating Date Time Doxygen Reference</h3></a>
+ <p>Each doxygen reference file must be built, copied, and modified seperately. The steps to build all four <font class="fname">*.boostbook</font> reference files are:
+ <ol>
+ <li>Generate the <font class="fname">*.boostbook</font> files.</li>
+ <li>Copy the <font class="fname">*.boostbook</font> files to the xmldoc directory.</li>
+ <li>Fix the section tags and add copyright statement.</li>
+ </ol>
+ <div class="screen"><pre>
+bjam --v2 date_time_autodoc \
+ gregorian_autodoc \
+ posix_time_autodoc \
+ local_time_autodoc
+cp ../../../bin.v2/libs/.../*.boostbook .
+./ref_tag_fix.pl</pre></div>
+ </p>
+ <hr>
+ <a name="xsl_mods"><h3>Making further changes to the date_time_fo_stylesheet</h3></a>
+ <p>The stylesheet currently sets the left, right, and bottom margins. It also reduces the font-size for table cells that have the &#060;screen&#062; tags in them. The font-size reduction is accomplished by breaking the entire string (between the &#060;screen&#062; tags) into segments delimited by '\n'. Each of these segment's lengths are checked and the longest segment is used in calculating the amount of font-size reduction.</p>
+ <p>There are two variables used in adjusting the font-size: <font class="fname">char-per-cell</font> &#038; <font class="fname">min-reduction</font>. These hold the number of characters that can fit into a cell and the minimum percentage of reduction allowed (expressed as an integer).</p>
+ <p>Determining the number of characters that will fit into a cell is not the most gracefull of operations. Simply put, the minimum reduction must be set to 100 (no reduction allowed) and the pdf must be built. From there the number of characters that will fit must be manually counted.</p>
+ <hr>
+ <div><p class="copyright">Copyright &#169; 2001-2005 CrystalClear Software, Inc</p></div>
+ <div class="legalnotice">
+ <p>Subject to the Boost Software License, Version 1.0. <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</ahref="http://www.boost.org/LICENSE_1_0.txt"></p></div>
+ </body>
+</html>
diff --git a/libs/date_time/xmldoc/date_time_fo_stylesheet.xsl b/libs/date_time/xmldoc/date_time_fo_stylesheet.xsl
new file mode 100644
index 000000000..d72b0db22
--- /dev/null
+++ b/libs/date_time/xmldoc/date_time_fo_stylesheet.xsl
@@ -0,0 +1,180 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim"
+ xmlns:xverb="com.nwalsh.xalan.Verbatim"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="sverb xverb lxslt exsl"
+ version='1.0'>
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+ <xsl:import href="../../../tools/boostbook/xsl/fo.xsl" />
+
+ <!-- reset the default margin parameters -->
+ <xsl:param name="page.margin.bottom" select="'0.25in'"/>
+ <xsl:param name="page.margin.inner">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">1.25in</xsl:when>
+ <xsl:otherwise>0.65in</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param name="page.margin.outer">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">0.75in</xsl:when>
+ <xsl:otherwise>0.65in</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <!-- with the above margins, we can fit 38 monospace characters per table cell.
+ If the margins are changed, set min-reduction to 100 and generate a new pdf. Then
+ count the number of characters that fit in a cell. Not the slickest method but it works.-->
+ <xsl:variable name="char-per-cell" select="38"/>
+ <!-- prevent reducing the font size too much. An 80% reduction
+ gives us a width of 48 characters per cell -->
+ <xsl:variable name="min-reduction" select="80"/>
+
+ <!-- recursive font-size reduction template -->
+ <!-- the string may span multiple lines.
+ break it up and check the length of each line.
+ adjust font size according to longest line -->
+ <xsl:template name="font-size-reduction">
+ <xsl:param name="inp" />
+ <xsl:param name="max">1</xsl:param>
+ <xsl:variable name="result">
+ <xsl:choose>
+ <!-- &#x000A; is unicode line-feed character -->
+ <xsl:when test="contains($inp, '&#x000A;')">
+ <xsl:variable name="str" select="substring-before($inp, '&#x000A;')" />
+ <xsl:variable name="next" select="substring-after($inp, '&#x000A;')" />
+
+ <xsl:variable name="n_max">
+ <xsl:choose>
+ <xsl:when test="string-length($str) > $char-per-cell and string-length($str) > $max">
+ <xsl:value-of select="string-length($str)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$max" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($next, '&#x000A;')">
+ <xsl:call-template name="font-size-reduction">
+ <xsl:with-param name="inp" select="$next" />
+ <xsl:with-param name="max" select="$n_max" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$n_max > $char-per-cell and $n_max > string-length($next)">
+ <!-- set size with next.len -->
+ <xsl:value-of select="round($char-per-cell div $n_max * 100)"/>
+ </xsl:when>
+ <xsl:when test="string-length($next) > $char-per-cell and string-length($next) > $n_max">
+ <!-- set size with n_max -->
+ <xsl:value-of select="round($char-per-cell div string-length($next) * 100)"/>
+ </xsl:when>
+ <xsl:otherwise>100</xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="string-length($inp) > $char-per-cell">
+ <!-- set size with inp.len -->
+ <xsl:value-of select="round($char-per-cell div string-length($inp) * 100)"/>
+ </xsl:when>
+ <xsl:otherwise>100</xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- return either "result" or "min-reduction" -->
+ <xsl:choose>
+ <xsl:when test="$min-reduction > $result">
+ <xsl:value-of select="$min-reduction" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$result" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- this template was copied directly from docbook/boostbook xsl and modified
+ to calculate and resize monospace font to fit cells based on length of string -->
+ <xsl:template match="entry/screen">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="font_size">
+ <xsl:call-template name="font-size-reduction">
+ <xsl:with-param name="inp" select="." />
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <!-- write out the tag now that font size has been calculated -->
+ <xsl:choose>
+ <xsl:when test="$shade.verbatim != 0">
+ <fo:block id="{$id}"
+ white-space-collapse='false'
+ white-space-treatment='preserve'
+ linefeed-treatment='preserve'
+ xsl:use-attribute-sets="monospace.verbatim.properties shade.verbatim.style" font-size="{$font_size}%">
+ <xsl:choose>
+ <xsl:when test="$hyphenate.verbatim != 0 and function-available('exsl:node-set')">
+ <xsl:apply-templates select="exsl:node-set($content)" mode="hyphenate.verbatim"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ white-space-collapse='false'
+ white-space-treatment='preserve'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties" font-size="{$font_size}%">
+ <xsl:choose>
+ <xsl:when test="$hyphenate.verbatim != 0 and function-available('exsl:node-set')">
+ <xsl:apply-templates select="exsl:node-set($content)" mode="hyphenate.verbatim"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/libs/date_time/xmldoc/date_time_io.xml b/libs/date_time/xmldoc/date_time_io.xml
new file mode 100644
index 000000000..e9f719c28
--- /dev/null
+++ b/libs/date_time/xmldoc/date_time_io.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.date_time_io"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Date Time Input/Output</title>
+ <using-namespace name="boost"/>
+ <using-namespace name="boost::date_time"/>
+ <bridgehead renderas="sect2">Date Time IO System</bridgehead>
+ <para>
+ <link linkend="streaming_exceptions">Exception Handling on Streams</link>
+ </para>
+
+ <para>As of version 1.33, the date_time library utilizes a new IO streaming system. This new system gives the user great control over how dates and times can be represented. The customization options can be broken down into two groups: format flags and string elements. Format flags provide flexibility in the order of the date elements as well as the type. Customizing the string elements allows the replacement of built in strings from month names, weekday names, and other strings used in the IO.</para>
+
+ <para>The output system is based on a date_facet (derived from std::facet), while the input system is based on a date_input_facet (also derived from std::facet). The time and local_time facets are derived from these base types. The output system utilizes three formatter objects, whereas the input system uses four parser objects. These formatter and parser objetcs are also customizable.</para>
+
+ <para>It is important to note, that while all the examples shown here use narrow streams, there are wide stream facets available as well (see <link linkend="io_objects_table">IO Objects</link> for a complete list).</para>
+
+ <para>It should be further noted that not all compilers are capable of using this IO system. For those compilers the IO system used in previous <code>date_time</code> versions is still available. The "legacy IO" is automatically selected for these compilers, however, the legacy IO system can be manually selected by defining <code>USE_DATE_TIME_PRE_1_33_FACET_IO</code>. See the <link linkend="date_time.buildinfo">Build-Compiler Information</link> for more information.</para>
+
+ <anchor id="streaming_exceptions" />
+ <bridgehead renderas="sect5">Exception Handling on Streams</bridgehead>
+ <para>When an error occurs during the input streaming process, the <code>std::ios_base::failbit</code> will (always) be set on the stream. It is also possible to have exceptions thrown when an error occurs. To "turn on" these exceptions, call the stream's <code>exceptions</code> function with a parameter of <code>std::ios_base::failbit</code>.</para>
+ <screen>// "Turning on" exceptions
+date d(not_a_date_time);
+std::stringstream ss;
+ss.exceptions(std::ios_base::failbit);
+ss.str("204-Jan-01");
+ss >> d; // throws bad_year exception AND sets failbit on stream</screen>
+
+ <bridgehead renderas="sect5">A simple example of this new system:</bridgehead>
+ <screen>//example to customize output to be "LongWeekday LongMonthname day, year"
+// "%A %b %d, %Y"
+date d(2005,Jun,25);
+date_facet* facet(new date_facet("%A %B %d, %Y"));
+std::cout.imbue(std::locale(std::cout.getloc(), facet));
+std::cout &lt;&lt; d &lt;&lt; std::endl;
+// "Saturday June 25, 2005"</screen>
+
+ <xi:include href="format_flags.xml" />
+
+ <para>The following table lists the available facets.</para>
+
+ <anchor id="io_objects_table" />
+ <bridgehead renderas="sect3">IO Objects</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Output</entry>
+ <entry>Input</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><classname>date_facet</classname></entry>
+ <entry><classname>date_input_facet</classname></entry>
+ </row>
+ <row>
+ <entry><classname alt="boost::date_time::date_facet">wdate_facet</classname></entry>
+ <entry><classname alt="boost::date_time::date_input_facet">wdate_input_facet</classname></entry>
+ </row>
+ <row>
+ <entry><classname>time_facet</classname></entry>
+ <entry><classname>time_input_facet</classname></entry>
+ </row>
+ <row>
+ <entry><classname alt="boost::date_time::time_facet">wtime_facet</classname></entry>
+ <entry><classname alt="boost::date_time::time_input_facet">wtime_input_facet</classname></entry>
+ </row>
+ <row>
+ <entry><classname alt="boost::date_time::time_facet">local_time_facet</classname>*</entry>
+ <entry><classname alt="boost::date_time::time_input_facet">local_time_input_facet</classname>*</entry>
+ </row>
+ <row>
+ <entry><classname alt="boost::date_time::time_facet">wlocal_time_facet</classname>*</entry>
+ <entry><classname alt="boost::date_time::time_input_facet">wlocal_time_input_facet</classname>*</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ * These links lead to the <code>time_facet</code> and <code>time_input_facet</code> reference sections. They are not actual classes but typedefs.
+ </para>
+
+ <bridgehead renderas="sect3">Formatter/Parser Objects</bridgehead>
+ <para>To implement the new i/o facets the date-time library uses a number of new parsers and formatters. These classes are available for users that want to implement specialized input/output routines.</para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Output</entry>
+ <entry>Input</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><classname>period_formatter</classname></entry>
+ <entry><classname>period_parser</classname></entry>
+ </row>
+ <row>
+ <entry><classname>date_generator_formatter</classname></entry>
+ <entry><classname>date_generator_parser</classname></entry>
+ </row>
+ <row>
+ <entry><classname>special_values_formatter</classname></entry>
+ <entry><classname>special_values_parser</classname></entry>
+ </row>
+ <row>
+ <entry></entry>
+ <entry><classname>format_date_parser</classname></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <xi:include href="date_facet.xml" />
+ <xi:include href="date_input_facet.xml" />
+ <xi:include href="time_facet.xml" />
+ <xi:include href="time_input_facet.xml" />
+ <xi:include href="io_objects.xml" />
+ <xi:include href="io_tutorial.xml" />
+
+</section>
diff --git a/libs/date_time/xmldoc/design_concepts.xml b/libs/date_time/xmldoc/design_concepts.xml
new file mode 100644
index 000000000..e6429ba4c
--- /dev/null
+++ b/libs/date_time/xmldoc/design_concepts.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.design_concepts">
+ <title>Design Concepts</title>
+
+ <para>
+ A large part of the genesis of this library has been the observation that few date-time libraries are built in a fashion that allows customization and extension. A typical example, the calendar logic is built directly into the date class. Or the clock retrieval functions are built directly into the time class. These design decisions usually make it impossible to extend or change the library behavior. At a more fundamental level, there are usually assumptions about the resolution of time representation or the gregorian calendar.
+ </para>
+ <para>
+ Often times, the result is that a project must settle for a less than complete library because of a requirement for high resolution time representation or other assumptions that do not match the implementation of the library. This is extremely unfortunate because development of a library of this sort is far from a trivial task.
+ </para>
+ <para>
+ While the design is far from perfect the current design is far more flexible than any date-time library the author is aware of. It is expected that the various aspects of extensibility will be better documented in future versions. Information about the design goals of the library is <link linkend="date_time.design_goals">summarized here</link>.
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/design_goals.xml b/libs/date_time/xmldoc/design_goals.xml
new file mode 100644
index 000000000..3e9000e03
--- /dev/null
+++ b/libs/date_time/xmldoc/design_goals.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.design_goals">
+ <title>Design Goals</title>
+
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Category</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Functions</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1">Interfaces</entry>
+ <entry>Provide concrete classes for manipulation of dates and times</entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>date, time, date_duration, time_duration, date_period, time_period, etc</listitem>
+ <listitem>support for infinity - positive infinity, negative infinity</listitem>
+ <listitem>iterators over time and date ranges</listitem>
+ <listitem>allow date and time implementations to be separate as much as possible</listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+ <row>
+ <entry valign="top" morerows="1">Calculation</entry>
+ <entry>Provide a basis for performing efficient time calculations </entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>days between dates </listitem>
+ <listitem>durations of times </listitem>
+ <listitem>durations of dates and times together </listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1">Representation Flexibility</entry>
+ <entry>Provide the maximum possible reusability and flexibility</entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>traits based customization of internal representations for size versus resolution control</listitem>
+ <listitem>Allowing the use of different epochs and resolution (eg: seconds versus microseconds, dates starting at the year 2000 versus dates starting in 1700)</listitem>
+ <listitem>Options for configuring unique calendar representations (Gregorian + others)</listitem>
+ <listitem>the use of Julian Day number and the conversion between this and the Gregorian/Julian calendar date</listitem>
+ <listitem>Allow for flexible adjustments including leap seconds</listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+
+ <row>
+ <entry valign="top" morerows="1">Date Calculations</entry>
+ <entry>Provide tools for date calculations</entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>provide basis for calculation of complex event specs like holidays</listitem>
+ <listitem>calendar to calendar conversions</listitem>
+ <listitem>provide for ability to extend to new calendar systems</listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1">Time Calculations</entry>
+ <entry>Provide concrete classes for manipulation of time</entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>provide the ability to handle cross time-zone issues</listitem>
+ <listitem>provide adjustments for daylight savings time (summer time)</listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1">Clock Interfaces</entry>
+ <entry>Provide classes for retrieving time current time</entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>access to a network / high resolution time sources </listitem>
+ <listitem>retrieving the current date time information to populate classes </listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1">I/O Interfaces</entry>
+ <entry>Provide input and output for time including</entry>
+ </row>
+ <row>
+ <entry>
+ <itemizedlist mark="bullet">
+ <listitem>multi-lingual support </listitem>
+ <listitem>provide ISO8601 compliant time facet </listitem>
+ <listitem>use I/O facets for different local behavior </listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</section>
diff --git a/libs/date_time/xmldoc/details.xml b/libs/date_time/xmldoc/details.xml
new file mode 100644
index 000000000..1eea179ee
--- /dev/null
+++ b/libs/date_time/xmldoc/details.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.details" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Details</title>
+
+ <xi:include href="calculations.xml" />
+ <xi:include href="design_goals.xml" />
+ <xi:include href="tradeoffs.xml" />
+ <xi:include href="terminology.xml" />
+ <xi:include href="references.xml" />
+ <xi:include href="buildinfo.xml" />
+ <xi:include href="tests.xml" />
+ <xi:include href="changes.xml" />
+ <xi:include href="acknowledgements.xml" />
+</section>
diff --git a/libs/date_time/xmldoc/domain_concepts.xml b/libs/date_time/xmldoc/domain_concepts.xml
new file mode 100644
index 000000000..9d6616e9f
--- /dev/null
+++ b/libs/date_time/xmldoc/domain_concepts.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.domain_concepts">
+ <title>Domain Concepts</title>
+
+ <para>
+ The date time domain is rich in terminology and problems.
+ The following is a brief introduction to the concepts you
+ will find reflected in the library.
+ </para>
+ <para>
+ The library supports 3 basic temporal types:
+ <itemizedlist mark="bullet">
+ <listitem>
+ <emphasis role="strong">Time Point</emphasis> -- Specifier
+ for a location in the time continuum.
+ </listitem>
+ <listitem>
+ <emphasis role="strong">Time Duration</emphasis> -- A
+ length of time unattached to any point on the time continuum.
+ </listitem>
+ <listitem>
+ <emphasis role="strong">Time Interval</emphasis> -- A duration
+ of time attached to a specific point in the time continuum.
+ Also known as a time period.
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Each of these temporal types has a <emphasis role="strong">Resolution</emphasis> which is defined by the smallest representable duration. A <emphasis role="strong">Time system</emphasis> provides all these categories of temporal types as well as the rules for labeling and calculating with time points. <emphasis role="strong">Calendar Systems</emphasis> are simply time systems with a maximum resolution of one day. The <emphasis role="strong">Gregorian</emphasis> system is the most widely used calendar system today (the ISO system is basically a derivative of this). However, there are many other calendar systems as well. <emphasis role="strong">UTC (Coordinated Universal Time)</emphasis> is a widely used civil time system. UTC is adjusted for earth rotation at longitude 0 by the use of leap seconds (This is not predictable, only as necessary). Most <emphasis role="strong">local time</emphasis> systems are based on UTC but are also adjusted for earth rotation so that daylight hours are similar everywhere. In addition, some local times include <emphasis role="strong">daylight savings time (DST)</emphasis> adjustments to shift the daylight hours during the summer.
+ </para>
+ <para>
+ A <emphasis role="strong">Clock Device</emphasis> is software component (tied to some hardware) that provides the current date or time with respect to a time system. A clock can measure the current time to a known resolution which may be higher or lower than a particular time representation.
+ </para>
+ <para>
+ The library provides support for calculating with dates and times. However, time calculations are not quite the same as calculating with integers. If you are serious about the accuracy of your time calculations need to read about <link linkend="date_time.tradeoffs">Stability, Predictability, and Approximations</link>.
+ </para>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem>
+ <link linkend="date_time.terminology">Basic Terminology</link>
+ </listitem>
+ <listitem>
+ <link linkend="date_time.calculations">Calculations</link>
+ </listitem>
+ <listitem>
+ <link linkend="date_time.tradeoffs">Stability, Predictability, and Approximations</link>
+ </listitem>
+ <listitem>
+ <link linkend="date_time.references">References</link>
+ </listitem>
+ </itemizedlist>
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/doxy.xml b/libs/date_time/xmldoc/doxy.xml
new file mode 100644
index 000000000..c12f24674
--- /dev/null
+++ b/libs/date_time/xmldoc/doxy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.doxy" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Library Reference</title>
+
+ <para>
+ The following is a detailed reference of the date_time library. A click on any of the reference links will take you to a list of the header files found in that section. Following one of those links will take you to a list of the items declared in that header file. Further sublinks take you to detailed descriptions of each individual item.
+ </para>
+
+ <xi:include href="date_time_autodoc.xml"/>
+ <xi:include href="gregorian_autodoc.xml"/>
+ <xi:include href="posix_time_autodoc.xml"/>
+ <xi:include href="local_time_autodoc.xml"/>
+</section>
+
diff --git a/libs/date_time/xmldoc/ex_calc_rules.xml b/libs/date_time/xmldoc/ex_calc_rules.xml
new file mode 100644
index 000000000..78889ef23
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_calc_rules.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.calc_rules">
+ <title>Daylight Savings Calc Rules</title>
+
+ <para>
+ Example of creating various Daylight Savings Calc Rule objects.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* A simple example for creating various dst_calc_rule instances
+ */
+
+ #include "boost/date_time/gregorian/gregorian.hpp"
+ #include "boost/date_time/local_time/local_time.hpp"
+ #include <iostream>
+
+ int
+ main()
+ {
+ using namespace boost;
+ using namespace local_time;
+ using namespace gregorian;
+
+ /***** create the necessary date_generator objects *****/
+ // starting generators
+ first_day_of_the_week_in_month fd_start(Sunday, May);
+ last_day_of_the_week_in_month ld_start(Sunday, May);
+ nth_day_of_the_week_in_month nkd_start(nth_day_of_the_week_in_month::third,
+ Sunday, May);
+ partial_date pd_start(1, May);
+ // ending generators
+ first_day_of_the_week_in_month fd_end(Sunday, Oct);
+ last_day_of_the_week_in_month ld_end(Sunday, Oct);
+ nth_day_of_the_week_in_month nkd_end(nth_day_of_the_week_in_month::third,
+ Sunday, Oct);
+ partial_date pd_end(31, Oct);
+
+ /***** create the various dst_calc_rule objects *****/
+ dst_calc_rule_ptr pdr(new partial_date_dst_rule(pd_start, pd_end));
+ dst_calc_rule_ptr flr(new first_last_dst_rule(fd_start, ld_end));
+ dst_calc_rule_ptr llr(new last_last_dst_rule(ld_start, ld_end));
+ dst_calc_rule_ptr nlr(new nth_last_dst_rule(nkd_start, ld_end));
+ dst_calc_rule_ptr ndr(new nth_day_of_the_week_in_month_dst_rule(nkd_start,
+ nkd_end));
+
+ return 0;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_date_period_calc.xml b/libs/date_time/xmldoc/ex_date_period_calc.xml
new file mode 100644
index 000000000..2c39345ff
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_date_period_calc.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.date_period_calc">
+ <title>Date Period Calculations</title>
+
+ <para>
+ Calculates if a date is in an 'irregular' collection of periods using period calculation functions.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /*
+ 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;
+
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_dates_as_strings.xml b/libs/date_time/xmldoc/ex_dates_as_strings.xml
new file mode 100644
index 000000000..d6a074f62
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_dates_as_strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.dates_as_strings">
+ <title>Dates as Strings</title>
+
+ <para>
+ Various parsing and output of strings.
+ </para>
+ <programlisting>
+ <![CDATA[
+
+ /* 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;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_days_alive.xml b/libs/date_time/xmldoc/ex_days_alive.xml
new file mode 100644
index 000000000..c940704a0
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_days_alive.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.days_alive">
+ <title>Days Alive</title>
+
+ <para>
+ Calculate the number of days you have been living using durations and dates.
+ </para>
+<programlisting>
+<literal>
+<phrase role="comment">/* 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.
+ */</phrase><phrase role="preprocessor">
+
+#include</phrase><phrase role="string"> &quot;boost/date_time/gregorian/gregorian.hpp&quot;</phrase><phrase role="preprocessor">
+#include</phrase><phrase role="special"> &lt;</phrase><phrase role="identifier">iostream</phrase><phrase role="special">&gt;</phrase><phrase role="keyword">
+
+int</phrase><phrase role="identifier">
+main</phrase><phrase role="special">()</phrase><phrase role="special">
+{</phrase><phrase role="keyword">
+
+ using</phrase><phrase role="keyword"> namespace</phrase><phrase role="identifier"> boost</phrase><phrase role="special">::</phrase><phrase role="identifier">gregorian</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">string</phrase><phrase role="identifier"> s</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;Enter birth day YYYY-MM-DD (eg: 2002-02-01): &quot;</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cin</phrase><phrase role="special"> &gt;&gt;</phrase><phrase role="identifier"> s</phrase><phrase role="special">;</phrase><phrase role="keyword">
+ try</phrase><phrase role="special"> {</phrase><phrase role="identifier">
+ date</phrase><phrase role="identifier"> birthday</phrase><phrase role="special">(</phrase><phrase role="identifier">from_simple_string</phrase><phrase role="special">(</phrase><phrase role="identifier">s</phrase><phrase role="special">));</phrase><phrase role="identifier">
+ date</phrase><phrase role="identifier"> today</phrase><phrase role="special"> =</phrase><phrase role="identifier"> day_clock</phrase><phrase role="special">::</phrase><phrase role="identifier">local_day</phrase><phrase role="special">();</phrase><phrase role="identifier">
+ days</phrase><phrase role="identifier"> days_alive</phrase><phrase role="special"> =</phrase><phrase role="identifier"> today</phrase><phrase role="special"> -</phrase><phrase role="identifier"> birthday</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ days</phrase><phrase role="identifier"> one_day</phrase><phrase role="special">(</phrase><phrase role="number">1</phrase><phrase role="special">);</phrase><phrase role="keyword">
+ if</phrase><phrase role="special"> (</phrase><phrase role="identifier">days_alive</phrase><phrase role="special"> ==</phrase><phrase role="identifier"> one_day</phrase><phrase role="special">)</phrase><phrase role="special"> {</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;Born yesterday, very funny&quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="special">
+ }</phrase><phrase role="keyword">
+ else</phrase><phrase role="keyword"> if</phrase><phrase role="special"> (</phrase><phrase role="identifier">days_alive</phrase><phrase role="special"> &lt;</phrase><phrase role="identifier"> days</phrase><phrase role="special">(</phrase><phrase role="number">0</phrase><phrase role="special">))</phrase><phrase role="special"> {</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;Not born yet, hmm: &quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> days_alive</phrase><phrase role="special">.</phrase><phrase role="identifier">days</phrase><phrase role="special">()</phrase><phrase role="special">
+ &lt;&lt;</phrase><phrase role="string"> &quot; days&quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="special">
+ }</phrase><phrase role="keyword">
+ else</phrase><phrase role="special"> {</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;Days alive: &quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> days_alive</phrase><phrase role="special">.</phrase><phrase role="identifier">days</phrase><phrase role="special">()</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="special">
+ }</phrase><phrase role="special">
+
+ }</phrase><phrase role="keyword">
+ catch</phrase><phrase role="special">(...)</phrase><phrase role="special"> {</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;Bad date entered: &quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> s</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="special">
+ }</phrase><phrase role="keyword">
+ return</phrase><phrase role="number"> 0</phrase><phrase role="special">;</phrase><phrase role="special">
+}</phrase>
+</literal>
+</programlisting>
+
+</section>
diff --git a/libs/date_time/xmldoc/ex_days_between_new_years.xml b/libs/date_time/xmldoc/ex_days_between_new_years.xml
new file mode 100644
index 000000000..91a236df7
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_days_between_new_years.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.days_between_new_year">
+ <title>Days Between New Years</title>
+
+ <para>
+ Calculate the number of days till new years
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* 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 366 (365 in a leap year).
+ */
+ #include <iostream>
+ #include "boost/date_time/gregorian/gregorian.hpp"
+
+ 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;
+ };
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_end_of_month_day.xml b/libs/date_time/xmldoc/ex_end_of_month_day.xml
new file mode 100644
index 000000000..d67dde7e5
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_end_of_month_day.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.end_of_month_day">
+ <title>End of the Months</title>
+
+ <para>
+ Iterates accross the remaining months in a given year, always landing on the last day of the month.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* 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;
+
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_find_last_day_of_months.xml b/libs/date_time/xmldoc/ex_find_last_day_of_months.xml
new file mode 100644
index 000000000..52f8c74fe
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_find_last_day_of_months.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.end_of_month_day">
+ <title>Last Day of the Months</title>
+
+ <para>
+ Example that gets a month and a year from the user and finds the last day of each remaining month of that year.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* 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;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_flight.xml b/libs/date_time/xmldoc/ex_flight.xml
new file mode 100644
index 000000000..98ec4c4e9
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_flight.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.flight">
+ <title>Flight Time Example</title>
+
+ <para>This example shows a program that calculates the arrival time of a plane that flys from Phoenix to New York. During the flight New York shifts into daylight savings time (Phoenix doesn't because Arizona doesn't use dst).</para>
+
+<programlisting>
+<literal>
+<phrase role="preprocessor">#include</phrase><phrase role="string"> &quot;boost/date_time/local_time/local_time.hpp&quot;</phrase><phrase role="preprocessor">
+#include</phrase><phrase role="special"> &lt;</phrase><phrase role="identifier">iostream</phrase><phrase role="special">&gt;</phrase><phrase role="comment">
+
+/* This example shows a program that calculates the arrival time of a plane
+ * that flys from Phoenix to New York. During the flight New York shifts
+ * into daylight savings time (Phoenix doesn't because Arizona doesn't use
+ * dst).
+ *
+ *
+ */</phrase><phrase role="keyword">
+
+int</phrase><phrase role="identifier"> main</phrase><phrase role="special">()</phrase><phrase role="special">
+{</phrase><phrase role="keyword">
+ using</phrase><phrase role="keyword"> namespace</phrase><phrase role="identifier"> boost</phrase><phrase role="special">::</phrase><phrase role="identifier">gregorian</phrase><phrase role="special">;</phrase><phrase role="keyword">
+ using</phrase><phrase role="keyword"> namespace</phrase><phrase role="identifier"> boost</phrase><phrase role="special">::</phrase><phrase role="identifier">local_time</phrase><phrase role="special">;</phrase><phrase role="keyword">
+ using</phrase><phrase role="keyword"> namespace</phrase><phrase role="identifier"> boost</phrase><phrase role="special">::</phrase><phrase role="identifier">posix_time</phrase><phrase role="special">;</phrase><phrase role="comment">
+
+
+ //setup some timezones for creating and adjusting local times
+ //This user editable file can be found in libs/date_time/data.
+</phrase><phrase role="identifier"> tz_database</phrase><phrase role="identifier"> tz_db</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ tz_db</phrase><phrase role="special">.</phrase><phrase role="identifier">load_from_file</phrase><phrase role="special">(</phrase><phrase role="string">&quot;date_time_zonespec.csv&quot;</phrase><phrase role="special">);</phrase><phrase role="identifier">
+ time_zone_ptr</phrase><phrase role="identifier"> nyc_tz</phrase><phrase role="special"> =</phrase><phrase role="identifier"> tz_db</phrase><phrase role="special">.</phrase><phrase role="identifier">time_zone_from_region</phrase><phrase role="special">(</phrase><phrase role="string">&quot;America/New_York&quot;</phrase><phrase role="special">);</phrase><phrase role="comment">
+ //Use a
+</phrase><phrase role="identifier"> time_zone_ptr</phrase><phrase role="identifier"> phx_tz</phrase><phrase role="special">(</phrase><phrase role="keyword">new</phrase><phrase role="identifier"> posix_time_zone</phrase><phrase role="special">(</phrase><phrase role="string">&quot;MST-07:00:00&quot;</phrase><phrase role="special">));</phrase><phrase role="comment">
+
+ //local departure time in phoenix is 11 pm on april 2 2005
+ // (ny changes to dst on apr 3 at 2 am)
+</phrase><phrase role="identifier"> local_date_time</phrase><phrase role="identifier"> phx_departure</phrase><phrase role="special">(</phrase><phrase role="identifier">date</phrase><phrase role="special">(</phrase><phrase role="number">2005</phrase><phrase role="special">,</phrase><phrase role="identifier"> Apr</phrase><phrase role="special">,</phrase><phrase role="number"> 2</phrase><phrase role="special">),</phrase><phrase role="identifier"> hours</phrase><phrase role="special">(</phrase><phrase role="number">23</phrase><phrase role="special">),</phrase><phrase role="identifier">
+ phx_tz</phrase><phrase role="special">,</phrase><phrase role="identifier">
+ local_date_time</phrase><phrase role="special">::</phrase><phrase role="identifier">NOT_DATE_TIME_ON_ERROR</phrase><phrase role="special">);</phrase><phrase role="identifier">
+
+ time_duration</phrase><phrase role="identifier"> flight_length</phrase><phrase role="special"> =</phrase><phrase role="identifier"> hours</phrase><phrase role="special">(</phrase><phrase role="number">4</phrase><phrase role="special">)</phrase><phrase role="special"> +</phrase><phrase role="identifier"> minutes</phrase><phrase role="special">(</phrase><phrase role="number">30</phrase><phrase role="special">);</phrase><phrase role="identifier">
+ local_date_time</phrase><phrase role="identifier"> phx_arrival</phrase><phrase role="special"> =</phrase><phrase role="identifier"> phx_departure</phrase><phrase role="special"> +</phrase><phrase role="identifier"> flight_length</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ local_date_time</phrase><phrase role="identifier"> nyc_arrival</phrase><phrase role="special"> =</phrase><phrase role="identifier"> phx_arrival</phrase><phrase role="special">.</phrase><phrase role="identifier">local_time_in</phrase><phrase role="special">(</phrase><phrase role="identifier">nyc_tz</phrase><phrase role="special">);</phrase><phrase role="identifier">
+
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;departure phx time: &quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> phx_departure</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;arrival phx time: &quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> phx_arrival</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="identifier">
+ std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="string"> &quot;arrival nyc time: &quot;</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> nyc_arrival</phrase><phrase role="special"> &lt;&lt;</phrase><phrase role="identifier"> std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase><phrase role="special">
+
+}</phrase>
+</literal>
+</programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_local_utc_conversion.xml b/libs/date_time/xmldoc/ex_local_utc_conversion.xml
new file mode 100644
index 000000000..61c8afe5b
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_local_utc_conversion.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.local_utc_conversion">
+ <title>Local to UTC Conversion</title>
+
+ <para>
+ Demonstrate utc to local and local to utc calculations including dst.
+ </para>
+ <programlisting>
+ <![CDATA[
+
+ /* Demonstrate conversions between a local time and utc
+ * Output:
+ *
+ * UTC <--> New York while DST is NOT active (5 hours)
+ * 2001-Dec-31 19:00:00 in New York is 2002-Jan-01 00:00:00 UTC time
+ * 2002-Jan-01 00:00:00 UTC is 2001-Dec-31 19:00:00 New York time
+ *
+ * UTC <--> New York while DST is active (4 hours)
+ * 2002-May-31 20:00:00 in New York is 2002-Jun-01 00:00:00 UTC time
+ * 2002-Jun-01 00:00:00 UTC is 2002-May-31 20:00:00 New York time
+ *
+ * UTC <--> Arizona (7 hours)
+ * 2002-May-31 17:00:00 in Arizona is 2002-Jun-01 00:00:00 UTC time
+ */
+
+ #include "boost/date_time/posix_time/posix_time.hpp"
+ #include "boost/date_time/local_time_adjustor.hpp"
+ #include "boost/date_time/c_local_time_adjustor.hpp"
+ #include <iostream>
+
+ int
+ main()
+ {
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ //This local adjustor depends on the machine TZ settings-- highly dangerous!
+ typedef boost::date_time::c_local_adjustor<ptime> local_adj;
+ ptime t10(date(2002,Jan,1), hours(7));
+ ptime t11 = local_adj::utc_to_local(t10);
+ std::cout << "UTC <--> Zone base on TZ setting" << std::endl;
+ std::cout << to_simple_string(t11) << " in your TZ is "
+ << to_simple_string(t10) << " UTC time "
+ << std::endl;
+ time_duration td = t11 - t10;
+ std::cout << "A difference of: "
+ << to_simple_string(td) << std::endl;
+
+
+ //eastern timezone is utc-5
+ typedef boost::date_time::local_adjustor<ptime, -5, us_dst> us_eastern;
+
+ ptime t1(date(2001,Dec,31), hours(19)); //5 hours b/f midnight NY time
+
+ std::cout << "\nUTC <--> New York while DST is NOT active (5 hours)"
+ << std::endl;
+ ptime t2 = us_eastern::local_to_utc(t1);
+ std::cout << to_simple_string(t1) << " in New York is "
+ << to_simple_string(t2) << " UTC time "
+ << std::endl;
+
+ ptime t3 = us_eastern::utc_to_local(t2);//back should be the same
+ std::cout << to_simple_string(t2) << " UTC is "
+ << to_simple_string(t3) << " New York time "
+ << "\n\n";
+
+ ptime t4(date(2002,May,31), hours(20)); //4 hours b/f midnight NY time
+ std::cout << "UTC <--> New York while DST is active (4 hours)" << std::endl;
+ ptime t5 = us_eastern::local_to_utc(t4);
+ std::cout << to_simple_string(t4) << " in New York is "
+ << to_simple_string(t5) << " UTC time "
+ << std::endl;
+
+ ptime t6 = us_eastern::utc_to_local(t5);//back should be the same
+ std::cout << to_simple_string(t5) << " UTC is "
+ << to_simple_string(t6) << " New York time "
+ << "\n" << std::endl;
+
+
+ //Arizona timezone is utc-7 with no dst
+ typedef boost::date_time::local_adjustor<ptime, -7, no_dst> us_arizona;
+
+ ptime t7(date(2002,May,31), hours(17));
+ std::cout << "UTC <--> Arizona (7 hours)" << std::endl;
+ ptime t8 = us_arizona::local_to_utc(t7);
+ std::cout << to_simple_string(t7) << " in Arizona is "
+ << to_simple_string(t8) << " UTC time "
+ << std::endl;
+
+ return 0;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_localization.xml b/libs/date_time/xmldoc/ex_localization.xml
new file mode 100644
index 000000000..2fb872e18
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_localization.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.localization">
+ <title>Localization Demonstration</title>
+
+ <para>
+ The boost::date_time library provides the ability to create customized locale facets. Date ordering, language, seperators, and abbreviations can be customized.
+ </para>
+ <!-- <para>
+ This example uses the new (as of 1.33) date_time IO code. An example using the old code is also provided to demonstrate how much easier customized output is (see <link linkend="date_time.examples.legacy_localization">legacy_localization example</link>).
+ </para> -->
+ <programlisting>
+ <![CDATA[
+ /* 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;
+
+ }
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_meeting_planner.xml b/libs/date_time/xmldoc/ex_meeting_planner.xml
new file mode 100644
index 000000000..a838a1e4c
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_meeting_planner.xml
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.meeting_planner">
+ <title>Teleconference Scheduler (partial listing)</title>
+
+ <para>
+ The Teleconference Scheduler is a Qt based example (found in the examples/qt directory). Partial listings of <link linkend="meeting_planner_hpp">meeting_planner.hpp</link> and <link linkend="planner_form_cpp">planner_form.cpp</link> are provided to illustrate techniques for using the local_date_time and tz_database objects.
+ </para>
+
+ <anchor id="planner_form_cpp" />
+ <para>
+ The planner_form class is derived from a QDialog. This listing illustrates the initialization of a tz_database object and using it to populate combo boxes with region lists. Only the init function is listed here for the sake of brevity.
+ </para>
+ <programlisting>
+ <![CDATA[
+
+ void planner_form::init() {
+ try{
+ tz_db.load_from_file("../../data/date_time_zonespec.csv");
+ }catch(boost::local_time::data_not_accessible dna) {
+ std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }catch(boost::local_time::bad_field_count bfc) {
+ std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }
+
+ // populate combo boxes with region names
+ typedef std::vector<std::string> vect;
+ vect regions = tz_db.region_list();
+ vect::const_iterator itr = regions.begin();
+ while(itr != regions.end()) {
+ comboBox1->insertItem(*itr);
+ comboBox2->insertItem(*itr);
+ comboBox3->insertItem(*itr);
+ ++itr;
+ }
+ comboBox1->insertItem("<Select Region>", 0);
+ comboBox2->insertItem("<Select Region>", 0);
+ comboBox3->insertItem("<Select Region>", 0);
+
+ // set up dateEdit
+ dateEdit2->setSeparator("-");
+
+ this->reset();
+ }
+
+ ]]>
+ </programlisting>
+
+ <anchor id="meeting_planner_hpp" />
+ <para>
+ This class coordinates local times across multiple time zones. It accomplishes this by iterating across a collection of time zones and verifying that the target time falls within a set period (a workday).
+ </para>
+ <programlisting>
+ <![CDATA[
+
+ /* The heart of the meeting_planner is the synchronization of different
+ * time zones to a single point in time.
+ * The class takes a vector of regions and a date. The default time
+ * range is 9am to 5pm but can be changed.
+ * The resulting time specs are returned as a vector of strings
+ */
+
+
+ #include "boost/date_time/gregorian/gregorian.hpp"
+ #include "boost/date_time/posix_time/posix_time.hpp"
+ #include "boost/date_time/local_time/local_time.hpp"
+ #include "boost/shared_ptr.hpp"
+ #include <string>
+ #include <vector>
+ #include <locale>
+
+ using namespace boost;
+ using namespace local_time;
+ using namespace posix_time;
+
+ //! Coordinates meeting times accounting for time zone differences
+ class meeting_planner {
+ public:
+ typedef std::vector<shared_ptr<time_zone_base> > vector_type;
+ // a multimap is used so time_zones can be sorted according to utc_offset
+ typedef std::multimap<posix_time::time_duration, shared_ptr<time_zone_base> > zone_map_type;
+ typedef std::vector<std::string> result_type;
+
+ meeting_planner(const gregorian::date& d, const vector_type& v)
+ : l_time(posix_time::not_a_date_time, shared_ptr<time_zone_base>()),
+ workday(ptime(d,hours(9)), time_duration(8,0,0,1))
+ {
+ vector_type::const_iterator iter = v.begin();
+ while(iter != v.end()) {
+ time_duration offset(0,0,0);
+ if(*iter == NULL) {
+ offset = hours(0);
+ }
+ else{
+ // null pointers may wind up in the vector
+ // TODO: this should be fixed in tz_database
+ offset = (*iter)->base_utc_offset();
+ }
+ zones.insert(zone_map_type::value_type(offset, *iter));
+ ++iter;
+ }
+
+ // set l_time to noon UTC
+ l_time = local_date_time(posix_time::ptime(d, posix_time::hours(12)),
+ shared_ptr<time_zone_base>());
+ }
+
+ //! Changes range of valid meeting times (ie. The hours in a workday) times are inclusive
+ void change_range(const time_duration& start, const time_duration& end)
+ {
+ ptime pt(l_time.date(), start);
+ // add one unit to make the give times inclusive
+ workday = time_period(pt, (end - start) + time_duration::unit());
+ }
+
+ //! strings returned in the form of "yyyy-Mon-dd: hh:mm Zzz [repeat]"
+ result_type coordinate_time() const
+ {
+ using namespace posix_time;
+
+ result_type result;
+ bool flag = true;
+ std::stringstream ss;
+ ss.str("");
+
+ // set the output format for local_date_time to only give
+ // time_of_day & zone offset
+ typedef boost::date_time::time_facet<local_date_time, char> ldt_facet;
+ ldt_facet* timefacet = new ldt_facet("%H:%M (%q)");
+ std::locale loc(std::locale::classic(), timefacet);
+ ss.imbue(loc);
+
+ // backup a full day and start iterating from there
+ // I went overkill because I've got no decent
+ // algorithm to set a starting point (yet)
+ local_date_time tmp = l_time - gregorian::days(1);
+ zone_map_type::const_iterator iter;
+ for(int i = 0; i < 48; ++i) {
+ iter = zones.begin();
+ flag = true;
+ tmp += posix_time::hours(1);
+
+ while(iter != zones.end() && flag) {
+ if(!workday.contains(tmp.local_time_in(iter->second).local_time())) {
+ flag = false;
+ }
+ ++iter;
+ }
+
+ if(flag) {
+ iter = zones.begin();
+ ss << tmp.date() << ':';
+ while(iter != zones.end()) {
+ ss << ' ' << tmp.local_time_in(iter->second);
+ ++iter;
+ if(iter != zones.end()) {
+ ss << ',';
+ }
+ }
+ result.push_back(ss.str());
+ ss.str("");
+ }
+ }
+ if(result.empty()) {
+ result.push_back("Scheduling within the time period given is not possible for these time zones.");
+ }
+ return result;
+ }
+
+ private:
+ zone_map_type zones;
+ local_date_time l_time;
+ time_period workday;
+ };
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_month_add.xml b/libs/date_time/xmldoc/ex_month_add.xml
new file mode 100644
index 000000000..544fa41eb
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_month_add.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.month_add">
+ <title>Month Adding</title>
+
+ <para>
+ Adding a month to a day without the use of iterators.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* Simple program that uses the gregorian calendar to progress by exactly
+ * one month, irregardless 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();
+ add_month mf(1);
+ date d2 = d + mf.get_offset(d);
+ std::cout << "Today is: " << to_simple_string(d) << ".\n"
+ << "One month from today will be: " << to_simple_string(d2)
+ << std::endl;
+
+ return 0;
+ }
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_print_holidays.xml b/libs/date_time/xmldoc/ex_print_holidays.xml
new file mode 100644
index 000000000..5ae64437a
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_print_holidays.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.print_holidays">
+ <title>Print Holidays</title>
+
+ <para>
+ This is an example of using functors to define a holiday schedule
+ </para>
+ <programlisting>
+ <![CDATA[
+
+ /* 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;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_print_hours.xml b/libs/date_time/xmldoc/ex_print_hours.xml
new file mode 100644
index 000000000..3fe4cc4d7
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_print_hours.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.print_hours">
+ <title>Print Hours</title>
+
+ <para>
+ Demonstrate time iteration, clock retrieval, and simple calculation.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* Print the remaining hours of the day
+ * Uses the clock to get the local time
+ * Use an iterator to iterate over the remaining hours
+ * Retrieve the date part from a time
+ *
+ * Expected Output something like:
+ *
+ * 2002-Mar-08 16:30:59
+ * 2002-Mar-08 17:30:59
+ * 2002-Mar-08 18:30:59
+ * 2002-Mar-08 19:30:59
+ * 2002-Mar-08 20:30:59
+ * 2002-Mar-08 21:30:59
+ * 2002-Mar-08 22:30:59
+ * 2002-Mar-08 23:30:59
+ * Time left till midnight: 07:29:01
+ */
+
+ #include "boost/date_time/posix_time/posix_time.hpp"
+ #include <iostream>
+
+ int
+ main()
+ {
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ //get the current time from the clock -- one second resolution
+ ptime now = second_clock::local_time();
+ //Get the date part out of the time
+ date today = now.date();
+ date tommorrow = today + days(1);
+ ptime tommorrow_start(tommorrow); //midnight
+
+ //iterator adds by one hour
+ time_iterator titr(now,hours(1));
+ for (; titr < tommorrow_start; ++titr) {
+ std::cout << to_simple_string(*titr) << std::endl;
+ }
+
+ time_duration remaining = tommorrow_start - now;
+ std::cout << "Time left till midnight: "
+ << to_simple_string(remaining) << std::endl;
+ return 0;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_print_month.xml b/libs/date_time/xmldoc/ex_print_month.xml
new file mode 100644
index 000000000..2cca27eea
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_print_month.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.print_month">
+ <title>Print Month</title>
+
+ <para>
+ Simple utility to print out days of the month with the days of a month. Demontstrates date iteration (date_time::date_itr).
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* 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() << "]"
+ << std::endl;
+ }
+ }
+ catch(std::exception& e) {
+
+ std::cout << "Error bad date, check your entry: \n"
+ << " Details: " << e.what() << std::endl;
+ }
+ return 0;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_seconds_since_epoch.xml b/libs/date_time/xmldoc/ex_seconds_since_epoch.xml
new file mode 100644
index 000000000..b9920e74b
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_seconds_since_epoch.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.seconds_since_epoch">
+ <title>Seconds Since Epoch</title>
+
+ <para>
+ Example of calculating seconds elapsed since epoch (1970-Jan-1) using local_date_time.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* This example demonstrates the use of the time zone database and
+ * local time to calculate the number of seconds since the UTC
+ * time_t epoch 1970-01-01 00:00:00. Note that the selected timezone
+ * could be any timezone supported in the time zone database file which
+ * can be modified and updated as needed by the user.
+ *
+ * To solve this problem the following steps are required:
+ * 1) Get a timezone from the tz database for the local time
+ * 2) Construct a local time using the timezone
+ * 3) Construct a posix_time::ptime for the time_t epoch time
+ * 4) Convert the local_time to utc and subtract the epoch time
+ *
+ */
+
+ #include "boost/date_time/local_time/local_time.hpp"
+ #include <iostream>
+
+ int main()
+ {
+ using namespace boost::gregorian;
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+
+ tz_database tz_db;
+ try {
+ tz_db.load_from_file("../data/date_time_zonespec.csv");
+ }catch(data_not_accessible dna) {
+ std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }catch(bad_field_count bfc) {
+ std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
+ exit(EXIT_FAILURE);
+ }
+
+ time_zone_ptr nyc_tz = tz_db.time_zone_from_region("America/New_York");
+ date in_date(2004,10,04);
+ time_duration td(12,14,32);
+ // construct with local time value
+ // create not-a-date-time if invalid (eg: in dst transition)
+ local_date_time nyc_time(in_date,
+ td,
+ nyc_tz,
+ local_date_time::NOT_DATE_TIME_ON_ERROR);
+
+ std::cout << nyc_time << std::endl;
+
+ ptime time_t_epoch(date(1970,1,1));
+ std::cout << time_t_epoch << std::endl;
+
+ // first convert nyc_time to utc via the utc_time()
+ // call and subtract the ptime.
+ time_duration diff = nyc_time.utc_time() - time_t_epoch;
+
+ //Expected 1096906472
+ std::cout << "Seconds diff: " << diff.total_seconds() << std::endl;
+
+ }
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_simple_time_zone.xml b/libs/date_time/xmldoc/ex_simple_time_zone.xml
new file mode 100644
index 000000000..e95b31657
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_simple_time_zone.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.simple_time_zone">
+ <title>Simple Time Zones</title>
+
+ <para>
+ Example usage of custom_time_zone as well as posix_time_zone.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* A simple example for using a custom_time_zone and a posix_time_zone.
+ */
+
+ #include "boost/date_time/local_time/local_time.hpp"
+ #include <iostream>
+
+ int
+ main()
+ {
+ using namespace boost;
+ using namespace local_time;
+ using namespace gregorian;
+ using posix_time::time_duration;
+
+ /***** custom_time_zone *****/
+
+ // create the dependent objects for a custom_time_zone
+ time_zone_names tzn("Eastern Standard Time", "EST",
+ "Eastern Daylight Time", "EDT");
+ time_duration utc_offset(-5,0,0);
+ dst_adjustment_offsets adj_offsets(time_duration(1,0,0),
+ time_duration(2,0,0),
+ time_duration(2,0,0));
+ // rules for this zone are:
+ // start on first Sunday of April at 2 am
+ // end on last Sunday of October at 2 am
+ // so we use a first_last_dst_rule
+ first_day_of_the_week_in_month start_rule(Sunday, Apr);
+ last_day_of_the_week_in_month end_rule(Sunday, Oct);
+ shared_ptr<dst_calc_rule> nyc_rules(new first_last_dst_rule(start_rule,
+ end_rule));
+ // create more dependent objects for a non-dst custom_time_zone
+ time_zone_names tzn2("Mountain Standard Time", "MST",
+ "", ""); // no dst means empty dst strings
+ time_duration utc_offset2(-7,0,0);
+ dst_adjustment_offsets adj_offsets2(time_duration(0,0,0),
+ time_duration(0,0,0),
+ time_duration(0,0,0));
+ // no dst means we need a null pointer to the rules
+ shared_ptr<dst_calc_rule> phx_rules;
+
+ // create the custom_time_zones
+ time_zone_ptr nyc_1(new custom_time_zone(tzn, utc_offset,
+ adj_offsets, nyc_rules));
+ time_zone_ptr phx_1(new custom_time_zone(tzn2, utc_offset2,
+ adj_offsets2, phx_rules));
+
+ /***** posix_time_zone *****/
+
+ // create posix_time_zones that are the duplicates of the
+ // custom_time_zones created above. See posix_time_zone documentation
+ // for details on full zone names.
+ std::string nyc_string, phx_string;
+ nyc_string = "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00";
+ // nyc_string = "EST-05EDT,M4.1.0,M10.5.0"; // shorter when defaults used
+ phx_string = "MST-07"; // no-dst
+ time_zone_ptr nyc_2(new posix_time_zone(nyc_string));
+ time_zone_ptr phx_2(new posix_time_zone(phx_string));
+
+
+ /***** show the sets are equal *****/
+
+ std::cout << "The first zone is in daylight savings from:\n "
+ << nyc_1->dst_local_start_time(2004) << " through "
+ << nyc_1->dst_local_end_time(2004) << std::endl;
+
+ std::cout << "The second zone is in daylight savings from:\n "
+ << nyc_2->dst_local_start_time(2004) << " through "
+ << nyc_2->dst_local_end_time(2004) << std::endl;
+
+ std::cout << "The third zone (no daylight savings):\n "
+ << phx_1->std_zone_abbrev() << " and "
+ << phx_1->base_utc_offset() << std::endl;
+
+ std::cout << "The fourth zone (no daylight savings):\n "
+ << phx_2->std_zone_abbrev() << " and "
+ << phx_2->base_utc_offset() << std::endl;
+
+ return 0;
+ }
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_time_math.xml b/libs/date_time/xmldoc/ex_time_math.xml
new file mode 100644
index 000000000..84130ea5b
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_time_math.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.time_math">
+ <title>Time Math</title>
+
+ <para>
+ Various types of calculations with times and time durations.
+ </para>
+ <programlisting>
+ <![CDATA[
+ /* Some simple examples of constructing and calculating with times
+ * Output:
+ * 2002-Feb-01 00:00:00 - 2002-Feb-01 05:04:02.001000000 = -5:04:02.001000000
+ */
+
+ #include "boost/date_time/posix_time/posix_time.hpp"
+ #include <iostream>
+
+ int
+ main()
+ {
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date d(2002,Feb,1); //an arbitrary date
+ //construct a time by adding up some durations durations
+ ptime t1(d, hours(5)+minutes(4)+seconds(2)+millisec(1));
+ //construct a new time by subtracting some times
+ ptime t2 = t1 - hours(5)- minutes(4)- seconds(2)- millisec(1);
+ //construct a duration by taking the difference between times
+ time_duration td = t2 - t1;
+
+ std::cout << to_simple_string(t2) << " - "
+ << to_simple_string(t1) << " = "
+ << to_simple_string(td) << std::endl;
+
+ return 0;
+ }
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/ex_time_periods.xml b/libs/date_time/xmldoc/ex_time_periods.xml
new file mode 100644
index 000000000..e3e80a41a
--- /dev/null
+++ b/libs/date_time/xmldoc/ex_time_periods.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.time_periods">
+ <title>Time Periods</title>
+
+ <para>
+ Demonstrate some simple uses of time periods.
+ </para>
+ <programlisting>
+ <![CDATA[
+
+ /* Some simple examples of constructing and calculating with times
+ * Returns:
+ * [2002-Feb-01 00:00:00/2002-Feb-01 23:59:59.999999999]
+ * contains 2002-Feb-01 03:00:05
+ * [2002-Feb-01 00:00:00/2002-Feb-01 23:59:59.999999999]
+ * intersected with
+ * [2002-Feb-01 00:00:00/2002-Feb-01 03:00:04.999999999]
+ * is
+ * [2002-Feb-01 00:00:00/2002-Feb-01 03:00:04.999999999]
+ */
+
+ #include "boost/date_time/posix_time/posix_time.hpp"
+ #include <iostream>
+
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ //Create a simple period class to contain all the times in a day
+ class day_period : public time_period
+ {
+ public:
+ day_period(date d) : time_period(ptime(d),//midnight
+ ptime(d,hours(24)))
+ {}
+
+ };
+
+ int
+ main()
+ {
+
+ date d(2002,Feb,1); //an arbitrary date
+ //a period that represents a day
+ day_period dp(d);
+ ptime t(d, hours(3)+seconds(5)); //an arbitray time on that day
+ if (dp.contains(t)) {
+ std::cout << to_simple_string(dp) << " contains "
+ << to_simple_string(t) << std::endl;
+ }
+ //a period that represents part of the day
+ time_period part_of_day(ptime(d, hours(0)), t);
+ //intersect the 2 periods and print the results
+ if (part_of_day.intersects(dp)) {
+ time_period result = part_of_day.intersection(dp);
+ std::cout << to_simple_string(dp) << " intersected with\n"
+ << to_simple_string(part_of_day) << " is \n"
+ << to_simple_string(result) << std::endl;
+ }
+
+
+ return 0;
+ }
+
+ ]]>
+ </programlisting>
+</section>
diff --git a/libs/date_time/xmldoc/examples.xml b/libs/date_time/xmldoc/examples.xml
new file mode 100644
index 000000000..eff314b2c
--- /dev/null
+++ b/libs/date_time/xmldoc/examples.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Examples</title>
+
+ <!-- gregorian examples -->
+ <xi:include href="ex_dates_as_strings.xml"/>
+ <xi:include href="ex_days_alive.xml"/>
+ <xi:include href="ex_days_between_new_years.xml"/>
+ <xi:include href="ex_find_last_day_of_months.xml"/>
+ <xi:include href="ex_localization.xml"/>
+ <!-- <xi:include href="ex_legacy_localization.xml"/> -->
+ <xi:include href="ex_date_period_calc.xml"/>
+ <xi:include href="ex_print_holidays.xml"/>
+ <xi:include href="ex_print_month.xml"/>
+ <xi:include href="ex_month_add.xml"/>
+ <!-- posix_time examples -->
+ <xi:include href="ex_time_math.xml"/>
+ <xi:include href="ex_print_hours.xml"/>
+ <xi:include href="ex_local_utc_conversion.xml"/>
+ <xi:include href="ex_time_periods.xml"/>
+ <!-- local_time examples -->
+ <xi:include href="ex_simple_time_zone.xml"/>
+ <xi:include href="ex_calc_rules.xml"/>
+ <xi:include href="ex_flight.xml"/>
+ <xi:include href="ex_seconds_since_epoch.xml"/>
+</section>
diff --git a/libs/date_time/xmldoc/exclusive_date_time.xml b/libs/date_time/xmldoc/exclusive_date_time.xml
new file mode 100644
index 000000000..3c4f9ba5a
--- /dev/null
+++ b/libs/date_time/xmldoc/exclusive_date_time.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE boostbook PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2006 CrystalClear Software, Inc.
+ 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)
+-->
+
+
+<boostbook xmlns:xi="http://www.w3.org/2001/XInclude"
+ last-revision="$Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $">
+ <title>The Boost Date Time Library</title>
+ <xi:include href="./date_time.xml"/>
+</boostbook>
diff --git a/libs/date_time/xmldoc/format_flags.xml b/libs/date_time/xmldoc/format_flags.xml
new file mode 100644
index 000000000..80555b8f2
--- /dev/null
+++ b/libs/date_time/xmldoc/format_flags.xml
@@ -0,0 +1,519 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.format_flags">
+ <title>Format Flags</title>
+
+ <para>Many of the format flags this new system uses for output are those used by <code>strftime(...)</code>, but not all. Some new flags have been added, and others overridden. The input system supports only specific flags, therefore, not all flags that work for output will work with input (we are currently working to correct this situation).</para>
+
+ <para>The following tables list the all the flags available for both date_time IO as well as strftime. Format flags marked with a single asterisk (*) have a behavior unique to date_time. Those flags marked with an exclamation point (!) are not usable for input (at this time). The flags marked with a hash sign (#) are implemented by system locale and are known to be missing on some platforms. The first table is for dates, and the second table is for times.
+ </para>
+
+ <para>
+ <anchor id="date_time_io.date_format_flags" />
+ Date Facet Format Flags
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Format Specifier</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>%a</screen></entry>
+ <entry>Abbreviated weekday name</entry>
+ </row>
+ <row>
+ <entry><screen>"Mon" => Monday</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%A</screen></entry>
+ <entry>Long weekday name</entry>
+ </row>
+ <row>
+ <entry><screen>"Monday"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%b</screen></entry>
+ <entry>Abbreviated month name</entry>
+ </row>
+ <row>
+ <entry><screen>"Feb" => February</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%B</screen></entry>
+ <entry>Full month name</entry>
+ </row>
+ <row>
+ <entry><screen>"February"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%c !</screen></entry>
+ <entry>The preferred date and time representation for the current locale.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%C !#</screen></entry>
+ <entry>The century number (year/100) as a 2-digit integer.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%d</screen></entry>
+ <entry>Day of the month as decimal 01 to 31</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%D !#</screen></entry>
+ <entry>Equivalent to %m/%d/%y</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%e #</screen></entry>
+ <entry>Like %d, the day of the month as a decimal number, but a leading zero is replaced by a space</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%G !</screen></entry>
+ <entry>This has the same format and value as %y, except that if the ISO week number belongs to the previous or next year, that year is used instead.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%g !</screen></entry>
+ <entry>Like %G, but without century.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%h !#</screen></entry>
+ <entry> Equivalent to %b</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%j</screen></entry>
+ <entry>Day of year as decimal from 001 to 366 for leap years, 001 - 365 for non-leap years.</entry>
+ </row>
+ <row>
+ <entry><screen>"060" => Feb-29</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%m</screen></entry>
+ <entry>Month name as a decimal 01 to 12</entry>
+ </row>
+ <row>
+ <entry><screen>"01" => January</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%u !</screen></entry>
+ <entry>The day of the week as a decimal, range 1 to 7, Monday being 1.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%U</screen></entry>
+ <entry>The week number of the current year as a decimal number, range 00 to 53, starting with the first Sunday as the first day of week 01. In 2005, Jan 1st falls on a Saturday, so therefore it falls within week 00 of 2005 (week 00 spans 2004-Dec-26 to 2005-Jan-01. This also happens to be week 53 of 2004).</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2005, Jan, 1); // Saturday
+// with format %U
+ss &lt;&lt; d; // "00"
+d += day(1); // Sunday
+ss &lt;&lt; d; // "01" beginning of week 1</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%V !#</screen></entry>
+ <entry>The ISO 8601:1988 week number of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4 days in the current year, and with Monday as the first day of the week.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%w</screen></entry>
+ <entry>Weekday as decimal number 0 to 6</entry>
+ </row>
+ <row>
+ <entry><screen>"0" => Sunday</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%W</screen></entry>
+ <entry>Week number 00 to 53 where Monday is first day of week 1</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2005, Jan, 2); // Sunday
+// with format %W
+ss &lt;&lt; d; // "00"
+d += day(1); // Monday
+ss &lt;&lt; d; // "01" beginning of week 1</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%x</screen></entry>
+ <entry>Implementation defined date format from the locale.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2005,Oct,31);
+date_facet* f = new date_facet("%x");
+
+locale loc = locale(locale("en_US"), f);
+cout.imbue(loc);
+cout &lt;&lt; d; // "10/31/2005"
+
+loc = locale(locale("de_DE"), f);
+cout.imbue(loc);
+cout &lt;&lt; d; // "31.10.2005"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%y</screen></entry>
+ <entry>Two digit year</entry>
+ </row>
+ <row>
+ <entry><screen>"05" => 2005</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y</screen></entry>
+ <entry>Four digit year</entry>
+ </row>
+ <row>
+ <entry><screen>"2005"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y-%b-%d</screen></entry>
+ <entry>Default date format</entry>
+ </row>
+ <row>
+ <entry><screen>"2005-Apr-01"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y%m%d</screen></entry>
+ <entry>ISO format</entry>
+ </row>
+ <row>
+ <entry><screen>"20050401"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y-%m-%d</screen></entry>
+ <entry>ISO extended format</entry>
+ </row>
+ <row>
+ <entry><screen>"2005-04-01"</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <anchor id="date_time_io.time_format_flags" />
+ Time Facet Format Flags
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Format Specifier</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>%- *!</screen></entry>
+ <entry>Placeholder for the sign of a duration. Only displays when the duration is negative.</entry>
+ </row>
+ <row>
+ <entry><screen>"-13:15:16"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%+ *!</screen></entry>
+ <entry>Placeholder for the sign of a duration. Always displays for both positive and negative.</entry>
+ </row>
+ <row>
+ <entry><screen>"+13:15:16"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%f</screen></entry>
+ <entry>Fractional seconds are always used, even when their value is zero</entry>
+ </row>
+ <row>
+ <entry><screen>"13:15:16.000000"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%F *</screen></entry>
+ <entry>Fractional seconds are used only when their value is not zero.</entry>
+ </row>
+ <row>
+ <entry><screen>"13:15:16"
+"05:04:03.001234"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%H</screen></entry>
+ <entry>The hour as a decimal number using a 24-hour clock (range 00 to 23).</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%I !</screen></entry>
+ <entry>The hour as a decimal number using a 12-hour clock (range 01 to 12).</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%k !</screen></entry>
+ <entry>The hour (24-hour clock) as a decimal number (range 0 to 23); single digits are preceded by a blank.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%l !</screen></entry>
+ <entry>The hour (12-hour clock) as a decimal number (range 1 to 12); single digits are preceded by a blank.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%M</screen></entry>
+ <entry>The minute as a decimal number (range 00 to 59).</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%O</screen></entry>
+ <entry>The number of hours in a time duration as a decimal number (range 0 to max. representable duration); single digits are preceded by a zero.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%p !</screen></entry>
+ <entry>Either `AM' or `PM' according to the given time value, or the corresponding strings for the current locale.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%P !#</screen></entry>
+ <entry>Like %p but in lowercase: `am' or `pm' or a corresponding string for the current locale.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%r !#</screen></entry>
+ <entry>The time in a.m. or p.m. notation. In the POSIX locale this is equivalent to `%I:%M:%S %p'</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%R !</screen></entry>
+ <entry>The time in 24-hour notation (%H:%M)</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%s *</screen></entry>
+ <entry>Seconds with fractional seconds.</entry>
+ </row>
+ <row>
+ <entry><screen>"59.000000"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%S</screen></entry>
+ <entry>Seconds only</entry>
+ </row>
+ <row>
+ <entry><screen>"59"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%T !</screen></entry>
+ <entry>The time in 24-hour notation (%H:%M:%S)</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%q</screen></entry>
+ <entry>ISO time zone (output only). This flag is ignored when using the time_facet with a ptime.</entry>
+ </row>
+ <row>
+ <entry><screen>"-0700" // Mountain Standard Time</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Q</screen></entry>
+ <entry>ISO extended time zone (output only). This flag is ignored when using the time_facet with a ptime.</entry>
+ </row>
+ <row>
+ <entry><screen>"-05:00" // Eastern Standard Time</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%z *!</screen></entry>
+ <entry>Abbreviated time zone (output only). This flag is ignored when using the time_facet with a ptime.</entry>
+ </row>
+ <row>
+ <entry><screen>"MST" // Mountain Standard Time</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Z *!</screen></entry>
+ <entry>Full time zone name (output only). This flag is ignored when using the time_facet with a ptime.</entry>
+ </row>
+ <row>
+ <entry><screen>"EDT" // Eastern Daylight Time</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%ZP *</screen></entry>
+ <entry>Posix time zone string (available to both input and output). This flag is ignored when using the time_facet with a ptime. For complete details on posix time zone strings, see <link linkend="date_time.local_time.posix_time_zone">posix_time_zone class</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>"EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%x %X</screen></entry>
+ <entry>Implementation defined date/time format from the locale.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2005,Oct,31);
+ptime pt(d, hours(20));
+time_facet* f = new time_facet("%x %X");
+
+locale loc = locale(locale("en_US"), f);
+cout.imbue(loc);
+cout &lt;&lt; pt; // "10/31/2005 08:00:00 PM"
+
+loc = locale(locale("de_DE"), f);
+cout.imbue(loc);
+cout &lt;&lt; pt; // "31.10.2005 20:00:00"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y%m%dT%H%M%S%F%q</screen></entry>
+ <entry>ISO format</entry>
+ </row>
+ <row>
+ <entry><screen>"20051015T131211-0700" // Oct 15, 2005 13:12:11 MST</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y-%m-%d %H:%M:%S%F%Q</screen></entry>
+ <entry>Extended ISO format</entry>
+ </row>
+ <row>
+ <entry><screen>"2005-10-15 13:12:11-07:00"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y-%b-%d %H:%M:%S%F %z</screen></entry>
+ <entry>Default format used when outputting ptime and local_date_time.</entry>
+ </row>
+ <row>
+ <entry><screen>"2005-Oct-15 13:12:11 MST"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%Y-%b-%d %H:%M:%S%F %ZP</screen></entry>
+ <entry>Default format used when inputting ptime and local_date_time.</entry>
+ </row>
+ <row>
+ <entry><screen>"2005-Oct-15 13:12:11 MST-07"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%-%H:%M:%S%F !</screen></entry>
+ <entry>Default time_duration format for output. Sign will only be displayed for negative durations.</entry>
+ </row>
+ <row>
+ <entry><screen>"-13:14:15.003400"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>%H:%M:%S%F</screen></entry>
+ <entry>Default time_duration format for input.</entry>
+ </row>
+ <row>
+ <entry><screen>"13:14:15.003400"</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ <para>* Signifies flags that have a behavior unique to <code>date_time</code>.</para>
+ <para># Signifies flags that have a platform-dependent behavior. These may not be supported everywhere.</para>
+ <para>! Signifies flags that currently do not work for input.</para>
+</section>
diff --git a/libs/date_time/xmldoc/gregorian.xml b/libs/date_time/xmldoc/gregorian.xml
new file mode 100644
index 000000000..6ad209860
--- /dev/null
+++ b/libs/date_time/xmldoc/gregorian.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.gregorian"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Gregorian</title>
+ <bridgehead renderas="sect2">Gregorian Date System</bridgehead>
+ <para>
+ <link linkend="greg_intro">Introduction</link> --
+ <link linkend="greg_ex">Usage Examples</link>
+ </para>
+
+ <anchor id="greg_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>The gregorian date system provides a date programming system based the Gregorian Calendar. The first introduction of the Gregorian calendar was in 1582 to fix an error in the Julian Calendar. However, many local jurisdictions did not adopt this change until much later. Thus there is potential confusion with historical dates.
+ </para>
+ <para>The implemented calendar is a "proleptic Gregorian calendar" which extends dates back prior to the Gregorian Calendar's first adoption in 1582. The current implementation supports dates in the range 1400-Jan-01 to 9999-Dec-31. Many references will represent dates prior to 1582 using the Julian Calendar, so caution is in order if accurate calculations are required on historic dates. See <ulink url="http://emr.cs.iit.edu/home/reingold/calendar-book/second-edition">Calendrical Calculations</ulink> by Reingold &amp; Dershowitz for more details. Date information from Calendrical Calculations has been used to cross-test the correctness of the Gregorian calendar implementation.
+ </para>
+ <para>All types for the gregorian system are found in namespace boost::gregorian. The library supports a convenience header boost/date_time/gregorian/gregorian_types.hpp that will include all the classes of the library with no input/output dependency. Another header boost/date_time/gregorian/gregorian.hpp will include the types and the input/output code.
+ </para>
+ <para>The class <link linkend="date_time.gregorian.date_class">boost::gregorian::date</link> is the primary temporal type for users. If you are interested in learning about writing programs that do specialized date calculations such as finding the "first sunday in april" see the date <link linkend="date_time.gregorian.date_algorithms">generators and algorithms page</link>.
+ </para>
+
+ <anchor id="greg_ex" />
+ <bridgehead renderas="sect3">Usage Examples</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Example</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><literallayout>
+<link linkend="date_time.examples.days_alive">Days Alive</link> &nbsp;
+<link linkend="date_time.examples.days_between_new_year">Days Between New Years</link></literallayout></entry>
+ <entry>Simple date arithmetic. Retrieve current day from clock.</entry>
+ </row>
+ <row>
+ <entry valign="top"><literallayout><link linkend="date_time.examples.dates_as_strings">Dates as strings</link></literallayout></entry>
+ <entry>Simple parsing and formatting of dates from/to strings</entry>
+ </row>
+ <row>
+ <entry valign="top"><literallayout><link linkend="date_time.examples.date_period_calc">Date Period Calculations</link></literallayout></entry>
+ <entry>See if a date is in a set of date periods (eg: is it a holiday/weekend)</entry>
+ </row>
+ <row>
+ <entry valign="top"><literallayout><link linkend="date_time.examples.print_month">Print a month</link></literallayout></entry>
+ <entry>Small utility program which prints out all the days in a month from command line. Need to know if 1999-Jan-1 was a Friday or a Saturday? This program shows how to do it.</entry>
+ </row>
+ <row>
+ <entry valign="top"><literallayout><link linkend="date_time.examples.print_holidays">Print Holidays</link></literallayout></entry>
+ <entry>Uses date generators to convert abstract specification into concrete set of dates.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <xi:include href="date_class.xml" />
+ <xi:include href="date_duration.xml" />
+ <xi:include href="date_period.xml" />
+ <xi:include href="date_iterators.xml" />
+ <xi:include href="date_algorithms.xml" />
+ <xi:include href="gregorian_calendar.xml" />
+
+</section>
diff --git a/libs/date_time/xmldoc/gregorian_calendar.xml b/libs/date_time/xmldoc/gregorian_calendar.xml
new file mode 100644
index 000000000..9de8f375d
--- /dev/null
+++ b/libs/date_time/xmldoc/gregorian_calendar.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.gregorian.gregorian_calendar">
+ <title>Gregorian Calendar</title>
+
+ <link linkend="gregcal_intro">Introduction</link> --
+ <link linkend="gregcal_header">Header</link> --
+ <link linkend="gregcal_functions">Functions</link>
+
+ <anchor id="gregcal_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::gregorian::gregorian_calendar implements the functions necessary to create the gregorian date system. It converts to the year-month-day form of a date to a day number representation and back.
+ </para>
+ <para>
+ For most purposes this class is simply accessed by <link linkend="date_time.gregorian.date_class">gregorian::date</link> and is not used directly by the user. However, there are useful functions that might be of use such as the end_of_month_day function.
+ </para>
+ <para>
+ The <link linkend="date_time.examples.print_month">print month</link> example demonstrates this.
+ </para>
+
+ <anchor id="gregcal_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/gregorian/gregorian.hpp" //include all types plus i/o
+or
+#include "boost/date_time/gregorian/gregorian_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="gregcal_functions" />
+ <bridgehead renderas="sect3">Functions</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>static short day_of_week(ymd_type)</screen></entry>
+ <entry>Return the day of the week (0==Sunday, 1==Monday, etc)</entry>
+ </row>
+ <row>
+ <entry>See also <link linkend="date_time.gregorian.date_class">gregorian::date</link> day_of_week</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>static date_int_type day_number(ymd_type)</screen></entry>
+ <entry> Convert a ymd_type into a day number. The day number is an absolute number of days since the epoch start.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>static short end_of_month_day(year_type,
+ month_type)</screen></entry>
+ <entry>Given a year and month determine the last day of the month.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>static ymd_type from_day_number(date_int_type)</screen></entry>
+ <entry> Convert a day number to a ymd struct.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>static bool is_leap_year(year_type)</screen></entry>
+ <entry>Returns true if specified year is a leap year.</entry>
+ </row>
+ <row>
+ <entry><screen>gregorian_calendar::is_leap_year(2000)
+//--> true</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+</section>
diff --git a/libs/date_time/xmldoc/io_objects.xml b/libs/date_time/xmldoc/io_objects.xml
new file mode 100644
index 000000000..7a845d018
--- /dev/null
+++ b/libs/date_time/xmldoc/io_objects.xml
@@ -0,0 +1,1101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.io_objects"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Date Time Formatter/Parser Objects</title>
+ <!-- <using-namespace name="boost"/> -->
+ <using-namespace name="boost::date_time"/>
+ <bridgehead renderas="sect2">Date Time Formatter/Parser Objects</bridgehead>
+
+ <link linkend="io_objects.periods">Periods</link> |
+ <link linkend="io_objects.date_generators">Date Generators</link> |
+ <link linkend="io_objects.special_values">Special Values</link> |
+ <link linkend="io_objects.format_date_parser">Format Date Parser</link>
+
+ <anchor id="io_objects.periods" />
+ <bridgehead renderas="sect3">Periods</bridgehead>
+ <para>The period_formatter and period_parser provide a uniform interface for the input and output of date_periods, time_periods, and in a future release, local_date_time_periods. The user has control over the delimiters, formats of the date/time components, and the form the period takes. The format of the date/time components is controlled via the date_time input and output facets.</para>
+
+ <bridgehead renderas="sect4">Period Form</bridgehead>
+ <para>Periods are constructed with open ranged parameters. The first value is the starting point, and is included in the period. The end value is not included but immediately follows the last value: [begin/end). However, a period can be streamed as either an open range or a closed range.</para>
+ <screen>[2003-Jan-01/2003-Dec-31] &lt;-- period holding 365 days
+[2003-Jan-01/2004-Jan-01) &lt;-- period holding 365 days</screen>
+
+ <bridgehead renderas="sect4">Delimiters</bridgehead>
+ <para>There are four delimiters. The default values are<simplelist type="vert" columns="1">
+ <member>"\" - separator</member>
+ <member>"[" - start delimiter</member>
+ <member>")" - open range end delimiter</member>
+ <member>"]" - closed range end delimiter</member>
+ </simplelist>A user can provide a custom set of delimiters. Custom delimiters may contain spaces.</para>
+
+ <bridgehead renderas="sect4">Customization</bridgehead>
+ <para>The period form and delimiters can be set as construction parameters or by means of accessor functions. A custom period parser/formatter can then be used as a construction parameter to a new facet, or can be set in an existing facet via an accessor function.</para>
+
+
+ <bridgehead renderas="sect4">Period Formatter/Parser Reference</bridgehead>
+ The complete class reference can be found here: <classname alt="boost::date_time::period_formatter">Period Formatter Doxygen Reference</classname> and here: <classname alt="boost::date_time::period_parser">Period Parser Doxygen Reference</classname>
+
+ <para>
+ <bridgehead renderas="sect4">Period Formatter Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>period_formatter(...)
+ Parameters:
+ range_display_options
+ char_type*
+ char_type*
+ char_type*
+ char_type*</screen></entry>
+ <entry>NOTE: All five construction parameters have default values so this constructor also doubles as the default constructor. The <code>range_display_options</code> is a public type enum of the <code>period_formatter</code> class. The possible choices are AS_OPEN_RANGE or AS_CLOSED_RANGE. The closed range is the default. A period has three significant points: the begining, the last, and the end. A closed range period takes the form [begin,end), where an open range period takes the form [begin,last]. The four char_type* parameters are: the period separator, the start delimiter, the open range end delimiter, and the closed range end delimiter.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <bridgehead renderas="sect4">Period Formatter Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>range_display_options range_option()</screen></entry>
+ <entry>Returns the current setting for the range display (either AS_OPEN_RANGE or AS_CLOSED_RANGE).</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void range_option(...)
+ Parameter:
+ range_display_options</screen></entry>
+ <entry>Sets the option for range display (either AS_OPEN_RANGE or AS_CLOSED_RANGE).</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void delimiter_strings(...)
+ Parameters:
+ string_type
+ string_type
+ string_type
+ string_type</screen></entry>
+ <entry>Set new delimiter strings in the formatter.</entry>
+ </row>
+ <row>
+ <entry><screen>string beg("->| ");
+string sep(" || ");
+string opn(" ->|");
+string clo(" |&lt;-");
+pf.delimiter_strings(beg, sep,
+ opn, clo);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_period_start_delimeter(...)
+ Return Type:
+ OutItrT
+ Parameter:
+ OutItrT</screen></entry>
+ <entry>Puts the start delimiter into the stream at position pointed to by OutItrT parameter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_period_sepatator(...)
+ Return Type:
+ OutItrT
+ Parameter:
+ OutItrT</screen></entry>
+ <entry>Puts the separator into the stream at position pointed to by OutItrT parameter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_period_end_delimeter(...)
+ Return Type:
+ OutItrT
+ Parameter:
+ OutItrT</screen></entry>
+ <entry>Puts the end delimiter into the stream at position pointed to by OutItrT parameter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put_period(...)
+ Parameters:
+ OutItrT
+ ios_base
+ char_type
+ period_type
+ facet_type</screen></entry>
+ <entry>Puts a period into the stream using the set values for delimiters, separator, and range display. The facet parameter is used to put the date (or time) objects of the period.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ <para>
+ <bridgehead renderas="sect4">Period Parser Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>period_parser(...)
+ Parameters:
+ period_range_option
+ char_type*
+ char_type*
+ char_type*
+ char_type*</screen></entry>
+ <entry>NOTE: All five construction parameters have default values so this constructor also doubles as the default constructor. The <code>period_range_option</code> is a public type enum of the <code>period_parser</code> class. The possible choices are AS_OPEN_RANGE or AS_CLOSED_RANGE. The closed range is the default. A period has three significant points: the begining, the last, and the end. A closed range period takes the form [begin,end), where an open range period takes the form [begin,last]. The four char_type* parameters are: the period separator, the start delimiter, the open range end delimiter, and the closed range end delimiter.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>period_parser(period_parser)</screen></entry>
+ <entry>Copy constructor</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <bridgehead renderas="sect4">Period Parser Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>period_range_option range_option()</screen></entry>
+ <entry>Returns the current setting for the period range (either AS_OPEN_RANGE or AS_CLOSED_RANGE).</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void range_option(...)
+ Parameter:
+ period_range_option </screen></entry>
+ <entry>Sets the option for period range (either AS_OPEN_RANGE or AS_CLOSED_RANGE).</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void delimiter_strings(...)
+ Parameters:
+ string_type
+ string_type
+ string_type
+ string_type</screen></entry>
+ <entry>Set new delimiter strings in the parser.</entry>
+ </row>
+ <row>
+ <entry><screen>string beg("->| ");
+string sep(" || ");
+string opn(" ->|");
+string clo(" |&lt;-");
+pp.delimiter_strings(beg, sep,
+ opn, clo);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>collection_type delimiter_strings()</screen></entry>
+ <entry>Returns the set of delimiter strings currently held in the parser.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>period_type get_period(...)
+ Parameters:
+ stream_itr_type
+ stream_itr_type
+ ios_base
+ period_type
+ duration_type
+ facet_type</screen></entry>
+<entry>Parses a period from the stream. The iterator parameters point to the begining and end of the stream. The duration_type is relevant to the period type, for example: A <code>date_period</code> would use <code>days</code> as a duration_type. The period will be parsed according to the formats and strings found in the facet parameter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>_____________________________________________________</para>
+
+ <anchor id="io_objects.date_generators" />
+ <bridgehead renderas="sect3">Date Generators</bridgehead>
+ <para>The date_generator formatter and parser provide flexibility by allowing the user to use custom "phrase elements". These phrase elements are the "in-between" words in the date_generators. For example, in the date_generator "Second Monday of March", "Second" and "of" are the phrase elements, where "Monday" and "March" are the date elements. Customization of the date elements is done with the facet. The order of the date and phrase elements cannot be changed. When parsing, all elements of the date_generator phrase must parse correctly or an ios_base::failure exception will be thrown.</para>
+
+ <bridgehead renderas="sect4">Customization</bridgehead>
+ <para>The default "phrase_strings" are:
+ <simplelist type="horiz" columns="9">
+ <member>"first"</member>
+ <member>"second"</member>
+ <member>"third"</member>
+ <member>"fourth"</member>
+ <member>"fifth"</member>
+ <member>"last"</member>
+ <member>"before"</member>
+ <member>"after"</member>
+ <member>"of"</member>
+ </simplelist>
+ A custom set of phrase_strings must maintain this order of occurance (Ex: "1st", "2nd", "3rd", "4th", "5th", "last", "prior", "past", "in").</para>
+ <para> Examples using default phrase_strings and default facet formats for weekday &amp; month: <screen>"first Tue of Mar"</screen>And using custom phrase_strings: <screen>"1st Tue in Mar"</screen>
+ </para>
+ <para>The custom set of phrase elements can be set as construction parameters or through an accessor function.A custom date_generator parser/formatter can then be used as a construction parameter to a new facet, or can be set in an existing facet via an accessor function.</para>
+ <para>IMPORTANT NOTE: Prior to 1.33, partial_date was output as "1 Jan" with a single *or* double digit number for the day. The new behavior is to *always* place a double digit number for the day - "01 Jan".</para>
+
+ <bridgehead renderas="sect4">Date Generator Reference</bridgehead>
+ The complete class references can be found here: <classname alt="boost::date_time::date_generator_formatter">Date Generator Formatter Doxygen Reference</classname> and here: <classname alt="boost::date_time::date_generator_parser">Date Generator Parser Doxygen Reference</classname>
+
+ <para>
+ <bridgehead renderas="sect4">Date Generator Formatter Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>date_generator_formatter()</screen></entry>
+ <entry>Uses the default date generator elements.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_generator_formatter(...)
+ Parameters:
+ string_type first_element
+ string_type second_element
+ string_type third_element
+ string_type fourth_element
+ string_type fifth_element
+ string_type last_element
+ string_type before_element
+ string_type after_element
+ string_type of_element</screen></entry>
+ <entry>Constructs a date_generator_formatter using the given element strings.</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <bridgehead renderas="sect4">Date Generator Formatter Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>void elements(...)
+ Parameters:
+ collection_type
+ phrase_elements</screen></entry>
+ <entry>Replace the current phrase elements with a collection of new ones. The <code>phrase_elements</code> parameter is an enum that indicates what the first element in the new collection is (defaults to first).</entry>
+ </row>
+ <row>
+ <entry><screen>// col is a collection holding
+// "final", "prior", "following",
+// and "in"
+typedef date_generator_formatter dgf;
+dgf formatter();
+formatter.elements(col, dgf::last);
+// complete elements in dgf are now:
+"first", "second", "third",
+"fourth", "fifth", "final",
+"prior", "following", and "in"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_partial_date(...)
+ Return Type:
+ facet_type::OutItrT
+ Parameters:
+ OutItrT next
+ ios_base
+ char_type fill
+ partial_date
+ facet_type</screen></entry>
+ <entry>A put function for partial_date. This is a templated function that takes a facet_type as a parameter.</entry>
+ </row>
+ <row>
+ <entry>Put a partial_date => "dd Month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_nth_kday(...)
+ Return Type:
+ facet_type::OutItrT
+ Parameters:
+ OutItrT next
+ ios_base
+ char_type fill
+ nth_kday_type
+ facet_type</screen></entry>
+ <entry>A put function for nth_kday_type. This is a templated function that takes a facet_type as a parameter.</entry>
+ </row>
+ <row>
+ <entry>Put an nth_day_of_the_week_in_month => "nth weekday of month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_first_kday(...)
+ Return Type:
+ facet_type::OutItrT
+ Parameters:
+ OutItrT next
+ ios_base
+ char_type fill
+ first_kday_type
+ facet_type</screen></entry>
+ <entry>A put function for first_kday_type. This is a templated function that takes a facet_type as a parameter.</entry>
+ </row>
+ <row>
+ <entry>Put a first_day_of_the_week_in_month => "first weekday of month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_last_kday(...)
+ Return Type:
+ facet_type::OutItrT
+ Parameters:
+ OutItrT next
+ ios_base
+ char_type fill
+ last_kday_type
+ facet_type</screen></entry>
+ <entry>A put function for last_kday_type. This is a templated function that takes a facet_type as a parameter.</entry>
+ </row>
+ <row>
+ <entry>Put a last_day_of_the_week_in_month => "last weekday of month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_kday_before(...)
+ Return Type:
+ facet_type::OutItrT
+ Parameters:
+ OutItrT next
+ ios_base
+ char_type fill
+ kday_before_type
+ facet_type</screen></entry>
+ <entry>A put function for kday_before_type. This is a templated function that takes a facet_type as a parameter.</entry>
+ </row>
+ <row>
+ <entry>Put a first_day_of_the_week_before => "weekday before"</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>put_kday_after(...)
+ Return Type:
+ facet_type::OutItrT
+ Parameters:
+ OutItrT next
+ ios_base
+ char_type fill
+ kday_after_type
+ facet_type</screen></entry>
+ <entry>A put function for kday_after_type. This is a templated function that takes a facet_type as a parameter.</entry>
+ </row>
+ <row>
+ <entry>Put a first_day_of_the_week_after => "weekday after".</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ <para>
+ <bridgehead renderas="sect4">Date Generator Parser Construction</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>date_generator_parser()</screen></entry>
+ <entry>Uses the default date generator elements.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_generator_parser(...)
+ Parameter:
+ date_generator_parser</screen></entry>
+ <entry>Copy Constructor</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>date_generator_parser(...)
+ Parameters:
+ string_type first_element
+ string_type second_element
+ string_type third_element
+ string_type fourth_element
+ string_type fifth_element
+ string_type last_element
+ string_type before_element
+ string_type after_element
+ string_type of_element</screen></entry>
+ <entry>Constructs a date_generator_parser using the given element strings.</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <bridgehead renderas="sect4">Date Generator Parser Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>void element_strings(...)
+ Parameter:
+ collection_type</screen></entry>
+ <entry>Replace the set of date generator element string with a new set.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void element_strings(...)
+ Parameters:
+ string_type first
+ string_type second
+ string_type third
+ string_type fourth
+ string_type fifth
+ string_type last
+ string_type before
+ string_type after
+ string_type of</screen></entry>
+ <entry>Replace the set of date generator elements with new values.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>get_partial_date_type(...)
+ Return Type:
+ facet_type::partial_date_type
+ Parameters:
+ stream_itr_type next
+ stream_itr_type str_end
+ ios_base
+ facet_type</screen></entry>
+ <entry>A templated function that parses a date_generator from the stream.</entry>
+ </row>
+ <row>
+ <entry>Parses a partial_date => "dd Month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>get_nth_kday_type(...)
+ Return Type:
+ facet_type::nth_kday_type
+ Parameters:
+ stream_itr_type next
+ stream_itr_type str_end
+ ios_base
+ facet_type</screen></entry>
+ <entry>A templated function that parses a date_generator from the stream.</entry>
+ </row>
+ <row>
+ <entry>Parses an nth_day_of_the_week_in_month => "nth weekday of month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>get_first_kday_type(...)
+ Return Type:
+ facet_type::firat_kday_type
+ Parameters:
+ stream_itr_type next
+ stream_itr_type str_end
+ ios_base
+ facet_type</screen></entry>
+ <entry>A templated function that parses a date_generator from the stream.</entry>
+ </row>
+ <row>
+ <entry>Parses a first_day_of_the_week_in_month => "first weekday of month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>get_last_kday_type(...)
+ Return Type:
+ facet_type::last_kday_type
+ Parameters:
+ stream_itr_type next
+ stream_itr_type str_end
+ ios_base
+ facet_type</screen></entry>
+ <entry>A templated function that parses a date_generator from the stream.</entry>
+ </row>
+ <row>
+ <entry>Parses a last_day_of_the_week_in_month => "last weekday of month".</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>get_kday_before_type(...)
+ Return Type:
+ facet_type::kday_before_type
+ Parameters:
+ stream_itr_type next
+ stream_itr_type str_end
+ ios_base
+ facet_type</screen></entry>
+ <entry>A templated function that parses a date_generator from the stream.</entry>
+ </row>
+ <row>
+ <entry>Parses a first_day_of_the_week_before => "weekday before"</entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>get_kday_after_type(...)
+ Return Type:
+ facet_type::kday_after_type
+ Parameters:
+ stream_itr_type next
+ stream_itr_type str_end
+ ios_base
+ facet_type</screen></entry>
+ <entry>A templated function that parses a date_generator from the stream.</entry>
+ </row>
+ <row>
+ <entry>Parses a first_day_of_the_week_after => "weekday after".</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>_____________________________________________________</para>
+
+ <anchor id="io_objects.special_values" />
+ <bridgehead renderas="sect3">Special Values</bridgehead>
+ <para>The date_time library uses five special_values. They are:
+ <simplelist type="horiz" columns="5">
+ <member>not_a_date_time</member>
+ <member>neg_infin</member>
+ <member>pos_infin</member>
+ <member>min_date_time</member>
+ <member>max_date_time</member>
+ </simplelist>
+ </para>
+ <para>The default set of strings used to represent these types are: "not-a-date-time", "-infinity", "+infinity", "minimum-date-time", "maximum-date-time". When output, the min_date-time and max_date_time appear as normal date/time representations: "1400-Jan-01" and "9999-Dec-31" repectively.</para>
+
+ <bridgehead renderas="sect4">Customization</bridgehead>
+ <para>The special values parser/formatter allows the user to set custom strings for these special values. These strings can be set as construction parameters to a new facet, or can be set in an existing facet via an accessor function.</para>
+
+ <bridgehead renderas="sect4">Special Values Formatter/Parser Reference</bridgehead>
+ The complete class references can be found here: <classname alt="boost::date_time::special_values_formatter">Special Values Formatter Doxygen Reference</classname> and here: <classname alt="boost::date_time::special_values_parser">Special Values Parser Doxygen Reference</classname>
+
+ <para>
+ <bridgehead renderas="sect4">Special Values Formatter Constructor</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>special_values_formatter()</screen></entry>
+ <entry>Constructor uses defaults for special value strings.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>special_values_formatter(...)
+ Parameters:
+ collection_type::iterator
+ collection_type::iterator</screen></entry>
+ <entry>Constructs using values in collection. NOTE: Only the first three strings of the collection will be used. Strings for minimum_date_time and maximum_date_time are ignored as those special values are output as normal dates/times.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>special_values_formatter(...)
+ Parameters:
+ char_type*
+ char_type*</screen></entry>
+ <entry>Constructs special values formatter from an array of strings.</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>
+ <bridgehead renderas="sect4">Special Values Formatter Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put_special(...)
+ Parameters:
+ OutItrT next
+ special_values value</screen></entry>
+ <entry>Puts the given special value into the stream.</entry>
+ </row>
+ <row>
+ <entry><screen>date d1(not_a_date_time);
+date d2(minimum_date_time);
+special_values_formatter formatter;
+formatter.put_special(itr, d1);
+// Puts: "not-a-date-time"
+formatter.put_special(itr, d2);
+// Puts: "1400-Jan-01"</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>
+ <bridgehead renderas="sect4">Special Values Parser Constructor</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>special_values_parser()</screen></entry>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top"><screen>special_values_parser(...)
+ Parameters:
+ collection_type::iterator
+ collection_type::iterator</screen></entry>
+ <entry>Constructs a special values parser using the strings in the collection.</entry>
+ </row>
+
+ <row>
+ <entry valign="top"><screen>special_values_parser(...)
+ Parameter:
+ scpecial_values_parser</screen></entry>
+ <entry>Copy constructor.</entry>
+ </row>
+
+ <row>
+ <entry valign="top"><screen>special_values_parser(...)
+ Parameters:
+ string_type nadt_str
+ string_type neg_inf_str
+ string_type pos_inf_str
+ string_type min_dt_str
+ string_type max_dt_str</screen></entry>
+ <entry>Constructs a special values parser using the supplied strings.</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>
+ <bridgehead renderas="sect4">Special Values Parser Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>void sv_strings(...)
+ Parameters:
+ string_type nadt_str
+ string_type neg_inf_str
+ string_type pos_inf_str
+ string_type min_dt_str
+ string_type max_dt_str</screen></entry>
+ <entry>Replace the set of special value strings with the given ones.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool match(...)
+ Parameters:
+ stream_itr_type beg
+ stream_itr_type end
+ match_results</screen></entry>
+ <entry>Returns true if parse was successful. Upon a successful parse, <code>mr.current_match</code> will be set an int values corresponding to the equivalent special_value.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "maximum_date_time"
+typedef special_values_parser svp;
+svp parser;
+svp::match_results mr;
+if(parser.match(itr, str_end, mr)) {
+ d = date(static_cast&lt;special_values>(
+ mr.match_results))
+} else {
+ // error, failed parse
+}
+// d == "9999-Dec-31"</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>_____________________________________________________</para>
+
+ <anchor id="io_objects.format_date_parser" />
+ <bridgehead renderas="sect3">Format Date Parser</bridgehead>
+ <para>The format date parser is the object that holds the strings for months and weekday names, as well as their abbreviations. Custom sets of strings can be set at construction time, or, the strings in an existing format_date_parser can be replaced through accessor functions. Both the constructor and the accessor functions take a vector of strings as their arguments.</para>
+
+ <bridgehead renderas="sect4">Format Date Parser Reference</bridgehead>
+ The complete class reference can be found here: <classname alt="boost::date_time::format_date_parser">Doxygen Reference</classname>
+
+ <para>
+ <bridgehead renderas="sect4">Format Date Parser Constructor</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>format_date_parser(...)
+ Parameters:
+ string_type format
+ std::locale</screen></entry>
+ <entry>Creates a parser that uses the given format for parsing dates (in those functions where there is no format parameter). The names and abbreviations used are extracted from the given locale.</entry>
+ </row>
+
+ <row>
+ <entry valign="top"><screen>format_date_parser(...)
+ Parameters:
+ string_type format
+ input_collection_type
+ input_collection_type
+ input_collection_type
+ input_collection_type</screen></entry>
+ <entry>Creates a parser from using the given components. The input_collection_type parameters are for: short month names, long month names, short weekday names, and long weekday names (in that order). These collections must contain values for every month and every weekday (begining with January and Sunday).</entry>
+ </row>
+
+ <row>
+ <entry valign="top"><screen>format_date_parser(...)
+ Parameters:
+ format_date_parser</screen></entry>
+ <entry>Copy Constructor</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <para>
+ <bridgehead renderas="sect4">Format Date Parser Accessors</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>string_type format()</screen></entry>
+ <entry>Returns the format that will be used when parsing dates in those functions where there is no format parameter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void format(string_type)</screen></entry>
+ <entry>Sets the format that will be used when parsing dates in those functions where there is no format parameter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void short_month_names(...)
+ Parameter:
+ input_collection_type names</screen></entry>
+ <entry>Replace the short month names used by the parser. The collection must contain values for each month, starting with January.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void long_month_names(...)
+ Parameter:
+ input_collection_type names</screen></entry>
+ <entry>Replace the long month names used by the parser. The collection must contain values for each month, starting with January.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void short_weekday_names(...)
+ Parameter:
+ input_collection_type names</screen></entry>
+ <entry>Replace the short weekday names used by the parser. The collection must contain values for each weekday, starting with Sunday.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void long_weekday_names(...)
+ Parameter:
+ input_collection_type names</screen></entry>
+ <entry>Replace the long weekday names used by the parser. The collection must contain values for each weekday, starting with Sunday.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_type parse_date(...)
+ Parameters:
+ string_type input
+ string_type format
+ special_values_parser</screen></entry>
+ <entry>Parse a date from the given input using the given format.</entry>
+ </row>
+ <row>
+ <entry><screen>string inp("2005-Apr-15");
+string format("%Y-%b-%d");
+date d;
+d = parser.parse_date(inp,
+ format,
+ svp);
+// d == 2005-Apr-15</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_type parse_date(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end
+ special_values_parser</screen></entry>
+ <entry>Parse a date from stream using the parser's format.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_type parse_date(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end
+ string_type format
+ special_values_parser</screen></entry>
+ <entry>Parse a date from stream using the given format.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "2005-04-15"
+string format("%Y-%m-%d");
+date d;
+d = parser.parse_date(itr,
+ str_end,
+ format,
+ svp);
+// d == 2005-Apr-15</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>month_type parse_month(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end
+ string_type format</screen></entry>
+ <entry>Parses a month from stream using given format. Throws bad_month if unable to parse.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "March"
+string format("%B");
+greg_month m;
+m = parser.parse_month(itr,
+ str_end,
+ format);
+// m == March</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>day_type parse_day_of_month(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end</screen></entry>
+ <entry>Parses a day_of_month from stream. The day must appear as a two digit number (01-31), or a bad_day_of_month will be thrown.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "01"
+greg_day d;
+d = parser.parse_day_of_month(itr,
+ str_end);
+// d == 1st</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>day_type parse_var_day_of_month(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end</screen></entry>
+ <entry>Parses a day_of_month from stream. The day must appear as a one or two digit number (1-31), or a bad_day_of_month will be thrown.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "1"
+greg_day d;
+d = parser.parse_var_day_of_month(itr,
+ str_end);
+// d == 1st</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>day_of_week_type parse_weekday(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end
+ string_type format</screen></entry>
+ <entry>Parse a weekday from stream according to the given format. Throws a bad_weekday if unable to parse.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "Tue"
+string format("%a");
+greg_weekday wd;
+wd = parser.parse_weekday(itr,
+ str_end,
+ format);
+// wd == Tuesday</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>year_type parse_year(...)
+ Parameters:
+ istreambuf_iterator input
+ istreambuf_iterator str_end
+ string_type format</screen></entry>
+ <entry>Parse a year from stream according to given format. Throws bad year if unable to parse.</entry>
+ </row>
+ <row>
+ <entry><screen>// stream holds "98"
+string format("%y");
+greg_year y;
+y = parser.parse_year(itr,
+ str_end,
+ format);
+// y == 1998</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/io_tutorial.xml b/libs/date_time/xmldoc/io_tutorial.xml
new file mode 100644
index 000000000..6e6e7e09c
--- /dev/null
+++ b/libs/date_time/xmldoc/io_tutorial.xml
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.io_tutorial"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Date Time IO Tutorial</title>
+ <bridgehead renderas="sect2">Date Time IO Tutorial</bridgehead>
+
+ <link linkend="basic_use">Basic Use</link> |
+ <link linkend="format_strings">Format Strings</link> |
+ <link linkend="content_strings">Content Strings</link> |
+ <link linkend="tut_sv">Special Values</link> |
+ <link linkend="tut_dper">Date/Time Periods</link> |
+ <link linkend="tut_dgen">Date Generators</link>
+
+ <anchor id="basic_use" />
+ <bridgehead renderas="sect4">Basic Use</bridgehead>
+ <para>Facets are automatically imbued when operators '>>' and '&lt;&lt;' are called. The list of date_time objects that can be streamed are:</para>
+ <bridgehead renderas="sect5">Gregorian</bridgehead>
+ <para>
+ <code>date</code>,
+ <code>days</code>,
+ <code>date_period</code>,
+ <code>greg_month</code>,
+ <code>greg_weekday</code>,
+ <code>greg_year</code>,
+ <code>partial_date</code>,
+ <code>nth_day_of_the_week_in_month</code>,
+ <code>first_day_of_the_week_in_month</code>,
+ <code>last_day_of_the_week_in_month</code>,
+ <code>first_day_of_the_week_after</code>,
+ <code>first_day_of_the_week_before</code>
+ </para>
+ <bridgehead renderas="sect5">Posix_time</bridgehead>
+ <para>
+ <code>ptime</code>,
+ <code>time_period</code>,
+ <code>time_duration</code>
+ </para>
+ <bridgehead renderas="sect5">Local_time</bridgehead>
+ <para>
+ <code>local_date_time</code>
+ </para>
+
+ <para>
+ The following example is of the basic use of the new IO code, utilizing all the defaults. (this example can be found in the <code>libs/date_time/examples/tutorial</code> directory)
+ </para>
+ <programlisting>
+ <![CDATA[
+ date d(2004, Feb, 29);
+ time_duration td(12,34,56,789);
+ stringstream ss;
+ ss << d << ' ' << td;
+ ptime pt(not_a_date_time);
+ cout << pt << endl; // "not-a-date-time"
+ ss >> pt;
+ cout << pt << endl; // "2004-Feb-29 12:34:56.000789"
+ ss.str("");
+ ss << pt << " EDT-05EDT,M4.1.0,M10.5.0";
+ local_date_time ldt(not_a_date_time);
+ ss >> ldt;
+ cout << ldt << endl; // "2004-Feb-29 12:34:56.000789 EDT"
+ ]]>
+ </programlisting>
+
+ <para>This example used the default settings for the input and output facets. The default formats are such that interoperability like that shown in the example is possible. NOTE: Input streaming of local_date_time can only be done with a <link linkend="date_time.local_time.posix_time_zone">posix time zone string</link>. The default output format uses a time zone abbreviation. The format can be changed so out and in match (as we will see later in this tutorial).</para>
+
+ <anchor id="format_strings" />
+ <bridgehead renderas="sect4">Format Strings</bridgehead>
+ <para>The format strings control the order, type, and style of the date/time elements used. The facets provide some predefined formats (iso_format_specifier, iso_format_extended_specifier, and default_date_format) but the user can easily create their own.</para>
+ (continued from previous example)
+ <programlisting>
+ <![CDATA[
+ local_time_facet* output_facet = new local_time_facet();
+ local_time_input_facet* input_facet = new local_time_input_facet();
+ ss.imbue(locale(locale::classic(), output_facet));
+ ss.imbue(locale(ss.getloc(), input_facet));
+
+ output_facet->format("%a %b %d, %H:%M %z");
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "Sun Feb 29, 12:34 EDT"
+
+ output_facet->format(local_time_facet::iso_time_format_specifier);
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "20040229T123456.000789-0500"
+
+ output_facet->format(local_time_facet::iso_time_format_extended_specifier);
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "2004-02-29 12:34:56.000789-05:00"
+ ]]>
+ </programlisting>
+
+ <para>Format strings are not limited to date/time elements. Extra verbiage can be placed in a format string. NOTE: When extra verbiage is present in an input format, the data being input must also contain the exact verbiage.</para>
+ (continued from previous example)
+ <programlisting>
+ <![CDATA[
+ // extra words in format
+ string my_format("The extended ordinal time %Y-%jT%H:%M can also be \
+ represented as %A %B %d, %Y");
+ output_facet->format(my_format.c_str());
+ input_facet->format(my_format.c_str());
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl;
+
+ // matching extra words in input
+ ss.str("The extended ordinal time 2005-128T12:15 can also be \
+ represented as Sunday May 08, 2005");
+ ss >> ldt;
+ cout << ldt << endl;
+ ]]>
+ </programlisting>
+
+ <anchor id="content_strings" />
+ <bridgehead renderas="sect4">Content Strings</bridgehead>
+ <para>So far we've shown how a user can achieve a great deal of customization with very little effort by using formats. Further customization can be achieved through user defined elements (ie strings). The elements that can be customized are: Special value names, month names, month abbreviations, weekday names, weekday abbreviations, delimiters of the date/time periods, and the phrase elements of the date_generators.</para>
+ <para>The default values for these are as follows:</para>
+ <bridgehead renderas="sect5">Special values</bridgehead>
+ <para>
+ <code>not-a-date-time</code>,
+ <code>-infinity</code>,
+ <code>+infinity</code>,
+ <code>minimum-date-time</code>,
+ <code>maximum-date-time</code>
+ </para>
+ <bridgehead renderas="sect5">Months</bridgehead>
+ <para>
+ <code>English calendar and three letter abbreviations</code>
+ </para>
+ <bridgehead renderas="sect5">Weekdays</bridgehead>
+ <para>
+ <code>English calendar and three letter abbreviations</code>
+ </para>
+ <bridgehead renderas="sect5">Date generator phrase elements</bridgehead>
+ <para>
+ <code>first</code>,
+ <code>second</code>,
+ <code>third</code>,
+ <code>fourth</code>,
+ <code>fifth</code>,
+ <code>last</code>,
+ <code>before</code>,
+ <code>after</code>,
+ <code>of</code>
+ </para>
+ <para>NOTE: We've shown earlier that the components of a date/time representation can be re-ordered via the format string. This is not the case with date_generators. The elements themselves can be customized but their order cannot be changed.</para>
+
+ <bridgehead renderas="sect4">Content Strings</bridgehead>
+ <para>To illustrate the customization possibilities we will use custom strings for months and weekdays (we will only use long names, is all lowercase, for this example).</para>
+ (continued from previous example)
+ <programlisting>
+ <![CDATA[
+ // set up the collections of custom strings.
+ // only the full names are altered for the sake of brevity
+ string month_names[12] = { "january", "february", "march",
+ "april", "may", "june",
+ "july", "august", "september",
+ "october", "november", "december" };
+ vector<string> long_months(&month_names[0], &month_names[12]);
+ string day_names[7] = { "sunday", "monday", "tuesday", "wednesday",
+ "thursday", "friday", "saturday" };
+ vector<string> long_days(&day_names[0], &day_names[7]);
+
+ // create date_facet and date_input_facet using all defaults
+ date_facet* date_output = new date_facet();
+ date_input_facet* date_input = new date_input_facet();
+ ss.imbue(locale(ss.getloc(), date_output));
+ ss.imbue(locale(ss.getloc(), date_input));
+
+ // replace names in the output facet
+ date_output->long_month_names(long_months);
+ date_output->long_weekday_names(long_days);
+
+ // replace names in the input facet
+ date_input->long_month_names(long_months);
+ date_input->long_weekday_names(long_days);
+
+ // customize month, weekday and date formats
+ date_output->format("%Y-%B-%d");
+ date_input->format("%Y-%B-%d");
+ date_output->month_format("%B"); // full name
+ date_input->month_format("%B"); // full name
+ date_output->weekday_format("%A"); // full name
+ date_input->weekday_format("%A"); // full name
+
+ ss.str("");
+ ss << greg_month(3);
+ cout << ss.str() << endl; // "march"
+ ss.str("");
+ ss << greg_weekday(3);
+ cout << ss.str() << endl; // "tuesday"
+ ss.str("");
+ ss << date(2005,Jul,4);
+ cout << ss.str() << endl; // "2005-july-04"
+ ]]>
+ </programlisting>
+
+
+ <anchor id="tut_sv" />
+ <bridgehead renderas="sect4">Special Values</bridgehead>
+ <para>Customizing the input and output of special values is best done by creating a new special_values_parser and special_values_formatter. The new strings can be set at construction time (as in the example below).</para>
+ (continued from previous example)
+ <programlisting>
+ <![CDATA[
+ // reset the formats to defaults
+ output_facet->format(local_time_facet::default_time_format);
+ input_facet->format(local_time_input_facet::default_time_input_format);
+
+ // create custom special_values parser and formatter objects
+ // and add them to the facets
+ string sv[5] = {"nadt","neg_inf", "pos_inf", "min_dt", "max_dt" };
+ vector<string> sv_names(&sv[0], &sv[5]);
+ special_values_parser sv_parser(sv_names.begin(), sv_names.end());
+ special_values_formatter sv_formatter(sv_names.begin(), sv_names.end());
+ output_facet->special_values_formatter(sv_formatter);
+ input_facet->special_values_parser(sv_parser);
+
+ ss.str("");
+ ldt = local_date_time(not_a_date_time);
+ ss << ldt;
+ cout << ss.str() << endl; // "nadt"
+
+ ss.str("min_dt");
+ ss >> ldt;
+ ss.str("");
+ ss << ldt;
+ cout << ss.str() << endl; // "1400-Jan-01 00:00:00 UTC"
+ ]]>
+ </programlisting>
+ <para>NOTE: even though we sent in strings for min and max to the formatter, they are ignored because those special values construct to actual dates (as shown above).</para>
+
+
+ <anchor id="tut_dper" />
+ <bridgehead renderas="sect4">Date/Time Periods</bridgehead>
+ <para>Customizing the input and output of periods is best done by creating a new period_parser and period_formatter. The new strings can be set at construction time (as in the example below).</para>
+ (continued from previous example)
+ <programlisting>
+ <![CDATA[
+ // all formats set back to defaults (not shown for brevity)
+
+ // create our date_period
+ date_period dp(date(2005,Mar,1), days(31)); // month of march
+
+ // custom period formatter and parser
+ period_formatter per_formatter(period_formatter::AS_OPEN_RANGE,
+ " to ", "from ", " exclusive", " inclusive" );
+ period_parser per_parser(period_parser::AS_OPEN_RANGE,
+ " to ", "from ", " exclusive" , "inclusive" );
+
+ // default output
+ ss.str("");
+ ss << dp;
+ cout << ss.str() << endl; // "[2005-Mar-01/2005-Mar-31]"
+
+ // add out custom parser and formatter to the facets
+ date_output->period_formatter(per_formatter);
+ date_input->period_parser(per_parser);
+
+ // custom output
+ ss.str("");
+ ss << dp;
+ cout << ss.str() << endl; // "from 2005-Feb-01 to 2005-Apr-01 exclusive"
+ ]]>
+ </programlisting>
+
+ <anchor id="tut_dgen" />
+ <bridgehead renderas="sect4">Date Generators</bridgehead>
+ <para>Customizing the input and output of date_generators is done by replacing the existing strings (in the facet) with new strings.</para>
+ <para>NOTE: We've shown earlier that the components of a date/time representation can be re-ordered via the format string. This is not the case with date_generators. The elements themselves can be customized but their order cannot be changed.</para>
+ (continued from previous example)
+ <programlisting>
+ <![CDATA[
+ // custom date_generator phrases
+ string dg_phrases[9] = { "1st", "2nd", "3rd", "4th", "5th",
+ "final", "prior to", "following", "in" };
+ vector<string> phrases(&dg_phrases[0], &dg_phrases[9]);
+
+ // create our date_generator
+ first_day_of_the_week_before d_gen(Monday);
+
+ // default output
+ ss.str("");
+ ss << d_gen;
+ cout << ss.str() << endl; // "Mon before"
+
+ // add our custom strings to the date facets
+ date_output->date_gen_phrase_strings(phrases);
+ date_input->date_gen_element_strings(phrases);
+
+ // custom output
+ ss.str("");
+ ss << d_gen;
+ cout << ss.str() << endl; // "Mon prior to"
+ ]]>
+ </programlisting>
+
+</section>
diff --git a/libs/date_time/xmldoc/license.xml b/libs/date_time/xmldoc/license.xml
new file mode 100644
index 000000000..15544605b
--- /dev/null
+++ b/libs/date_time/xmldoc/license.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (c) 2001-2006 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.license">
+ <title>Boost Date-Time Library License</title>
+ <bridgehead renderas="sect2">Boost Date-Time Library License</bridgehead>
+ <!--
+ <ulink url="../../../index.htm">
+ <imagedata align="left"
+ format="GIF"
+ fileref="../../../boost.png"
+ alt="C++ Boost" />
+ </ulink>-->
+ <!--hr /-->
+ <para>
+ The following is the overall license for the boost date_time
+ library. This notice is found in all source files related to the
+ library.
+ </para>
+ <para>
+ Copyright &#169; 2002 CrystalClear Software, Inc.
+ </para>
+ <para>
+ Permission to use, copy, modify, distribute and sell this software
+ and its documentation for any purpose is hereby granted without
+ fee, provided that the above copyright notice appear in all copies
+ and that both that copyright notice and this permission notice
+ appear in supporting documentation. CrystalClear Software makes no
+ representations about the suitability of this software for any
+ purpose. It is provided "as is" without express or implied
+ warranty.
+ </para>
+ <!--hr / -->
+ <ulink url="mailto:jeff@crystalclearsoftware.com">Jeff Garland</ulink>
+ &#169; 2000-2002
+</section>
diff --git a/libs/date_time/xmldoc/local_date_time.xml b/libs/date_time/xmldoc/local_date_time.xml
new file mode 100644
index 000000000..9a78e49d9
--- /dev/null
+++ b/libs/date_time/xmldoc/local_date_time.xml
@@ -0,0 +1,463 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time.local_date_time">
+ <title>Local Date Time</title>
+
+ <link linkend="local_date_time_intro">Introduction</link> --
+ <link linkend="local_date_time_header">Header</link> --
+ <link linkend="local_date_time_clock_constr">Construct From Clock</link> --
+ <link linkend="local_date_time_constr">Construction</link> --
+ <link linkend="local_date_time_accessors">Accessors</link> --
+ <link linkend="local_date_time_operators">Operators</link> --
+ <link linkend="local_date_time_tm_func">Struct tm Functions</link>
+
+ <anchor id="local_date_time_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ A local_date_time object is a point in time and an associated time zone. The time is represented internally as UTC.
+ </para>
+
+ <anchor id="local_date_time_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ The inclusion of a single header will bring in all boost::local_time types,
+functions, and IO operators.
+ <programlisting>
+ #include "boost/date_time/local_time/local_time.hpp"
+ </programlisting>
+ </para>
+
+ <anchor id="local_date_time_clock_constr" />
+ <bridgehead renderas="sect3">Construct From Clock</bridgehead>
+ <para>
+ Creation of a local_date_time object from clock is possible with either second, or sub second resolution.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>local_microsec_clock(...)
+ Return Type:
+ local_date_time
+ Parameter:
+ time_zone_ptr</screen></entry>
+ <entry><screen>time_zone_ptr zone(
+ new posix_time_zone("MST-07")
+);
+local_date_time ldt =
+ local_microsec_clock::local_time(
+ zone);</screen>
+ </entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>local_sec_clock(...)
+ Return Type:
+ local_date_time
+ Parameter:
+ time_zone_ptr</screen></entry>
+ <entry><screen>time_zone_ptr zone(
+ new posix_time_zone("MST-07")
+);
+local_date_time ldt =
+ local_sec_clock::local_time(zone);</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="local_date_time_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ Construction of a local_date_time object can be done with a ptime and a time_zone_ptr where the ptime represents UTC time. Construction with a wall-clock representation takes the form of a date, a time_duration, a time_zone_ptr, and a fourth parameter that addresses the following complication.
+ </para>
+ <para>
+ Construction from a wall-clock rep may result in differing shifts for a particular time zone, depending on daylight savings rules for that zone. This means it is also possible to create a local_date_time with a non-existent, or duplicated, UTC representation. These cases occur during the forward shift in time that is the transition into daylight savings and during the backward shift that is the transition out of daylight savings. The user has two options for handling these cases: a bool flag that states if the time is daylight savings, or an enum that states what to do when either of these cases are encountered.
+ </para>
+ <para>
+ The bool flag is ignored when the given time_zone has no daylight savings specification. When the daylight savings status of a given time label is calculated and it does not match the flag, a <code>local_time::dst_not_valid</code> exception is thrown. If a time label is invalid (does not exist), a <code>local_time::time_label_invalid</code> exception is thrown.
+ </para>
+ <para>
+ There are two elements in the <code>local_date_time::DST_CALC_OPTIONS</code> enum: <code>EXCEPTION_ON_ERROR</code> and <code>NOT_DATE_TIME_ON_ERROR</code>. The possible exceptions thrown are a <code>local_time::ambiguous_result</code> or a <code>local_time::time_label_invalid</code>. The <code>NOT_DATE_TIME_ON_ERROR</code> sets the time value to the special value <code>local_time::not_a_date_time</code> in the event of either a invalid or an ambiguous time label.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time(...)
+ Parameters:
+ posix_time::ptime
+ time_zone_ptr</screen></entry>
+ <entry>The given time is expected to be UTC. Therefore, the given time will be adjusted according to the offset described in the time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>
+// 3am, 2004-Nov-05 local time
+ptime pt(date(2004,Nov,5),
+ hours(10));
+time_zone_ptr zone(
+ new posix_time_zone("MST-07"));
+local_date_time az(pt, zone);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time(...)
+ Parameters:
+ date
+ time_duration
+ time_zone_ptr
+ bool</screen></entry>
+<entry>The passed time information understood to be in the passed tz. The DST flag must be passed to indicate whether the time is in daylight savings or not. May throw a <code>dst_not_valid</code> or <code>time_label_invalid</code> exception.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2004,Nov,5);
+time_duration td(5,0,0,0);
+string z("PST-8PDT,M4.1.0,M10.1.0")
+time_zone_ptr zone(
+ new posix_time_zone(z));
+local_date_time nyc(d, td,
+ zone, false);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time(...)
+ Parameters:
+ date
+ time_duration
+ time_zone_ptr
+ DST_CALC_OPTIONS</screen></entry>
+ <entry>The passed time information understood to be in the passed tz. The DST flag is calculated according to the specified rule. May throw a <code>ambiguous_result</code> or <code>time_label_invalid</code> exception.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2004,Nov,5);
+time_duration td(5,0,0,0);
+string z("PST-8PDT,M4.1.0,M10.1.0")
+time_zone_ptr zone(
+ new posix_time_zone(z));
+local_date_time nyc(d, td, zone,
+ NOT_DATE_TIME_ON_ERROR);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time(local_date_time);</screen></entry>
+ <entry>Copy Constructor.</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time az_2(az);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time(...)
+ Parameters:
+ special_values
+ time_zone_ptr</screen></entry>
+ <entry>Special Values constructor.</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr zone(
+ new posix_time_zone("MST-07")
+);
+local_date_time nadt(not_a_date_time,
+ zone);
+// default NULL time_zone_ptr
+local_date_time nadt(pos_infin);</screen>
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="local_date_time_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_zone_ptr zone()</screen></entry>
+ <entry>Returns associated time_zone object via a time_zone_ptr</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_dst()</screen></entry>
+ <entry>Determines if time value is in DST for associated zone.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime utc_time()</screen></entry>
+ <entry>Converts the local time value to a UTC value.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(date(2004,Nov,5),
+ hours(10));
+time_zone_ptr zone(
+ new posix_time_zone("MST-07"));
+local_date_time az(pt, zone);
+az.utc_time(); // 10am 2004-Nov-5</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime local_time()</screen></entry>
+ <entry>Returns the local time for this object (Wall-clock).</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(date(2004,Nov,5),
+ hours(10));
+time_zone_ptr zone(
+ new posix_time_zone("MST-07"));
+local_date_time az(pt, zone);
+az.utc_time(); // 10am 2004-Nov-5
+az.local_time(); // 3am 2004-Nov-5</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_in(...)
+ Return Type:
+ local_date_time
+ Parameters:
+ time_zone_ptr
+ time_duration</screen></entry>
+ <entry>Returns a local_date_time representing the same UTC time as calling object, plus optional time_duration, with given time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time nyc = az.local_time_in(nyc_zone);
+// nyc == 7am 2004-Nov-5</screen>
+ </entry>
+ </row>
+ <!--
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string zone_name()</screen></entry>
+ <entry>Returns full zone name from associated time zone or "Coordinated Universal Time" if time_zone_ptr is NULL.</entry>
+ </row>
+ <row>
+ <entry>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string zone_abbrev()</screen></entry>
+ <entry>Returns zone abbreviation from associated time zone or "UTC" if time_zone_ptr is NULL.</entry>
+ </row>
+ <row>
+ <entry>
+ </entry>
+ </row>
+ -->
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_infinity() const</screen></entry>
+ <entry>Returns true if local_date_time is either positive or negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time ldt(pos_infin);
+ldt.is_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_neg_infinity() const</screen></entry>
+ <entry>Returns true if local_date_time is negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time ldt(neg_infin);
+ldt.is_neg_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_pos_infinity() const</screen></entry>
+ <entry>Returns true if local_date_time is positive infinity</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time ldt(neg_infin);
+ldt.is_pos_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_not_a_date_time() const</screen></entry>
+ <entry>Returns true if value is not a date</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time ldt(not_a_date_time);
+ldt.is_not_a_date_time(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_special() const</screen></entry>
+ <entry>Returns true if local_date_time is any <code>special_value</code></entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time ldt(pos_infin);
+local_date_time ldt2(not_a_date_time);
+time_zone_ptr
+ mst(new posix_time_zone("MST-07"));
+local_date_time
+ ldt3(local_sec_clock::local_time(mst));
+ldt.is_special(); // --> true
+ldt2.is_special(); // --> true
+ldt3.is_special(); // --> false</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="local_date_time_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;</screen></entry>
+ <entry>Output streaming operator. This operator is part of the v1.33 IO addition to date_time. For complete details on this feature see <link linkend="date_time.date_time_io">Date Time IO</link>. The default output is shown in this example.</entry>
+ </row>
+ <row>
+ <entry><screen>
+time_zone_ptr zone(new posix_time_zone("MST-07");
+local_date_time ldt(date(2005,Jul,4),
+ hours(20),
+ false);
+std::cout &lt;&lt; ldt &lt;&lt; std::endl;
+// "2005-Jul-04 20:00:00 MST"
+ </screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator>></screen></entry>
+ <entry>Input streaming operator. This operator is part of the v1.33 IO addition to date_time. For complete details on this feature see <link linkend="date_time.date_time_io">Date Time IO</link>. At this time, <code>local_date_time</code> objects can only be streamed in with a Posix Time Zone string. A complete description of a Posix Time Zone string can be found in the documentation for the <link linkend="posix_time_zone_intro">posix_time_zone</link> class.</entry>
+ </row>
+ <row>
+ <entry><screen>stringstream ss;
+ss.str("2005-Jul-04 20:00:00 MST-07");
+ss >> ldt;
+ </screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=,
+operator>, operator&lt;,
+operator>=, operator&lt;=</screen></entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>ldt1 == ldt2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator+, operator+=,
+operator-, operator-=</screen></entry>
+ <entry>Addition, subtraction, and shortcut operators for <code>local_date_time</code> and date duration types. These include: <code>days</code>, <code>months</code>, and <code>years</code>.</entry>
+ </row>
+ <row>
+ <entry><screen>ldt + days(5), etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator+, operator+=,
+operator-, operator-=</screen></entry>
+ <entry>Addition, subtraction, and shortcut operators for <code>local_date_time</code> and <code>time_duration</code>.</entry>
+ </row>
+ <row>
+ <entry><screen>ldt + hours(5), etc</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <anchor id="local_date_time_tm_func" />
+ <bridgehead renderas="sect3">Struct tm Functions</bridgehead>
+ <para>Function for converting a <code>local_date_time</code> object to a <code>tm</code> struct is provided.</para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>tm to_tm(local_date_time)</screen></entry>
+ <entry>A function for converting a <code>local_date_time</code> object to a <code>tm</code> struct.</entry>
+ </row>
+ <row>
+ <entry><screen>
+// 6am, 2005-Jul-05 local time
+std::string z("EST-05EDT,M4.1.0,M10.1.0");
+ptime pt(date(2005,Jul,5),
+ hours(10));
+time_zone_ptr zone( new posix_time_zone(z));
+local_date_time ldt(pt, zone);
+tm ldt_tm = to_tm(ldt);
+/* tm_year => 105
+ tm_mon => 6
+ tm_mday => 5
+ tm_wday => 2 (Tuesday)
+ tm_yday => 185
+ tm_hour => 6
+ tm_min => 0
+ tm_sec => 0
+ tm_isddst => 1 */</screen>
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+</section>
diff --git a/libs/date_time/xmldoc/local_time.xml b/libs/date_time/xmldoc/local_time.xml
new file mode 100644
index 000000000..6e22bbd83
--- /dev/null
+++ b/libs/date_time/xmldoc/local_time.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Local Time</title>
+ <bridgehead renderas="sect2">Local Time System</bridgehead>
+ <para>
+ <link linkend="local_intro">Introduction</link> --
+ <link linkend="local_ex">Usage Examples</link>
+ </para>
+
+ <anchor id="local_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The library supports 4 main extensions for the management of local times. This includes
+ <simplelist>
+ <member>local_date_time -- locally adjusted time point</member>
+ <member>posix_time_zone -- time zone defined by posix string (eg: "EST10EDT,M10.5.0,M3.5.0/03")</member>
+ <member>time_zone_database -- get time zones by region from .csv file (eg: America/New York)</member>
+ <member>time_zone -- abstract time zone interface</member>
+ </simplelist>
+ </para>
+ <para>
+ Together, these extensions define a time system adjusted for recording times related to a specific earth location. This time system utilizes all the features and benefits of the posix_time system (see <link linkend="date_time.posix_time">posix_time</link> for full details). It uses a time_zone object which contains all the necessary data/rules to enable adjustments to and from various time zones. The time_zone objects used in date_time are handled via a boost::shared_ptr&lt;boost::local_time::time_zone&gt;.
+ </para>
+ <para>
+ The phrase "wall-clock" refers to the time that would be shown on a wall clock in a particular time zone at any point in time. Local_time uses a time zone object to account for differences in time zones and daylight savings adjustments. For example: While 5:00 pm, October 10, 2004 in Sydney Australia occurs at exactly the same instant as 3:00 am, October 10, 2004 in New York USA, it is a 14 hour difference in wall-clock times. However, a point in time just one day later will result in a 16 hour difference in wall-clock time due to daylight savings adjustments in both time zones. The local_time system tracks these by means of a time point, stored as UTC, and time_zone objects that contain all the necessary data to correctly calculate wall-clock times.
+ </para>
+
+ <anchor id="local_ex" />
+ <bridgehead renderas="sect3">Usage Examples</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Example</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><link linkend="date_time.examples.simple_time_zone">Simple Time Zone</link></entry>
+ <entry>Side by side examples of Time Zone usage. Both <type>custom_time_zone</type> and <type>posix_time_zone</type> are shown.</entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.examples.calc_rules">Daylight Savings Calc Rules</link></entry>
+ <entry>Simple example showing the creation of all five <type>dst_calc_rule</type> types.</entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.examples.seconds_since_epoch">Seconds Since Epoch</link></entry>
+ <entry>Example that calculates the total seconds elapsed since the epoch (1970-Jan-01) utilizing local_date_time.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <!-- this order chosen on 2005-Jan-30 -->
+ <xi:include href="time_zone_base.xml" />
+ <xi:include href="posix_time_zone.xml" />
+ <xi:include href="tz_database.xml" />
+ <xi:include href="custom_time_zone.xml" />
+ <xi:include href="local_date_time.xml" />
+ <xi:include href="local_time_period.xml" />
+ <!--<xi:include href=".xml" /> for serialization -->
+ <!-- includes here -->
+
+</section>
+
diff --git a/libs/date_time/xmldoc/local_time_period.xml b/libs/date_time/xmldoc/local_time_period.xml
new file mode 100644
index 000000000..2ea8f74c9
--- /dev/null
+++ b/libs/date_time/xmldoc/local_time_period.xml
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time.local_time_period">
+ <title>Local Time Period</title>
+
+ <link linkend="local_time_period_intro">Introduction</link> --
+ <link linkend="local_time_period_header">Header</link> --
+ <link linkend="local_time_period_constr">Construction</link> --
+ <link linkend="local_time_period_accessors">Accessors</link> --
+ <link linkend="local_time_period_operators">Operators</link>
+
+ <anchor id="local_time_period_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class <code>boost::local_time::local_time_period</code> provides direct representation for ranges between two local times. Periods provide the ability to simplify some types of calculations by simplifying the conditional logic of the program.
+ </para>
+ <para>
+ A period that is created with beginning and end points being equal, or with a duration of zero, is known as a zero length period. Zero length periods are considered invalid (it is perfectly legal to construct an invalid period). For these periods, the <code>last</code> point will always be one unit less that the <code>begin</code> point.
+ </para>
+
+ <anchor id="local_time_period_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/local_time/local_time.hpp" //include all types plus i/o
+or
+#include "boost/date_time/local_time/local_time_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="local_time_period_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_period(...)
+ Parameters:
+ local_date_time beginning
+ local_date_time end</screen></entry>
+ <entry> Create a period as [begin, end). If end is &lt;= begin then the period will be defined as invalid.</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ beg(ptime(date(2005,Jan,1),hours(0)), zone);
+local_date_time
+ end(ptime(date(2005,Feb,1),hours(0)), zone);
+// period for the entire month of Jan 2005
+local_time_period ltp(beg, end);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_period(...)
+ Parameters:
+ local_date_time beginning
+ time_duration length</screen></entry>
+ <entry>Create a period as [begin, begin+len) where end would be begin+len. If len is &lt;= zero then the period will be defined as invalid.</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ beg(ptime(date(2005,Jan,1),hours(0)), zone);
+// period for the whole day of 2005-Jan-01
+local_time_period ltp(beg, hours(24));</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_period(local_time_period rhs)</screen></entry>
+ <entry>Copy constructor</entry>
+ </row>
+ <row>
+ <entry><screen>local_time_period ltp1(ltp);</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="local_time_period_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time begin()</screen></entry>
+ <entry>Return first local_date_time of the period.</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ ldt((ptime(date(2005,Jan,1)),hours(0)), zone);
+local_time_period ltp(ldt, hours(2));
+ltp.begin(); // => 2005-Jan-01 00:00:00</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time last()</screen></entry>
+ <entry>Return last local_date_time in the period</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ ldt((ptime(date(2005,Jan,1),hours(0))), zone);
+local_time_period ltp(ldt, hours(2));
+ltp.last(); // => 2005-Jan-01 01:59:59.999999999</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_date_time end()</screen></entry>
+ <entry>Return one past the last in period</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ ldt((ptime(date(2005,Jan,1),hours(0))), zone);
+local_time_period ltp(ldt, hours(2));
+ltp.end(); // => 2005-Jan-01 02:00:00</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration length()</screen></entry>
+ <entry>Return the length of the local_time period.</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ ldt((ptime(date(2005,Jan,1),hours(0))), zone);
+local_time_period ltp(ldt, hours(2));
+ltp.length(); // => 02:00:00</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_null()</screen></entry>
+ <entry>True if period is not well formed. eg: end less than or equal to begin.</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ beg((ptime(date(2005,Feb,1),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Jan,1),hours(0))), zone);
+local_time_period ltp(beg, end);
+ltp.is_null(); // => true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool contains(local_date_time)</screen></entry>
+ <entry>True if local_date_time is within the period. Zero length periods cannot contain any points</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr
+ zone(new posix_time_zone("MST-07"));
+local_date_time
+ beg((ptime(date(2005,Jan,1),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Feb,1),hours(0))), zone);
+local_time_period jan_mst(beg, end);
+
+local_date_time
+ldt((ptime(date(2005,Jan,15),hours(12))), zone);
+jan_mst.contains(ldt); // => true
+
+local_time_period zero(beg, beg);
+zero.contains(beg); // false</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool contains(local_time_period)</screen></entry>
+ <entry>True if period is within the period</entry>
+ </row>
+ <row>
+ <entry><screen>// using jan_mst period from previous example
+
+local_date_time
+ beg((ptime(date(2005,Jan,7),hours(0))), zone);
+local_time_period ltp(beg, hours(24));
+
+jan_mst.contains(ltp); // => true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool intersects(local_time_period)</screen></entry>
+ <entry> True if periods overlap</entry>
+ </row>
+ <row>
+ <entry><screen>// using jan_mst period from previous example
+
+local_date_time
+ beg((ptime(date(2005,Jan,7),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Feb,7),hours(0))), zone);
+local_time_period ltp(beg, end);
+
+jan_mst.intersects(ltp); // => true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_period intersection(local_time_period)</screen></entry>
+ <entry>Calculate the intersection of 2 periods. Null if no intersection.</entry>
+ </row>
+ <row>
+ <entry><screen>// using jan_mst period from previous example
+
+local_date_time
+ beg((ptime(date(2005,Jan,7),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Feb,7),hours(0))), zone);
+local_time_period ltp(beg, end);
+
+local_time_period res(jan_mst.intersection(ltp));
+// res => 2005-Jan-07 00:00:00 through
+// 2005-Jan-31 23:59:59.999999999 (inclusive)</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_period merge(local_time_period)</screen></entry>
+ <entry>Returns union of two periods. Null if no intersection.</entry>
+ </row>
+ <row>
+ <entry><screen>// using jan_mst period from previous example
+
+local_date_time
+ beg((ptime(date(2005,Jan,7),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Feb,7),hours(0))), zone);
+local_time_period ltp(beg, end);
+
+local_time_period res(jan_mst.merge(ltp));
+// res => 2005-Jan-07 00:00:00 through
+// 2005-Feb-06 23:59:59.999999999 (inclusive)</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>local_time_period span(local_time_period)</screen></entry>
+ <entry>Combines two periods and any gap between them such that begin = min(p1.begin, p2.begin) and end = max(p1.end , p2.end).</entry>
+ </row>
+ <row>
+ <entry><screen>// using jan_mst period from previous example
+
+local_date_time
+ beg((ptime(date(2005,Mar,1),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Apr,1),hours(0))), zone);
+local_time_period mar_mst(beg, end);
+
+local_time_period res(jan_mst.span(mar_mst));
+// res => 2005-Jan-01 00:00:00 through
+// 2005-Mar-31 23:59:59.999999999 (inclusive)</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void shift(time_duration)</screen></entry>
+ <entry>Add duration to both begin and end.</entry>
+ </row>
+ <row>
+ <entry><screen>local_date_time
+ beg((ptime(date(2005,Mar,1),hours(0))), zone);
+local_date_time
+ end((ptime(date(2005,Apr,1),hours(0))), zone);
+local_time_period mar_mst(beg, end);
+
+mar_mst.shift(hours(48));
+// mar_mst => 2005-Mar-03 00:00:00 through
+// 2005-Apr-02 23:59:59.999999999 (inclusive)</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="local_time_period_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <!-- TODO: the streaming operators have not bee changed from time_period to local_time_period
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;</screen></entry>
+ <entry>Output streaming operator for time duration. Uses facet to output [date time_of_day/date time_of_day]. The default is format is <code>[YYYY-mmm-DD hh:mm:ss.fffffffff/YYYY-mmm-DD hh:mm:ss.fffffffff]</code> string where <code>mmm</code> is 3 char month name and the fractional seconds are left out when zero.</entry>
+ </row>
+ <row>
+ <entry><screen>[2002-Jan-01 01:25:10.000000001/ \
+ 2002-Jan-31 01:25:10.123456789]</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;&gt;</screen></entry>
+ <entry>Input streaming operator for time duration. Uses facet to read [date time_of_day/date time_of_day]. The default is format is <code>[YYYY-mmm-DD hh:mm:ss.fffffffff/YYYY-mmm-DD hh:mm:ss.fffffffff]</code> string where <code>mmm</code> is 3 char month name and the fractional seconds are left out when zero.</entry>
+ </row>
+ <row>
+ <entry><screen>[2002-Jan-01 01:25:10.000000001/ \
+ 2002-Jan-31 01:25:10.123456789]</screen></entry>
+ </row>
+ -->
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=</screen></entry>
+ <entry>Equality operators. Periods are equal if ltp1.begin == ltp2.begin &amp;&amp; ltp1.last == ltp2.last</entry>
+ </row>
+ <row>
+ <entry><screen>if (ltp1 == ltp2) {...</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;</screen></entry>
+ <entry>Ordering with no overlap. True if ltp1.end() less than ltp2.begin()</entry>
+ </row>
+ <row>
+ <entry><screen>if (ltp1 &lt; ltp2) {...</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;</screen></entry>
+ <entry>Ordering with no overlap. True if ltp1.begin() greater than ltp2.end()</entry>
+ </row>
+ <row>
+ <entry><screen>if (ltp1 > ltp2) {... etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;=, operator&gt;=</screen></entry>
+ <entry>Defined in terms of the other operators.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/motivation.xml b/libs/date_time/xmldoc/motivation.xml
new file mode 100644
index 000000000..81f97e436
--- /dev/null
+++ b/libs/date_time/xmldoc/motivation.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (c) 2001-2006 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="Motivation">
+ <title>Motivation</title>
+
+ <para>
+ The motivation for this library comes from working with and helping build several date-time libraries on several projects. Date-time libraries provide fundamental infrastructure for most development projects. However, most of them have limitations in their ability to calculate, format, convert, or perform some other functionality. For example, most libraries do not correctly handle leap seconds, provide concepts such as infinity, or provide the ability to use high resolution or network time sources. These libraries also tend to be rigid in their representation of dates and times. Thus customized policies for a project or subproject are not possible.
+ </para>
+ <para>
+ Programming with dates and times should be almost as simple and natural as programming with strings and integers. Applications with lots of temporal logic can be radically simplified by having a robust set of operators and calculation capabilities. Classes should provide the ability to compare dates and times, add lengths or time durations, retrieve dates and times from clocks, and work naturally with date and time intervals.
+ </para>
+ <para>
+ Another motivation for development of the library was to apply modern C++ library design techniques to the date-time domain. Really to build a framework for the construction of building temporal types. For example, by providing iterators and traits classes to control fundamental properties of the library. To the authors knowledge this library is the only substantial attempt to apply modern C++ to a date-time library.
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/posix_time.xml b/libs/date_time/xmldoc/posix_time.xml
new file mode 100644
index 000000000..7d38660d6
--- /dev/null
+++ b/libs/date_time/xmldoc/posix_time.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.posix_time"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Posix Time</title>
+ <bridgehead renderas="sect2">Posix Time System</bridgehead>
+ <para>
+ <link linkend="posix_intro">Introduction</link> --
+ <link linkend="posix_ex">Usage Examples</link>
+ </para>
+
+ <anchor id="posix_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ Defines a non-adjusted time system with nano-second/micro-second resolution and stable calculation properties. The nano-second resolution option uses 96 bits of underlying storage for each ptime while the micro-second resolution uses 64 bits per ptime (see <link linkend="date_time.buildinfo">Build Options</link> for details). This time system uses the Gregorian calendar to implement the date portion of the time representation.
+ </para>
+
+ <anchor id="posix_ex" />
+ <bridgehead renderas="sect3">Usage Examples</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Example</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><link linkend="date_time.examples.time_math">Time Math</link></entry>
+ <entry>A few simple calculations using ptime and time_durations.</entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.examples.print_hours">Print Hours</link></entry>
+ <entry>Retrieve time from clock, use a time_iterator.</entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.examples.local_utc_conversion">Local to UTC Conversion</link></entry>
+ <entry>Demonstrates a couple different ways to convert a local to UTC time including daylight savings rules.</entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.examples.time_periods">Time Periods</link></entry>
+ <entry>Some simple examples of intersection and display of time periods.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <xi:include href="ptime_class.xml" />
+ <xi:include href="time_duration.xml" />
+ <xi:include href="time_period.xml" />
+ <xi:include href="time_iterators.xml" />
+ <!-- includes here -->
+
+</section>
+
diff --git a/libs/date_time/xmldoc/posix_time_zone.xml b/libs/date_time/xmldoc/posix_time_zone.xml
new file mode 100644
index 000000000..0bcce72f3
--- /dev/null
+++ b/libs/date_time/xmldoc/posix_time_zone.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time.posix_time_zone">
+ <title>Posix Time Zone</title>
+
+ <link linkend="posix_time_zone_intro">Introduction</link> --
+ <link linkend="posix_time_zone_notes">Important Notes</link> --
+ <link linkend="posix_time_zone_header">Header</link> --
+ <link linkend="posix_time_zone_constr">Construction</link> --
+ <link linkend="posix_time_zone_accessors">Accessors</link>
+
+ <anchor id="posix_time_zone_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ A posix_time_zone object is a set of data and rules that provide information about a time zone. Information such as the offset from UTC, it's name and abbreviation, as well as daylight savings rules, called <link linkend="date_time.local_time.dst_calc_rules">dst_calc_rules</link>. These rules are stored as a boost::shared_ptr&lt;dst_calc_rules&gt;.
+ </para>
+ <para>
+ As a convenience, a typedef for shared_ptr&lt;dst_calc_rules&gt; is provided.
+ <programlisting>typedef boost::shared_ptr&lt;dst_calc_rules&gt; local_time::dst_calc_rule_ptr;</programlisting>
+ </para>
+ <para>
+ A posix_time_zone is unique in that the object is created from a Posix time zone string (IEEE Std 1003.1). A POSIX time zone string takes the form of:
+ <literallayout>
+ "std offset dst [offset],start[/time],end[/time]" (w/no spaces).</literallayout>'std' specifies the abbrev of the time zone. 'offset' is the offset from UTC. 'dst' specifies the abbrev of the time zone during daylight savings time. The second offset is how many hours changed during DST. 'start' and 'end' are the dates when DST goes into (and out of) effect. 'offset' takes the form of:
+ <literallayout>
+ [+|-]hh[:mm[:ss]] {h=0-23, m/s=0-59}</literallayout>'time' and 'offset' take the same form. 'start' and 'end' can be one of three forms:
+ <literallayout>
+ Mm.w.d {month=1-12, week=1-5 (5 is always last), day=0-6}
+ Jn {n=1-365 Feb29 is never counted}
+ n {n=0-365 Feb29 is counted in leap years}</literallayout>
+ </para>
+ <para>
+ Exceptions will be thrown under the following conditions:
+ <itemizedlist>
+ <listitem>An exception will be thrown for an invalid date spec (see <link linkend="date_time.gregorian.date_class">date class</link>).</listitem>
+ <listitem>A boost::local_time::bad_offset exception will be thrown for:</listitem>
+ <listitem>A DST start or end offset that is negative or more than 24 hours.</listitem>
+ <listitem>A UTC zone that is greater than +14 or less than -12 hours.</listitem>
+ <listitem>A boost::local_time::bad_adjustment exception will be thrown for a DST adjustment that is 24 hours or more (positive or negative)</listitem>
+ </itemizedlist>
+ </para>
+ <para>As stated above, the 'offset' and '/time' portions of the string are not required. If they are not given they default to 01:00 for 'offset', and 02:00 for both occurrences of '/time'.
+ </para>
+ <para>
+ Some examples are:
+ <literallayout>
+ "PST-8PDT01:00:00,M4.1.0/02:00:00,M10.1.0/02:00:00"
+ "PST-8PDT,M4.1.0,M10.1.0"</literallayout>These two are actually the same specification (defaults were used in the second string). This zone lies eight hours west of GMT and makes a one hour shift forward during daylight savings time. Daylight savings for this zone starts on the first Sunday of April at 2am, and ends on the first Sunday of October at 2am.
+ <literallayout>
+ "MST-7"</literallayout>This zone is as simple as it gets. This zone lies seven hours west of GMT and has no daylight savings.
+ <literallayout>
+ "EST10EDT,M10.5.0,M3.5.0/03"</literallayout>This string describes the time zone for Sydney Australia. It lies ten hours east of GMT and makes a one hour shift forward during daylight savings. Being located in the southern hemisphere, daylight savings begins on the last Sunday in October at 2am and ends on the last Sunday in March at 3am.
+ <literallayout>
+ "FST+3FDT02:00,J60/00,J304/02"</literallayout>This specification describes a fictitious zone that lies three hours east of GMT. It makes a two hour shift forward for daylight savings which begins on March 1st at midnight, and ends on October 31st at 2am. The 'J' designation in the start/end specs signifies that counting starts at one and February 29th is never counted.
+ <literallayout>
+ "FST+3FDT,59,304"</literallayout>This specification is significant because of the '59'. The lack of 'J' for the start and end dates, indicates that the Julian day-count begins at zero and ends at 365. If you do the math, you'll see that allows for a total of 366 days. This is fine in leap years, but in non-leap years '59' (Feb-29) does not exist. This will construct a valid posix_time_zone object but an exception will be thrown if the date of '59' is accessed in a non-leap year. Ex:
+ <programlisting>posix_time_zone leap_day(std::string("FST+3FDT,59,304"));
+leap_day.dst_local_start_time(2004); // ok
+leap_day.dst_local_start_time(2003); // Exception thrown</programlisting>
+ </para>
+ <para>
+ The posix_time_zone objects are used via a boost::shared_ptr&lt;local_time::time_zone_base&gt;. As a convenience, a typedef for boost::shared_ptr&lt;local_time::time_zone_base&gt; is provided:
+ <programlisting>typedef boost::shared_ptr&lt;time_zone_base&gt; local_time::time_zone_ptr;</programlisting>
+ </para>
+ <para>
+ See <link linkend="date_time.examples.simple_time_zone">Simple time zone</link> for a side by side example of time_zone and posix_time_zone usage.
+ </para>
+
+ <anchor id="posix_time_zone_notes" />
+ <bridgehead renderas="sect3">Important Notes</bridgehead>
+ <itemizedlist>
+ <listitem>posix_time_zone objects use the standard and daylight savings abbreviations in place of the full names (see <link linkend="posix_time_zone_accessors">Accessors</link> below).</listitem>
+ <listitem>'Jn' and 'n' date specifications can not be mixed in a specification string. Ex: "FST+3FDT,59,J304" </listitem>
+ <listitem>'n' date specification of 59 represents Feb-29. Do not attempt to access in a non-leap year or an exception will be thrown.</listitem>
+ </itemizedlist>
+
+ <anchor id="posix_time_zone_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ The inclusion of a single header will bring in all boost::local_time types, functions, and IO operators.
+ <programlisting>#include "boost/date_time/local_time/local_time.hpp"</programlisting>
+ </para>
+
+ <anchor id="posix_time_zone_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>posix_time_zone(std::string)</screen></entry>
+ <entry><screen>std::string nyc("EST-5EDT,M4.1.0,M10.5.0");
+time_zone_ptr zone(new posix_time_zone(nyc));</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="posix_time_zone_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string dst_zone_abbrev()</screen></entry>
+ <entry>Returns the daylight savings abbreviation for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;dst_zone_abbrev(); // "EDT"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string std_zone_abbrev()</screen></entry>
+ <entry>Returns the standard abbreviation for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;std_zone_abbrev(); // "EST"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string dst_zone_name()</screen></entry>
+ <entry>Returns the daylight savings ABBREVIATION for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;dst_zone_name(); // "EDT"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string std_zone_name()</screen></entry>
+ <entry>Returns the standard ABBREVIATION for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;std_zone_name(); // "EST"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool has_dst()</screen></entry>
+ <entry>Returns true when time_zone's shared_ptr to dst_calc_rules is not NULL.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;has_dst(); // true
+phx_zone_sh_ptr-&gt;has_dst(); // false</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>
+ptime dst_local_start_time(greg_year)</screen></entry>
+ <entry>The date and time daylight savings time begins in given year. Returns not_a_date_time if this zone has no daylight savings.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;dst_local_start_time(2004);
+// 2004-Apr-04 02:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>
+ptime dst_local_end_time(greg_year)</screen></entry>
+ <entry>The date and time daylight savings time ends in given year. Returns not_a_date_time if this zone has no daylight savings.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;dst_local_end_time(2004);
+// 2004-Oct-31 02:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>
+time_duration base_utc_offset()</screen></entry>
+ <entry>The amount of time offset from UTC (typically in hours).</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;base_utc_offset(); // -05:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>posix_time::time_duration dst_offset()</screen></entry>
+ <entry>The amount of time shifted during daylight savings.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;dst_offset(); // 01:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_posix_string()</screen></entry>
+ <entry>Returns a posix time zone string representation of this time_zone_base object. Depending on how the time_zone object was created, the date-spec format of the string will be in either 'M' notation or 'n' notation. Every possible date-spec that can be represented in 'J' notation can also be represented in 'n' notation. The reverse is not true so only 'n' notation is used for these types of date-specs. For a detailed description of a posix time zone string see <link linkend="date_time.local_time.posix_time_zone">posix_time_zone</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>nyc_zone_sh_ptr-&gt;to_posix_string();
+// "EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"
+phx_zone_sh_ptr-&gt;to_posix_string();
+// "MST-07"
+ </screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/ptime_class.xml b/libs/date_time/xmldoc/ptime_class.xml
new file mode 100644
index 000000000..244216bba
--- /dev/null
+++ b/libs/date_time/xmldoc/ptime_class.xml
@@ -0,0 +1,565 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.posix_time.ptime_class">
+ <title>Ptime</title>
+
+ <link linkend="ptime_intro">Introduction</link> --
+ <link linkend="ptime_header">Header</link> --
+ <link linkend="ptime_constr">Construction</link> --
+ <link linkend="ptime_from_string">Construct from String</link> --
+ <link linkend="ptime_from_clock">Construct from Clock</link> --
+ <link linkend="ptime_from_funcs">Construct using Conversion functions</link> --
+ <link linkend="ptime_accessors">Accessors</link> --
+ <link linkend="ptime_to_string">Conversion To String</link> --
+ <link linkend="ptime_operators">Operators</link> --
+ <link linkend="ptime_struct_tm">Struct tm, time_t, and FILETIME Functions</link>
+
+ <anchor id="ptime_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::posix_time::ptime is the primary interface for time point manipulation. In general, the ptime class is immutable once constructed although it does allow assignment.
+ </para>
+ <para>
+ Class ptime is dependent on <link linkend="date_time.gregorian.date_class">gregorian::date</link> for the interface to the date portion of a time point.
+ </para>
+ <para>
+ Other techniques for creating times include <link linkend="date_time.posix_time.time_iterators">time iterators</link>.
+ </para>
+
+ <anchor id="ptime_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/posix_time/posix_time.hpp" //include all types plus i/o
+or
+#include "boost/date_time/posix_time/posix_time_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="ptime_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime(date,time_duration)</screen></entry>
+ <entry>Construct from a date and offset</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t1(date(2002,Jan,10),
+ time_duration(1,2,3));
+ptime t2(date(2002,Jan,10),
+ hours(1)+nanosec(5));</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime(ptime)</screen></entry>
+ <entry>Copy constructor</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t3(t1)</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime(special_values sv)</screen></entry>
+ <entry>Constructor for infinities, not-a-date-time, max_date_time, and min_date_time</entry>
+ </row>
+ <row>
+ <entry><screen>ptime d1(neg_infin);
+ptime d2(pos_infin);
+ptime d3(not_a_date_time);
+ptime d4(max_date_time);
+ptime d5(min_date_time);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime;</screen></entry>
+ <entry>Default constructor. Creates a ptime object initialized to not_a_date_time. NOTE: this constructor can be disabled by defining DATE_TIME_NO_DEFAULT_CONSTRUCTOR (see compiler_config.hpp)</entry>
+ </row>
+ <row>
+ <entry><screen>ptime p; // p =&gt; not_a_date_time</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="ptime_from_string" />
+ <bridgehead renderas="sect3">Construct from String</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime time_from_string(std::string)</screen></entry>
+ <entry>From delimited string. NOTE: Excess digits in fractional seconds will be dropped. Ex: "1:02:03.123456999" =&gt; 1:02:03.123456. This behavior is affected by the precision the library is compiled with (see <link linkend="date_time.buildinfo">Build-Compiler Information</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>std::string ts("2002-01-20 23:59:59.000");
+ptime t(time_from_string(ts))</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime from_iso_string(std::string)</screen></entry>
+ <entry>From non delimited iso form string.</entry>
+ </row>
+ <row>
+ <entry><screen>std::string ts("20020131T235959");
+ptime t(from_iso_string(ts))</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="ptime_from_clock" />
+ <bridgehead renderas="sect3">Construct from Clock</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime second_clock::local_time()</screen></entry>
+ <entry>Get the local time, second level resolution, based on the time zone settings of the computer.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t(second_clock::local_time());</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime second_clock::universal_time()</screen></entry>
+ <entry>Get the UTC time.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t(second_clock::universal_time())</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime microsec_clock::local_time()</screen></entry>
+ <entry>Get the local time using a sub second resolution clock. On Unix systems this is implemented using GetTimeOfDay. On most Win32 platforms it is implemented using ftime. Win32 systems often do not achieve microsecond resolution via this API. If higher resolution is critical to your application test your platform to see the achieved resolution.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t(microsec_clock::local_time());</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime microsec_clock::universal_time()</screen></entry>
+ <entry>Get the UTC time using a sub second resolution clock. On Unix systems this is implemented using GetTimeOfDay. On most Win32 platforms it is implemented using ftime. Win32 systems often do not achieve microsecond resolution via this API. If higher resolution is critical to your application test your platform to see the achieved resolution.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t(microsec_clock::universal_time());</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="ptime_from_funcs" />
+ <bridgehead renderas="sect3">Construct using Conversion Functions</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime from_time_t(time_t t);</screen></entry>
+ <entry>Converts a time_t into a ptime.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t = from_time_t(tt);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime from_ftime&lt;ptime&gt;(FILETIME ft);</screen></entry>
+ <entry>Creates a ptime object from a FILETIME structure.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime t = from_ftime&lt;ptime&gt;(ft);</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="ptime_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>date date()</screen></entry>
+ <entry>Get the date part of a time.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+ptime t(d, hour(1));
+t.date() --> 2002-Jan-10;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration time_of_day()</screen></entry>
+ <entry>Get the time offset in the day.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,10);
+ptime t(d, hour(1));
+t.time_of_day() --> 01:00:00;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_infinity() const</screen></entry>
+ <entry>Returns true if ptime is either positive or negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(pos_infin);
+pt.is_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_neg_infinity() const</screen></entry>
+ <entry>Returns true if ptime is negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(neg_infin);
+pt.is_neg_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_pos_infinity() const</screen></entry>
+ <entry>Returns true if ptime is positive infinity</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(neg_infin);
+pt.is_pos_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_not_a_date_time() const</screen></entry>
+ <entry>Returns true if value is not a ptime</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(not_a_date_time);
+pt.is_not_a_date_time(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_special() const</screen></entry>
+ <entry>Returns true if ptime is any <code>special_value</code></entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(pos_infin);
+ptime pt2(not_a_date_time);
+ptime pt3(date(2005,Mar,1), hours(10));
+pt.is_special(); // --> true
+pt2.is_special(); // --> true
+pt3.is_special(); // --> false</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="ptime_to_string" />
+ <bridgehead renderas="sect3">Conversion to String</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_simple_string(ptime)</screen></entry>
+ <entry>To <code>YYYY-mmm-DD HH:MM:SS.fffffffff</code> string where <code>mmm</code> 3 char month name. Fractional seconds only included if non-zero.</entry>
+ </row>
+ <row>
+ <entry><screen>2002-Jan-01 10:00:01.123456789</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_iso_string(ptime)</screen></entry>
+ <entry>Convert to form <code>YYYYMMDDTHHMMSS,fffffffff</code> where <code>T</code> is the date-time separator</entry>
+ </row>
+ <row>
+ <entry><screen>20020131T100001,123456789</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_iso_extended_string(ptime)</screen></entry>
+ <entry>Convert to form <code>YYYY-MM-DDTHH:MM:SS,fffffffff</code> where <code>T</code> is the date-time separator</entry>
+ </row>
+ <row>
+ <entry><screen>2002-01-31T10:00:01,123456789</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="ptime_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;, operator&gt;&gt;</screen></entry>
+ <entry>Streaming operators. <emphasis role="strong">Note:</emphasis> As of version 1.33, streaming operations have been greatly improved. See <link linkend="date_time.date_time_io">Date Time IO System</link> for more details (including exceptions and error conditions).</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(not_a_date_time);
+stringstream ss("2002-Jan-01 14:23:11");
+ss &gt;&gt; pt;
+std::cout &lt;&lt; pt; // "2002-Jan-01 14:23:11"
+ </screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=,
+operator>, operator&lt;,
+operator>=, operator&lt;=</screen>
+ </entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>t1 == t2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime operator+(days)</screen></entry>
+ <entry>Return a ptime adding a day offset</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+ptime t(d,minutes(5));
+days dd(1);
+ptime t2 = t + dd;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime operator-(days)</screen></entry>
+ <entry>Return a ptime subtracting a day offset</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+ptime t(d,minutes(5));
+days dd(1);
+ptime t2 = t - dd;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime operator+(time_duration)</screen></entry>
+ <entry>Return a ptime adding a time duration</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+ptime t(d,minutes(5));
+ptime t2 = t + hours(1) + minutes(2);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime operator-(time_duration)</screen></entry>
+ <entry>Return a ptime subtracting a time duration</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+ptime t(d,minutes(5));
+ptime t2 = t - minutes(2);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration operator-(ptime)</screen></entry>
+ <entry>Take the difference between two times.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+ptime t1(d,minutes(5));
+ptime t2(d,seconds(5));
+time_duration t3 = t2 - t1;//negative result</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="ptime_struct_tm" />
+ <bridgehead renderas="sect3">Struct tm, time_t, and FILETIME Functions</bridgehead>
+ <para>Functions for converting posix_time objects to, and from, <code>tm</code> structs are provided as well as conversion from <code>time_t</code> and <code>FILETIME</code>.</para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>tm to_tm(ptime)</screen></entry>
+ <entry>A function for converting a <code>ptime</code> object to a <code>tm</code> struct. The <code>tm_isdst</code> field is set to -1.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(date(2005,Jan,1), time_duration(1,2,3));
+tm pt_tm = to_tm(pt);
+/* tm_year => 105
+ tm_mon => 0
+ tm_mday => 1
+ tm_wday => 6 (Saturday)
+ tm_yday => 0
+ tm_hour => 1
+ tm_min => 2
+ tm_sec => 3
+ tm_isddst => -1 */</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date date_from_tm(tm datetm)</screen></entry>
+ <entry>A function for converting a <code>tm</code> struct to a <code>date</code> object. The fields: <code>tm_wday </code>, <code>tm_yday </code>, and <code>tm_isdst</code> are ignored.</entry>
+ </row>
+ <row>
+ <entry><screen>tm pt_tm;
+pt_tm.tm_year = 105;
+pt_tm.tm_mon = 0;
+pt_tm.tm_mday = 1;
+pt_tm.tm_hour = 1;
+pt_tm.tm_min = 2;
+pt_tm.tm_sec = 3;
+ptime pt = ptime_from_tm(pt_tm);
+// pt => 2005-Jan-01 01:02:03</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>tm to_tm(time_duration)</screen></entry>
+ <entry>A function for converting a <code>time_duration</code> object to a <code>tm</code> struct. The fields: <code>tm_year</code>, <code>tm_mon</code>, <code>tm_mday</code>, <code>tm_wday</code>, <code>tm_yday</code> are set to zero. The <code>tm_isdst</code> field is set to -1.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3);
+tm td_tm = to_tm(td);
+/* tm_year => 0
+ tm_mon => 0
+ tm_mday => 0
+ tm_wday => 0
+ tm_yday => 0
+ tm_hour => 1
+ tm_min => 2
+ tm_sec => 3
+ tm_isddst => -1 */</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime from_time_t(std::time_t)</screen></entry>
+ <entry>Creates a <code>ptime</code> from the time_t parameter. The seconds held in the time_t are added to a time point of 1970-Jan-01.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime pt(not_a_date_time);
+std::time_t t;
+t = 1118158776;
+pt = from_time_t(t);
+// pt => 2005-Jun-07 15:39:36</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime from_ftime&lt;ptime>(FILETIME)</screen></entry>
+ <entry>A template function that constructs a <code>ptime</code> from a FILETIME struct.</entry>
+ </row>
+ <row>
+ <entry><screen>FILETIME ft;
+ft.dwHighDateTime = 29715317;
+ft.dwLowDateTime = 3865122988UL;
+ptime pt = from_ftime&lt;ptime>(ft);
+// pt => 2005-Jun-07 15:30:57.039582000</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+</section>
diff --git a/libs/date_time/xmldoc/ref_tag_fix.pl b/libs/date_time/xmldoc/ref_tag_fix.pl
new file mode 100644
index 000000000..23b66d539
--- /dev/null
+++ b/libs/date_time/xmldoc/ref_tag_fix.pl
@@ -0,0 +1,114 @@
+#!/usr/bin/perl -w
+# Bart Garst - 7/1/2004
+# additional comments at bottom of file
+
+#############################################################################
+# Copyright (c) 2001-2005 CrystalClear Software, Inc. #
+# 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) #
+#############################################################################
+
+use strict;
+
+# key-value of file name and id attribute
+# if the attributes are changed here it would be a good idea to
+# also change the links in doxy.xml
+my %files = (
+ 'date_time_autodoc.boostbook' => 'date_time_reference',
+ 'gregorian_autodoc.boostbook' => 'gregorian_reference',
+ 'posix_time_autodoc.boostbook' => 'posix_time_reference',
+ 'local_time_autodoc.boostbook' => 'local_time_reference'
+);
+
+
+foreach my $key(keys %files) {
+ rewrite_tags($key, $files{$key});
+}
+
+exit;
+
+### subroutines ###
+
+# separate words at underscores and capitalize first letter of each
+sub make_title {
+ my $a = shift || die "Missing required parameter to make_title()\n";
+ my @wrds = split(/_/, $a); # remove underscores
+ foreach(@wrds){
+ $_ = "\u$_"; # capitalize first letter
+ }
+ $a = join(" ",@wrds);
+
+ return $a;
+}
+
+sub rewrite_tags {
+ my $filename = shift || die "Error: argument 1 missing to sub $!";
+ my $id_tag = shift || die "Error: argument 2 missing to sub $!";
+ my ($line, @new_file, $title, $processed);
+
+ $processed = 1; # has this file already been processed?
+
+ print "...processing $filename...\n";
+
+ # prepare a title from id attribute
+ $title = make_title($id_tag);
+
+ # open & read file and change appropriate line
+ open(INP, "<$filename") || die "File open (read) failed: $!";
+ while($line = <INP>){
+ if($line =~ /<library-reference>/) {
+ push(@new_file, "<section id=\"$id_tag\">\n");
+ push(@new_file, "<title>$title</title>\n");
+ $processed = 0; # file had not been previously processed
+ }
+ elsif($line =~ /<\/library-reference>/) {
+ push(@new_file, "</section>\n");
+ }
+ else{
+ push(@new_file, $line);
+ }
+ }
+ close(INP);
+
+ # open & write new file w/ same name
+ open(OTP, ">$filename") || die "File open (write) failed: $!";
+ print OTP shift(@new_file);
+
+ if($processed == 0){ # has not been previously processed so add license
+ my($day, $year) = (localtime)[3,5];
+ my $month = (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec))[(localtime)[4]];
+ $year += 1900; # adjust year
+ print OTP <<EO_LIC;
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+<!-- date source directory processed: $year-$month-$day -->
+EO_LIC
+ }
+
+ foreach(@new_file){
+ print OTP "$_";
+ }
+ close(OTP);
+}
+
+__END__
+
+Rewrites the library-reference tagset as a section tagset and adds
+a title to the generated *.boostbook files. It will NOT update a
+file that has already been rewritten.
+
+Change log
+7/19/2004
+ - rewrite library-reference tags as section tags and add title tags
+ - renamed fix_id sub to rewrite_tags.
+8/31/2004
+ - added license to this file and writes license to boostbook files
+11/01/2004
+ - fixed minor bug that placed multiple license statements in files if
+ input file had already had it's tags fixed.
+ - added a processed date to the license statement
+12/02/2005
+ - added local_time_autodoc.boostbook
+ - updated copyrights to 2005
diff --git a/libs/date_time/xmldoc/references.xml b/libs/date_time/xmldoc/references.xml
new file mode 100644
index 000000000..5147d34b1
--- /dev/null
+++ b/libs/date_time/xmldoc/references.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.references">
+ <title>References</title>
+
+ <para>The design of the library is currently being evolved using Wiki and email discussions. You can find more information at: <ulink url="http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?GDTL">Boost Wiki GDTL Start Page</ulink>.
+ </para>
+
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem><link linkend="date_ref">Date References</link></listitem>
+ <listitem><link linkend="time_ref">Time References</link></listitem>
+ <listitem><link linkend="other_c_libs">Other C/C++ Libraries</link></listitem>
+ <listitem><link linkend="java_libs">JAVA Date-Time Libraries</link></listitem>
+ <listitem><link linkend="script_libs">Scripting Language Libraries</link></listitem>
+ <listitem><link linkend="related">Related Commercial and Fanciful Pages</link></listitem>
+ <listitem><link linkend="resolution">Resolution, Precision, and Accuracy</link></listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="date_ref" />
+ <bridgehead renderas="sect3">Date Calendar References</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem>ISO 8601 date time standard -- <ulink url="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">Summary by Markus Kuhn</ulink> </listitem>
+ <listitem><ulink url="http://emr.cs.iit.edu/home/reingold/calendar-book/second-edition/">Calendrical Calculations</ulink> book by Reingold &amp; Dershowitz</listitem>
+ <listitem><ulink url="http://www.tondering.dk/claus/calendar.html">Calendar FAQ by Claus Tøndering</ulink></listitem>
+ <listitem>Calendar zone <ulink url="http://www.calendarzone.com" /> </listitem>
+ <listitem><ulink url="http://www.w3.org/TR/xmlschema-2/#dateTime">XML schema for date time</ulink> </listitem>
+ <listitem>Will Linden's <ulink url="http://www.ecben.net/calendar.shtml">Calendar Links</ulink> </listitem>
+ <listitem><ulink url="http://www21.brinkster.com/lonwolve/melt/index.htm">XMAS calendar melt</ulink> </listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="time_ref" />
+ <bridgehead renderas="sect3">Time</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem>Martin Folwer on time patterns
+ <itemizedlist override="opencircle">
+ <listitem><ulink url="http://www.aw.com/cseng/titles/0-201-89542-0/apsupp/events2-1.html">Recurring Events for Calendars</ulink> </listitem>
+ <listitem>Patterns for things that <ulink url="http://martinfowler.com/ap2/timeNarrative.html">Change with time</ulink> </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>US National Institute of Standards and Technology <ulink url="http://nist.time.gov/exhibits.html">Time Exhibits</ulink> </listitem>
+ <listitem>Network Time Protocol at <ulink url="http://www.ntp.org/">NTP.org</ulink> </listitem>
+ <listitem>US Navy <ulink url="http://tycho.usno.navy.mil/systime.html">Systems of Time</ulink> </listitem>
+ <listitem><ulink url="http://www.bipm.fr/enus/5_Scientific/c_time/time_1.html">International Atomic Time</ulink> </listitem>
+ <listitem><ulink url="http://beta.zyprexia.com/docs/pgsql/user/datatype1130.htm">Date-Time type PostgreSQL</ulink> User Guide </listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="other_c_libs" />
+ <bridgehead renderas="sect3">Other C/C++ Libraries</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem><ulink url="http://www.cplusplus.com/ref/ctime/index.html">ctime C</ulink> Standard library reference at cplusplus.com</listitem>
+ <listitem><ulink url="http://www.cl.cam.ac.uk/~mgk25/c-time/">XTime C extension</ulink> proposal</listitem>
+ <listitem><ulink url="http://david.tribble.com/text/c0xcalendar.html#author-info">Another C library extension proposal</ulink> by David Tribble</listitem>
+ <listitem><ulink url="http://cr.yp.to/libtai.html">libTAI</ulink> is a C based time library</listitem>
+ <listitem><ulink url="http://www.twinsun.com/tz/tz-link.htm">Time Zone Database</ulink> C library for managing timezones/places</listitem>
+ <listitem>International Components for Unicode by IBM (open source)
+ <itemizedlist override="opencircle">
+ <listitem><ulink url="http://icu.sourceforge.net/userguide/dateCalendar.html">Calendar Class</ulink></listitem>
+ <listitem><ulink url="http://icu.sourceforge.net/userguide/dateTime.html">Date Time Services</ulink></listitem>
+ <listitem><ulink url="http://oss.software.ibm.com/userguide/dateTimezone.html">Time Zone Class</ulink></listitem>
+ <listitem><ulink url="http://oss.software.ibm.com/userguide/formatDateTime.html">Date-Time Formatting</ulink></listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem><ulink url="http://pds-rings.seti.org/toolkits/julian_133_html/aareadme.html">Julian Library in C by Mark Showalter -- NASA</ulink></listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="java_libs" />
+ <bridgehead renderas="sect3">JAVA Date &amp; Time Library Quick Reference</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html">Calendar class</ulink></listitem>
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/GregorianCalendar.html">Gregorian calendar</ulink></listitem>
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Date.html">Date class</ulink></listitem>
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Time.html">sql.time class</ulink></listitem>
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/DateFormatSymbols.html#_top_">Date format symbols</ulink></listitem>
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/DateFormat.html">Date format</ulink></listitem>
+ <listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/SimpleDateFormat.html">Simple Date Format</ulink></listitem>
+<listitem><ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/SimpleTimeZone.html">Simple Time Zone</ulink></listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="script_libs" />
+ <bridgehead renderas="sect3">Scripting Language Libraries</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem>A python date library <ulink url="http://www.lemburg.com/files/python/mxDateTime.html">MX Date Time</ulink></listitem>
+ <listitem>Perl date-time
+ <itemizedlist override="opencircle">
+ <listitem><ulink url="http://search-dev.develooper.com/search?m=module&amp;q=date&amp;s=11">Date-Time packages at CPAN</ulink></listitem>
+ <listitem><ulink url="http://search-dev.develooper.com/~stbey/Date-Calc-5.4/Calc.pod">Date::Calc</ulink> at CPAN</listitem>
+ <listitem><ulink url="http://search.cpan.org/doc/MORTY/DateConvert-0.16/Convert.pm">Date::Convert</ulink> calendar conversions at CPAN</listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="related" />
+ <bridgehead renderas="sect3">Related Commercial and Fanciful Pages</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem><ulink url="http://www.craphound.com/est/">Eastern Standard Tribe</ulink> -- Cory Doctorow science fiction novel with time themes.</listitem>
+ <listitem><ulink url="http://www.leapsecond.com/java/gpsclock.htm">Leapsecond.com time</ulink> page</listitem>
+ <listitem><ulink url="http://www.worldtimeserver.com">World Time Server / TZ database</ulink></listitem>
+ <listitem><ulink url="http://www.longnow.org/10kclock/clock.htm">10000 year clock</ulink> at Long Now Foundation</listitem>
+ <listitem><ulink url="http://www.timezonesforpcs.com">Timezones for PCs</ulink></listitem>
+ </itemizedlist>
+ </para>
+ <anchor id="resolution" />
+ <bridgehead renderas="sect3">Resolution, Precision, and Accuracy</bridgehead>
+ <para>
+ <itemizedlist mark="bullet">
+ <listitem>Definitions with pictures from <ulink url="http://metrologyforum.tm.agilent.com/specs.shtml">Agilent Technologies</ulink></listitem>
+ <listitem>Definitions from <ulink url="http://www.solent.ac.uk/hydrography/notes/errorthe/accuracy.htm">Southampton Institute</ulink></listitem>
+ </itemizedlist>
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/serialization.xml b/libs/date_time/xmldoc/serialization.xml
new file mode 100644
index 000000000..38f507d47
--- /dev/null
+++ b/libs/date_time/xmldoc/serialization.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.serialization">
+ <title>Serialization</title>
+
+ <para>
+ The boost::date_time library is compatible with the boost::serialization library's text and xml archives. The list of classes that are serializable are:
+ </para>
+
+ <bridgehead renderas="sect3">boost::gregorian</bridgehead>
+
+ <informaltable frame="all" pgwide="1">
+ <tgroup cols="3">
+ <tbody>
+ <row>
+ <entry><link linkend="date_time.gregorian.date_class">date</link></entry>
+ <entry><link linkend="date_time.gregorian.date_duration">date_duration</link></entry>
+ <entry><link linkend="date_time.gregorian.date_period">date_period</link></entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.gregorian.date_algorithms">partial_date</link></entry>
+ <entry><link linkend="date_time.gregorian.date_algorithms">nth_day_of_week_in_month</link></entry>
+ <entry><link linkend="date_time.gregorian.date_algorithms">first_day_of_week_in_month</link></entry>
+ </row>
+ <row>
+ <entry><link linkend="date_time.gregorian.date_algorithms">last_day_of_week_in_month</link></entry>
+ <entry><link linkend="date_time.gregorian.date_algorithms">first_day_of_week_before</link></entry>
+ <entry><link linkend="date_time.gregorian.date_algorithms">first_day_of_week_after</link></entry>
+ </row>
+ <row>
+ <entry>greg_month</entry> <!-- no docs to link to for these three -->
+ <entry>greg_day</entry>
+ <entry>greg_weekday</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <bridgehead renderas="sect3">boost::posix_time</bridgehead>
+
+ <informaltable frame="all" pgwide="1">
+ <tgroup cols="3">
+ <tbody>
+ <row>
+ <entry><link linkend="date_time.posix_time.ptime_class">ptime</link></entry>
+ <entry><link linkend="date_time.posix_time.time_duration">time_duration</link></entry>
+ <entry><link linkend="date_time.posix_time.time_period">time_period</link></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+ No extra steps are required to build the date_time library for serialization use.
+ </para>
+
+ <para>NOTE: due to a change in the serialization library interface, it is now required that all streamable objects be const prior to writing to the archive. The following template function will allow for this (and is used in the date_time tests). At this time no special steps are necessary to read from an archive.
+ <programlisting>
+ template&lt;class archive_type, class temporal_type>
+ void save_to(archive_type&amp; ar, const temporal_type&amp; tt)
+ {
+ ar &lt;&lt; tt;
+ }
+ </programlisting>
+ </para>
+
+ <para>
+ Example text_archive usage:
+ <programlisting>
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ ptime pt(date(2002, Feb, 14)), hours(10)), pt2(not_a_date_time);
+ std::ofstream ofs("tmp_file");
+ archive::test_oarchive oa(ofs);
+ save_to(oa, pt); // NOTE: no macro
+ ofs.close();
+ std::ifstream ifs("tmp_file");
+ archive::text_iarchive ia(ifs);
+ ia &gt;&gt; pt2; // NOTE: no macro
+ ifs.close();
+ pt == pt2; // true</programlisting>
+ </para>
+
+ <para>
+ Example xml_archive usage:
+ <programlisting>
+ using namespace boost::gregorian;
+ date d(2002, Feb, 14), d2(not_a_date_time);
+ std::ofstream ofs("tmp_file");
+ archive::xml_oarchive oa(ofs);
+ save_to(oa, BOOST_SERIALIZATION_NVP(d)); // macro required for xml_archive
+ ofs.close();
+ std::ifstream ifs("tmp_file");
+ archive::xml_iarchive ia(ifs);
+ ia &gt;&gt; BOOST_SERIALIZATION_NVP(d2); // macro required for xml_archive
+ ifs.close();
+ d == d2; // true</programlisting>
+ </para>
+
+ <para>
+ To use the date_time serialization code, the proper header files must be explicitly included. The header files are:
+ <programlisting>
+ boost/date_time/gregorian/greg_serialize.hpp</programlisting>
+ and
+ <programlisting>
+ boost/date_time/posix_time/time_serialize.hpp</programlisting>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/snap_to_details.xml b/libs/date_time/xmldoc/snap_to_details.xml
new file mode 100644
index 000000000..2b8b73000
--- /dev/null
+++ b/libs/date_time/xmldoc/snap_to_details.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+
+<para>
+<anchor id="snap_to_details" />
+<bridgehead renderas="sect4">Reversibility of Operations Pitfall</bridgehead>
+<para>A natural expectation when adding a number of months to a date, and then subtracting the same number of months, is to end up exactly where you started. This is most often the result the <code>date_time</code> library provides but there is one significant exception: The snap-to-end-of-month behavior implemented by the <link linkend="additional_duration_types">months</link> duration type. The <link linkend="additional_duration_types">months</link> duration type may provide unexpected results when the starting day is the 28th, 29th, or 30th in a 31 day month. The <link linkend="iterators_intro">month_iterator</link> is not affected by this issue and is therefore included in the examples to illustrate a possible alternative.
+</para>
+
+<para>When the starting date is in the middle of a month, adding or subtracting any number of months will result in a date that is the same day of month (e.g. if you start on the 15th, you will end on the 15th). When a date is the last day of the month, adding or subtracting any number of months will give a result that is also the last day of the month (e.g if you start on Jan 31st, you will land on: Feb 28th, Mar 31st, etc).
+ <programlisting>
+ // using months duration type
+ date d(2005, Nov, 30); // last day of November
+ d + months(1); // result is last day of December "2005-Dec-31"
+ d - months(1); // result is last day of October "2005-Oct-31"
+
+ // using month_iterator
+ month_iterator itr(d); // last day of November
+ ++itr; // result is last day of December "2005-Dec-31"
+ --itr; // back to original starting point "2005-Nov-30"
+ --itr; // last day of October "2005-Oct-31"
+ </programlisting>
+</para>
+
+<para>If the start date is the 28th, 29th, or 30th in a 31 day month, the result of adding or subtracting a month may result in the snap-to-end-of-month behavior kicking in unexpectedly. This would cause the final result to be different than the starting date.
+ <programlisting>
+ // using months duration type
+ date d(2005, Nov, 29);
+ d += months(1); // "2005-Dec-29"
+ d += months(1); // "2006-Jan-29"
+ d += months(1); // "2006-Feb-28" --> snap-to-end-of-month behavior kicks in
+ d += months(1); // "2006-Mar-31" --> unexpected result
+ d -= months(4); // "2005-Nov-30" --> unexpected result, not where we started
+
+ // using month_iterator
+ month_iterator itr(date(2005, Dec, 30));
+ ++itr; // "2006-Jan-30" --> ok
+ ++itr; // "2006-Feb-28" --> snap-to DOES NOT kick in
+ ++itr; // "2006-Mar-30" --> ok
+ --itr; // "2006-Feb-28" --> ok
+ --itr; // "2006-Jan-30" --> ok
+ --itr; // "2005-Dec-30" --> ok, back where we started
+ </programlisting>
+</para>
+
+<para>The additional duration types (<code>months</code>, <code>years</code>, and <code>weeks</code>) are provided as a convenience and can be easily removed to insure this pitfall never occurs. To remove these types simply undefine BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES.</para>
+</para>
diff --git a/libs/date_time/xmldoc/table_template.xml b/libs/date_time/xmldoc/table_template.xml
new file mode 100644
index 000000000..358619f66
--- /dev/null
+++ b/libs/date_time/xmldoc/table_template.xml
@@ -0,0 +1,32 @@
+<!-- Copyright (c) 2004-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<!-- this file is here simply to make the creation of new tables easier and uniform in their layout -->
+
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_zone_ptr zone()</screen></entry>
+ <entry>Returns associated time_zone object via a time_zone_ptr</entry>
+ </row>
+ <row>
+ <entry><screen>the example...</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
diff --git a/libs/date_time/xmldoc/terminology.xml b/libs/date_time/xmldoc/terminology.xml
new file mode 100644
index 000000000..bd29d1b57
--- /dev/null
+++ b/libs/date_time/xmldoc/terminology.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.terminology">
+ <title>Terminology</title>
+
+ <para>
+ The following are a number of terms relevant to the date-time domain.
+ </para>
+ <para>
+ A taxonomy of temporal types:
+ <itemizedlist mark="bullet">
+ <listitem>Timepoint -- Specifier for a location in the time continuum. Similar to a number on a ruler.</listitem>
+ <listitem>Timelength -- A duration of time unattached to any point on the time continuum.</listitem>
+ <listitem>Timeinterval -- A duration of time attached to a specific point in the time continuum.</listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ And some other terms:
+ <itemizedlist mark="bullet">
+ <listitem>Accuracy -- A measure of error, the difference between the reading of a clock and the true time.</listitem>
+ <listitem>Calendar System -- A system for labeling time points with day level resolution.</listitem>
+ <listitem>Clock Device -- A software component (tied to some hardware) that provides the current date or time with respect to a calendar or clock system.</listitem>
+ <listitem>Precision -- A measure of repeatability of a clock.</listitem>
+ <listitem>Resolution -- A specification of the smallest representable duration (eg: 1 second, 1 century) for a clock/calendar system or temporal type.</listitem>
+ <listitem>Stability -- The property of a class which says that the underlying representation (implementation) associated with a particular (abstract) value will never change.</listitem>
+ <listitem>Time System -- A system for labeling time points with higher resolution than day-level. </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Some standard date-time terminology:
+ <itemizedlist mark="bullet">
+ <listitem>Epoch -- Starting time point of a calendar or clock system.</listitem>
+ <listitem>DST -- Daylight savings time - a local time adjustment made in some regions during the summer to shift the clock time of the daylight hours</listitem>
+ <listitem>Time zone -- A region of the earth that provides for a 'local time' defined by DST rules and UT offset.</listitem>
+ <listitem>UTC Time -- Coordinated Universal Time - Civil time system as measured at longitude zero. Kept adjusted to earth rotation by use of leap seconds. Also known as Zulu Time. Replaced the similar system known as Greenwich Mean Time. For more see <ulink url="http://aa.usno.navy.mil/faq/docs/UT.html" /></listitem>
+ <listitem>TAI Time -- A high-accuracy monotonic (need better term) time system measured to .1 microsecond resolution by atomic clocks around the world. Not adjusted to earth rotation. For more see <ulink url="http://www.bipm.fr/enus/5_Scientific/c_time/time_server.html" /></listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Some more experimental ones:
+ <itemizedlist mark="bullet">
+ <listitem>Local Time -- A time measured in a specific location of the universe.</listitem>
+ <listitem>Time Label -- A tuple that either completely or partially specifies a specific date-time with respect to a calendar or clock system. This is the year-month-day representation.</listitem>
+ <listitem>Adjusting Time Length -- A duration that represents varying physical durations depending on the moment in time. For example, a 1 month duration is typically not a fixed number of days and it depends on the date it is measured from to determine the actual length. </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ These are design sorts of terms:
+ <itemizedlist mark="bullet">
+ <listitem>Generation function -- A function that generates a specific set of time points, lengths, or intervals based on one or more parameters. </listitem>
+ </itemizedlist>
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/tests.xml b/libs/date_time/xmldoc/tests.xml
new file mode 100644
index 000000000..91a3ca8b6
--- /dev/null
+++ b/libs/date_time/xmldoc/tests.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.tests">
+ <title>Tests</title>
+
+ <para>
+ The library provides a large number of tests in the
+ <programlisting>
+ libs/date_time/test
+ libs/date_time/test/gregorian
+ libs/date_time/test/posix_time
+ libs/date_time/test/local_time
+ </programlisting>
+ directories. Building and executing these tests assures that the installation is correct and that the library is functioning correctly. In addition, these tests facilitate the porting to new compilers. Finally, the tests provide examples of many functions not explicitly described in the usage examples.
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/time_duration.xml b/libs/date_time/xmldoc/time_duration.xml
new file mode 100644
index 000000000..fc8f176bb
--- /dev/null
+++ b/libs/date_time/xmldoc/time_duration.xml
@@ -0,0 +1,592 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.posix_time.time_duration">
+ <title>Time Duration</title>
+
+ <link linkend="time_duration_intro">Introduction</link> --
+ <link linkend="time_duration_header">Header</link> --
+ <link linkend="time_duration_constr">Construction</link> --
+ <link linkend="time_duration_count_constr">Count Based Construction</link> --
+ <link linkend="time_duration_from_string">Construct from String</link> --
+ <link linkend="time_duration_accessors">Accessors</link> --
+ <link linkend="time_duration_to_string">Conversion To String</link> --
+ <link linkend="time_duration_operators">Operators</link> --
+ <link linkend="time_duration_struct_tm">Struct tm Functions</link>
+
+ <anchor id="time_duration_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::posix_time::time_duration the base type responsible for representing a length of time. A duration can be either positive or negative. The general time_duration class provides a constructor that takes a count of the number of hours, minutes, seconds, and fractional seconds count as shown in the code fragment below. The resolution of the time_duration is configure able at compile time. See <link linkend="date_time.buildinfo">Build-Compiler Information</link> for more information.
+ </para>
+ <para>
+ <programlisting>using namespace boost::posix_time;
+time_duration td(1,2,3,4); //01:02:03.000000004 when resolution is nano seconds
+time_duration td(1,2,3,4); //01:02:03.000004 when resolution is micro seconds</programlisting>
+ </para>
+ <para>
+ Several small helper classes that derive from a base time_duration, as shown below, to adjust for different resolutions. These classes can shorten code and make the intent clearer.
+ </para>
+ <imagedata fileref="../../libs/date_time/doc/time_duration_inherit.png" />
+ <para>
+ As an example:
+ <programlisting>using namespace boost::posix_time;
+
+time_duration td = hours(1) + seconds(10); //01:00:01
+td = hours(1) + nanoseconds(5); //01:00:00.000000005</programlisting>
+ Note that the existence of the higher resolution classes (eg: nanoseconds) depends on the installation of the library. See <link linkend="date_time.buildinfo">Build-Compiler Information</link> for more information.
+ </para>
+
+ <para>
+ Another way to handle this is to utilize the ticks_per_second() method of time_duration to
+ write code that is portable no matter how the library is compiled. The general equation
+ for calculating a resolution independent count is as follows:
+
+ <programlisting>
+count*(time_duration_ticks_per_second / count_ticks_per_second)
+ </programlisting>
+
+ For example, let's suppose we want to construct using a count that represents tenths
+ of a second. That is, each tick is 0.1 second.
+ <programlisting>
+int number_of_tenths = 5;
+//create a resolution independent count -- divide by 10 since there are
+//10 tenths in a second.
+int count = number_of_tenths*(time_duration::ticks_per_second()/10);
+time_duration td(1,2,3,count); //01:02:03.5 //no matter the resolution settings
+ </programlisting>
+ </para>
+
+ <anchor id="time_duration_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/posix_time/posix_time.hpp" //include all types plus i/o
+or
+#include "boost/date_time/posix_time/posix_time_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="time_duration_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration(hours,
+ minutes,
+ seconds,
+ fractional_seconds)</screen></entry>
+ <entry>Construct a duration from the counts. The fractional_second parameter is a number of units and is therefore affected by the resolution the application is compiled with (see <link linkend="compile_options">Build-Compiler Information</link>). If the fractional_seconds argument exceeds the limit of the compiled precision, the excess value will be "carried over" into the seconds field. See above for techniques to creating a resolution independent count.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3,9);
+//1 hr 2 min 3 sec 9 nanoseconds
+time_duration td2(1,2,3,123456789);
+time_duration td3(1,2,3,1000);
+// with microsecond resolution (6 digits)
+// td2 => "01:04:06.456789"
+// td3 => "01:02:03.001000"
+// with nanosecond resolution (9 digits)
+// td2 => "01:02:03.123456789"
+// td3 => "01:02:03.000001000"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top"><screen>time_duration(special_value sv)</screen></entry>
+ <entry>Special values constructor. <emphasis role="strong">Important note</emphasis>: When a time_duration is a special value, either by construction or other means, the following accessor functions will give unpredictable results: <screen>hours(), minutes(), seconds(), ticks(),
+fractional_seconds(), total_nanoseconds(),
+total_microseconds(), total_milliseconds(),
+total_seconds()</screen>The remaining accessor functions will work as expected.</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_duration_count_constr" />
+ <bridgehead renderas="sect3">Count Based Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>hours(long)</screen></entry>
+ <entry>Number of hours</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td = hours(3);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>minutes(long)</screen></entry>
+ <entry>Number of minutes</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td = minutes(3);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>seconds(long)</screen></entry>
+ <entry> Number of seconds</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td = seconds(3);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>milliseconds(long)</screen></entry>
+ <entry>Number of milliseconds.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td = milliseconds(3);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>microseconds(long)</screen></entry>
+ <entry>Number of microseconds.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td = microseconds(3);</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>nanoseconds(long)</screen></entry>
+ <entry>Number of nanoseconds.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td = nanoseconds(3);</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_duration_from_string" />
+ <bridgehead renderas="sect3">Construct from String</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration duration_from_string(std::string)</screen></entry>
+ <entry>From delimited string. NOTE: Excess digits in fractional seconds will be dropped. Ex: "1:02:03.123456999" =&gt; 1:02:03.123456. This behavior is affected by the precision the library is compiled with (see <link linkend="date_time.buildinfo">Build-Compiler Information</link>.</entry>
+ </row>
+ <row>
+ <entry><screen>std::string ts("23:59:59.000");
+time_duration td(duration_from_string(ts));</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_duration_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>long hours()</screen></entry>
+ <entry>Get the number of normalized hours (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3);
+time_duration neg_td(-1,2,3);
+td.hours(); // --> 1
+neg_td.hours(); // --> -1</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long minutes()</screen></entry>
+ <entry>Get the number of minutes normalized +/-(0..59) (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3);
+time_duration neg_td(-1,2,3);
+td.minutes(); // --> 2
+neg_td.minutes(); // --> -2</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long seconds()</screen></entry>
+ <entry>Get the normalized number of second +/-(0..59) (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3);
+time_duration neg_td(-1,2,3);
+td.seconds(); // --> 3
+neg_td.seconds(); // --> -3</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long total_seconds()</screen></entry>
+ <entry>Get the total number of seconds truncating any fractional seconds (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3,10);
+td.total_seconds();
+// --> (1*3600) + (2*60) + 3 == 3723</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long total_milliseconds()</screen></entry>
+ <entry>Get the total number of milliseconds truncating any remaining digits (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3,123456789);
+td.total_milliseconds();
+// HMS --> (1*3600) + (2*60) + 3 == 3723 seconds
+// milliseconds is 3 decimal places
+// (3723 * 1000) + 123 == 3723123</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long total_microseconds()</screen></entry>
+ <entry>Get the total number of microseconds truncating any remaining digits (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3,123456789);
+td.total_microseconds();
+// HMS --> (1*3600) + (2*60) + 3 == 3723 seconds
+// microseconds is 6 decimal places
+// (3723 * 1000000) + 123456 == 3723123456</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long total_nanoseconds()</screen></entry>
+ <entry>Get the total number of nanoseconds truncating any remaining digits (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3,123456789);
+td.total_nanoseconds();
+// HMS --> (1*3600) + (2*60) + 3 == 3723 seconds
+// nanoseconds is 9 decimal places
+// (3723 * 1000000000) + 123456789
+// == 3723123456789</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>long fractional_seconds()</screen></entry>
+ <entry>Get the number of fractional seconds (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3, 1000);
+td.fractional_seconds(); // --> 1000</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_negative()</screen></entry>
+ <entry>True if duration is negative.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(-1,0,0);
+td.is_negative(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration invert_sign()</screen></entry>
+ <entry>Generate a new duration with the sign inverted/</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(-1,0,0);
+td.invert_sign(); // --> 01:00:00</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>date_time::time_resolutions resolution()</screen></entry>
+ <entry>Describes the resolution capability of the time_duration class. time_resolutions is an enum of resolution possibilities ranging from seconds to nanoseconds.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration::resolution() --> nano</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration::num_fractional_digits()</screen></entry>
+ <entry>Returns an unsigned short holding the number of fractional digits the time resolution has.</entry>
+ </row>
+ <row>
+ <entry><screen>unsigned short secs;
+secs = time_duration::num_fractional_digits();
+// 9 for nano, 6 for micro, etc.</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration::ticks_per_second()</screen></entry>
+ <entry>Return the number of ticks in a second. For example, if the duration supports nanoseconds then the returned result will be 1,000,000,000 (1e+9).</entry>
+ </row>
+ <row>
+ <entry><screen>std::cout &lt;&lt; time_duration::ticks_per_second();</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>boost::int64_t ticks()</screen></entry>
+ <entry>Return the raw count of the duration type (will give unpredictable results if calling <code>time_duration</code> is a <code>special_value</code>).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(0,0,0, 1000);
+td.ticks() // --> 1000</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration unit()</screen></entry>
+ <entry>Return smallest possible unit of duration type (1 nanosecond).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration::unit() --> time_duration(0,0,0,1)</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_neg_infinity() const</screen></entry>
+ <entry>Returns true if time_duration is negative infinity</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(neg_infin);
+td.is_neg_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_pos_infinity() const</screen></entry>
+ <entry>Returns true if time_duration is positive infinity</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(pos_infin);
+td.is_pos_infinity(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_not_a_date_time() const</screen></entry>
+ <entry>Returns true if value is not a time</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(not_a_date_time);
+td.is_not_a_date_time(); // --> true</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_special() const</screen></entry>
+ <entry>Returns true if time_duration is any <code>special_value</code></entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(pos_infin);
+time_duration td2(not_a_date_time);
+time_duration td3(2,5,10);
+td.is_special(); // --> true
+td2.is_special(); // --> true
+td3.is_special(); // --> false</screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_duration_to_string" />
+ <bridgehead renderas="sect3">Conversion To String</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_simple_string(time_duration)</screen></entry>
+ <entry>To <code>HH:MM:SS.fffffffff</code> were <code>fff</code> is fractional seconds that are only included if non-zero.</entry>
+ </row>
+ <row>
+ <entry><screen>10:00:01.123456789</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string to_iso_string(time_duration)</screen></entry>
+ <entry>Convert to form <code>HHMMSS,fffffffff</code>.</entry>
+ </row>
+ <row>
+ <entry><screen>100001,123456789</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_duration_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;, operator&gt;&gt;</screen></entry>
+ <entry>Streaming operators. <emphasis role="strong">Note:</emphasis> As of version 1.33, streaming operations have been greatly improved. See <link linkend="date_time.date_time_io">Date Time IO System</link> for more details (including exceptions and error conditions).</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(0,0,0);
+stringstream ss("14:23:11.345678");
+ss &gt;&gt; td;
+std::cout &lt;&lt; td; // "14:23:11.345678"
+ </screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=,
+operator>, operator&lt;,
+operator>=, operator&lt;=</screen>
+ </entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>dd1 == dd2, etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration operator+(time_duration)</screen></entry>
+ <entry>Add durations.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td1(hours(1)+minutes(2));
+time_duration td2(seconds(10));
+time_duration td3 = td1 + td2;</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration operator-(time_duration)</screen></entry>
+ <entry>Subtract durations.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td1(hours(1)+nanoseconds(2));
+time_duration td2 = td1 - minutes(1);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration operator/(int)</screen></entry>
+ <entry>Divide the length of a duration by an integer value. Discards any remainder.</entry>
+ </row>
+ <row>
+ <entry><screen>hours(3)/2 == time_duration(1,30,0);
+nanosecond(3)/2 == nanosecond(1);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration operator*(int)</screen></entry>
+ <entry>Multiply the length of a duration by an integer value.</entry>
+ </row>
+ <row>
+ <entry><screen>hours(3)*2 == hours(6);</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="time_duration_struct_tm" />
+ <bridgehead renderas="sect3">Struct tm, time_t, and FILETIME Functions</bridgehead>
+ <para>Function for converting a time_duration to a <code>tm</code> struct is provided.</para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>tm to_tm(time_duration)</screen></entry>
+ <entry>A function for converting a <code>time_duration</code> object to a <code>tm</code> struct. The fields: <code>tm_year</code>, <code>tm_mon</code>, <code>tm_mday</code>, <code>tm_wday</code>, <code>tm_yday</code> are set to zero. The <code>tm_isdst</code> field is set to -1.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3);
+tm td_tm = to_tm(td);
+/* tm_year => 0
+ tm_mon => 0
+ tm_mday => 0
+ tm_wday => 0
+ tm_yday => 0
+ tm_hour => 1
+ tm_min => 2
+ tm_sec => 3
+ tm_isddst => -1 */</screen>
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+</section>
diff --git a/libs/date_time/xmldoc/time_facet.xml b/libs/date_time/xmldoc/time_facet.xml
new file mode 100644
index 000000000..2fcacb87d
--- /dev/null
+++ b/libs/date_time/xmldoc/time_facet.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.time_facet">
+ <title>Time Facet</title>
+
+ <link linkend="time_facet_intro">Introduction</link> -
+ <link linkend="time_facet_constr">Construction</link> -
+ <link linkend="time_facet_accessors">Accessors</link>
+
+ <anchor id="time_facet_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>The <code>boost::date_time::time_facet</code> is an extension of the <code>boost::date_time::date_facet</code>. The time_facet is typedef'ed in the <code>posix_time</code> namespace as <code>time_facet</code> and <code>wtime_facet</code>. It is typedef'd in the <code>local_time</code> namespace as <code>local_time_facet</code> and <code>wlocal_time_facet</code>.
+ </para>
+
+ <anchor id="time_facet_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>time_facet()</screen></entry>
+ <entry>Default constructor</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>time_facet(...)
+ Parameters:
+ char_type* format
+ period_formatter_type
+ special_values_formatter_type
+ date_gen_formatter_type</screen></entry>
+ <entry>Format given will be used for time output. The remaining parameters are formatter objects. Further details on these objects can be found <link linkend="date_time.io_objects">here</link>. This constructor also provides default arguments for all parameters except the format. Therefore, <code>time_facet("%H:%M:S %m %d %Y")</code> will work.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="time_facet_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ The time_facet inherits all the public date_facet methods. Therefore, the date_facet methods are not listed here. Instead, they can be found by following <link linkend="date_time.date_facet">this</link> link.
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>void time_duration_format(...)
+ Parameter:
+ char_type*</screen></entry>
+ <entry>Sets the time_duration format. The time_duration format has the ability to display the sign of the duration. The <code>'%+'</code> flag will always display the sign. The <code>'%-'</code> will only display if the sign is negative. Currently the '-' and '+' characters are used to denote the sign.</entry>
+ </row>
+ <row>
+ <entry><screen>f->time_duration_format("%+%H:%M");
+// hours and minutes only w/ sign always displayed
+time_duration td1(3, 15, 56);
+time_duration td2(-12, 25, 32);
+ss &lt;&lt; td1; // "+03:15:56"
+ss &lt;&lt; td2; // "-12:25:56"
+ </screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_format()</screen></entry>
+ <entry>Sets the date and time format to ISO.</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_format();
+// "%Y%m%dT%H%M%S%F%q"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_extended_format()</screen></entry>
+ <entry>Sets the date and time format to ISO Extended</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_extended_format();
+// "%Y-%m-%d %H:%M:%S%F%Q"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(...)
+ Common parameters for all
+ 'put' functions:
+ OutItrT
+ ios_base
+ char_type
+ Unique parameter for 'put' funcs:
+ posix_time object</screen></entry>
+ <entry>There are 3 put functions in the time_facet. The common parameters are: an iterator pointing to the next item in the stream, an ios_base object, and the fill character. Each unique posix_time object has it's own put function. Each unique put function is described below.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., ptime)</screen></entry>
+ <entry>Puts a ptime object into the stream using the format set by <code>format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., time_duration)</screen></entry>
+ <entry>Puts a time_duration object into the stream using the format set by <code>time_duration_format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>OutItrT put(..., time_period)</screen></entry>
+ <entry>Puts a time_period into the stream. The format of the dates and times will use the format set by <code>format(..)</code> or the default date/time format. The type of period (open or closed range) and the delimiters used are those used by the period_formatter.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+</section>
+
+
diff --git a/libs/date_time/xmldoc/time_input_facet.xml b/libs/date_time/xmldoc/time_input_facet.xml
new file mode 100644
index 000000000..f74c3994b
--- /dev/null
+++ b/libs/date_time/xmldoc/time_input_facet.xml
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.time_input_facet">
+ <title>Time Input Facet</title>
+
+ <link linkend="time_input_facet_intro">Introduction</link> -
+ <link linkend="time_input_facet_constr">Construction</link> -
+ <link linkend="time_input_facet_accessors">Accessors</link>
+
+ <anchor id="time_input_facet_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>The <code>boost::date_time::time_input_facet</code> is an extension of the <code>date_input_facet</code>. It is typedef'ed in the <code>boost::posix_time</code> namespace as <code>time_input_facet</code> and <code>wtime_input_facet</code>. It is typedef'ed in the <code>boost::local_time</code> namespace as <code>local_time_input_facet</code> and <code>wlocal_time_input_facet</code>.
+ </para>
+
+ <anchor id="time_input_facet_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>time_input_facet()</screen></entry>
+ <entry>Default constructor</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>time_input_facet(string_type)</screen></entry>
+ <entry>Format given will be used for date/time input. All other formats will use their defaults.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>time_input_facet(...)
+ Parameters:
+ string_type format
+ format_date_parser_type
+ special_values_parser_type
+ period_parser_type
+ date_gen_parser_type</screen></entry>
+<entry>Format given will be used for date/time input. The remaining parameters are parser objects. Further details on these objects can be found <link linkend="date_time.io_objects">here</link>.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="time_input_facet_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ The time_input_facet inherits all the public date_input_facet methods. Therefore, the date_input_facet methods are not listed here. Instead, they can be found by following <link linkend="date_time.date_input_facet">this</link> link.
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_format()</screen></entry>
+ <entry>Sets the time format to ISO</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_format();
+// "%Y%m%dT%H%M%S%F%q"
+"20051225T132536.789-0700"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void set_iso_extended_format()</screen></entry>
+ <entry>Sets the date format to ISO Extended</entry>
+ </row>
+ <row>
+ <entry><screen>f->set_iso_extended_format();
+// "%Y-%m-%d %H:%M:%S%F %Q"
+"2005-12-25 13:25:36.789 -07:00"</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>void time_duration_format(...)
+ Parameter:
+ char_type*</screen></entry>
+ <entry>Sets the time_duration format.</entry>
+ </row>
+ <row>
+ <entry><screen>f->time_duration_format("%H:%M");
+// hours and minutes only</screen></entry>
+ </row>
+
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(...)
+ Common parameters for all
+ 'get' functions:
+ InItrT from
+ InItrT to
+ ios_base
+ Unique parameter for 'get' funcs:
+ gregorian object</screen></entry>
+ <entry>There are 3 get functions in the time_input_facet. The common parameters are: an iterator pointing to the begining of the stream, an iterator pointing to the end of the stream, and an ios_base object. Each unique gregorian object has it's own get function. Each unique get function is described below.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., ptime)</screen></entry>
+ <entry>Gets a ptime object from the stream using the format set by <code>format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen>ss.str("2005-Jan-01 13:12:01");
+ss >> pt; // default format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., time_duration)</screen></entry>
+ <entry>Gets a time_duration object from the stream using the format set by <code>time_duration_format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen>ss.str("01:25:15.000123000");
+ss >> td; // default format</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get(..., time_period)</screen></entry>
+ <entry>Gets a time_period from the stream. The format of the dates/times will use the format set by <code>format(..)</code> or the default date and time format. The type of period (open or closed range) and the delimiters used are those used by the period_parser.</entry>
+ </row>
+ <row>
+ <entry>see the <link linkend="date_time.io_tutorial">tutorial</link> for a complete example.</entry>
+ </row>
+
+ <!-- This should be changed later
+ <row>
+ <entry valign="top" morerows="1"><screen>InItrT get_local_time(..., local_date_time)</screen></entry>
+ <entry>Gets a local_date_time object from the stream using the format set by <code>format(...)</code> or the default.</entry>
+ </row>
+ <row>
+ <entry><screen></screen></entry>
+ </row>
+ -->
+
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/time_iterators.xml b/libs/date_time/xmldoc/time_iterators.xml
new file mode 100644
index 000000000..cb51404bb
--- /dev/null
+++ b/libs/date_time/xmldoc/time_iterators.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.posix_time.time_iterators">
+ <title>Time Iterators</title>
+
+ <link linkend="time_iter_intro">Introduction</link> --
+ <link linkend="time_iter_header">Header</link> --
+ <link linkend="time_iter_overview">Overview</link> --
+ <link linkend="time_iter_operators">Operators</link>
+
+ <anchor id="time_iter_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ Time iterators provide a mechanism for iteration through times. Time iterators are similar to <ulink url="http://www.sgi.com/tech/stl/BidirectionalIterator.html">Bidirectional Iterators</ulink>. However, time_iterators are different than standard iterators in that there is no underlying sequence, just a calculation function. In addition, time_iterators are directly comparable against instances of <link linkend="date_time.posix_time.ptime_class">class ptime</link>. Thus a second iterator for the end point of the iteration is not required, but rather a point in time can be used directly. For example, the following code iterates using a 15 minute iteration interval. The <link linkend="date_time.examples.print_hours">print hours</link> example also illustrates the use of the time_iterator.
+ </para>
+ <para>
+ <programlisting>
+ <![CDATA[
+ #include "boost/date_time/posix_time/posix_time.hpp"
+ #include <iostream>
+
+
+ int
+ main()
+ {
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ date d(2000,Jan,20);
+ ptime start(d);
+ ptime end = start + hours(1);
+ time_iterator titr(start,minutes(15)); //increment by 15 minutes
+ //produces 00:00:00, 00:15:00, 00:30:00, 00:45:00
+ while (titr < end) {
+ std::cout << to_simple_string(*titr) << std::endl;
+ ++titr;
+ }
+ std::cout << "Now backward" << std::endl;
+ //produces 01:00:00, 00:45:00, 00:30:00, 00:15:00
+ while (titr > start) {
+ std::cout << to_simple_string(*titr) << std::endl;
+ --titr;
+ }
+ }
+ ]]>
+ </programlisting>
+ </para>
+
+ <anchor id="time_iter_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/posix_time/posix_time.hpp" //include all types plus i/o
+or
+#include "boost/date_time/posix_time/posix_time_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="time_iter_overview" />
+ <bridgehead renderas="sect3">Overview</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Class</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Construction Parameters</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_iterator</screen></entry>
+ <entry>Iterate incrementing by the specified duration.</entry>
+ </row>
+ <row>
+ <entry><screen>ptime start_time, time_duration increment</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_iter_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==(const ptime&amp; rhs),
+operator!=(const ptime&amp; rhs),
+operator>, operator&lt;,
+operator>=, operator&lt;=</screen>
+ </entry>
+ <entry>A full complement of comparison operators</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,1);
+ptime start_time(d, hours(1));
+//increment by 10 minutes
+time_iterator titr(start_time, minutes(10));
+ptime end_time = start_time + hours(2);
+if (titr == end_time) // false
+if (titr != end_time) // true
+if (titr >= end_time) // false
+if (titr &lt;= end_time) // true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>prefix increment</screen></entry>
+ <entry>Increment the iterator by the specified duration.</entry>
+ </row>
+ <row>
+ <entry><screen>//increment by 10 milli seconds
+time_iterator titr(start_time, milliseconds(10));
+++titr; // == start_time + 10 milliseconds</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>prefix decrement</screen></entry>
+ <entry>Decrement the iterator by the specified time duration.</entry>
+ </row>
+ <row>
+ <entry><screen>time_duration td(1,2,3);
+time_iterator titr(start_time, td);
+--titr; // == start_time - 01:02:03</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/time_period.xml b/libs/date_time/xmldoc/time_period.xml
new file mode 100644
index 000000000..ba451aabd
--- /dev/null
+++ b/libs/date_time/xmldoc/time_period.xml
@@ -0,0 +1,396 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2006 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.posix_time.time_period">
+ <title>Time Period</title>
+
+ <link linkend="time_period_intro">Introduction</link> --
+ <link linkend="time_period_header">Header</link> --
+ <link linkend="time_period_constr">Construction</link> --
+ <link linkend="time_period_mutators">Mutators</link> --
+ <link linkend="time_period_accessors">Accessors</link> --
+ <link linkend="time_period_to_string">Conversion To String</link> --
+ <link linkend="time_period_operators">Operators</link>
+
+ <anchor id="time_period_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The class boost::posix_time::time_period provides direct representation for ranges between two times. Periods provide the ability to simplify some types of calculations by simplifying the conditional logic of the program.
+ </para>
+ <para>
+ A period that is created with beginning and end points being equal, or with a duration of zero, is known as a zero length period. Zero length periods are considered invalid (it is perfectly legal to construct an invalid period). For these periods, the <code>last</code> point will always be one unit less that the <code>begin</code> point.
+ </para>
+ <para>
+ The <link linkend="date_time.examples.time_periods">time periods example</link> provides an example of using time periods.
+ </para>
+
+ <anchor id="time_period_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ <programlisting>#include "boost/date_time/posix_time/posix_time.hpp" //include all types plus i/o
+or
+#include "boost/date_time/posix_time/posix_time_types.hpp" //no i/o just types</programlisting>
+ </para>
+
+ <anchor id="time_period_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period(ptime,
+ ptime)</screen></entry>
+ <entry> Create a period as [begin, end). If end is &lt;= begin then the period will be defined as invalid.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d, seconds(10)); //10 sec after midnight
+ptime t2(d, hours(10)); //10 hours after midnight
+time_period tp(t1, t2);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period(ptime,
+ time_duration)</screen></entry>
+ <entry> Create a period as [begin, begin+len) where end would be begin+len. If len is &lt;= zero then the period will be defined as invalid.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t(d, seconds(10)); //10 sec after midnight
+time_period tp(t, hours(3));</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period(time_period rhs)</screen></entry>
+ <entry> Copy constructor</entry>
+ </row>
+ <row>
+ <entry><screen>time_period tp1(tp);</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_period_mutators" />
+ <bridgehead renderas="sect3">Mutators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period shift(time_duration)</screen></entry>
+ <entry>Add duration to both begin and end.</entry>
+ </row>
+ <row>
+ <entry>
+ <screen>
+time_period tp(ptime(date(2005,Jan,1),hours(1)), hours(2));
+tp.shift(minutes(5));
+// tp == 2005-Jan-01 01:05:00 to 2005-Jan-01 03:05:00
+ </screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period expand(days)</screen></entry>
+ <entry>Subtract duration from begin and add duration to end.</entry>
+ </row>
+ <row>
+ <entry>
+ <screen>
+time_period tp(ptime(date(2005,Jan,1),hours(1)), hours(2));
+tp.expand(minutes(5));
+// tp == 2005-Jan-01 00:55:00 to 2005-Jan-01 03:05:00
+ </screen>
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_period_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime begin()</screen></entry>
+ <entry>Return first time of period.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d, seconds(10)); //10 sec after midnight
+ptime t2(d, hours(10)); //10 hours after midnight
+time_period tp(t1, t2);
+tp.begin(); // --> 2002-Jan-01 00:00:10</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime last()</screen></entry>
+ <entry>Return last time in the period</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d, seconds(10)); //10 sec after midnight
+ptime t2(d, hours(10)); //10 hours after midnight
+time_period tp(t1, t2);
+tp.last();// --> 2002-Jan-01 09:59:59.999999999</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>ptime end()</screen></entry>
+ <entry> Return one past the last in period</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d, seconds(10)); //10 sec after midnight
+ptime t2(d, hours(10)); //10 hours after midnight
+time_period tp(t1, t2);
+tp.last(); // --> 2002-Jan-01 10:00:00</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_duration length()</screen></entry>
+ <entry>Return the length of the time period.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d); //midnight
+time_period tp(t1, hours(1));
+tp.length() --> 1 hour</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool is_null()</screen></entry>
+ <entry>True if period is not well formed. eg: end is less than or equal to begin.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d, hours(12)); // noon on Jan 1st
+ptime t2(d, hours(9)); // 9am on Jan 1st
+time_period tp(t1, t2);
+tp.is_null(); // true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool contains(ptime)</screen></entry>
+ <entry>True if ptime is within the period. Zero length periods cannot contain any points.</entry>
+ </row>
+ <row>
+ <entry><screen>date d(2002,Jan,01);
+ptime t1(d, seconds(10)); //10 sec after midnight
+ptime t2(d, hours(10)); //10 hours after midnight
+ptime t3(d, hours(2)); //2 hours after midnight
+time_period tp(t1, t2);
+tp.contains(t3); // true
+time_period tp2(t1, t1);
+tp2.contains(t1); // false</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool contains(time_period)</screen></entry>
+ <entry>True if period is within the period</entry>
+ </row>
+ <row>
+ <entry><screen>time_period tp1(ptime(d,hours(1)),
+ ptime(d,hours(12)));
+time_period tp2(ptime(d,hours(2)),
+ ptime(d,hours(4)));
+tp1.contains(tp2); // --> true
+tp2.contains(tp1); // --> false</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool intersects(time_period)</screen></entry>
+ <entry> True if periods overlap</entry>
+ </row>
+ <row>
+ <entry><screen>time_period tp1(ptime(d,hours(1)),
+ ptime(d,hours(12)));
+time_period tp2(ptime(d,hours(2)),
+ ptime(d,hours(4)));
+tp2.intersects(tp1); // --> true</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period intersection(time_period)</screen></entry>
+ <entry>Calculate the intersection of 2 periods. Null if no intersection.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period merge(time_period)</screen></entry>
+ <entry>Returns union of two periods. Null if no intersection.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_period span(time_period)</screen></entry>
+ <entry>Combines two periods and any gap between them such that begin = min(p1.begin, p2.begin) and end = max(p1.end , p2.end).</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_period_to_string" />
+ <bridgehead renderas="sect3">Conversion To String</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>std::string
+ to_simple_string(time_period dp)</screen></entry>
+ <entry>To <code>[YYYY-mmm-DD hh:mm:ss.fffffffff/YYYY-mmm-DD hh:mm:ss.fffffffff]</code> string where <code>mmm</code> is 3 char month name.</entry>
+ </row>
+ <row>
+ <entry><screen>[2002-Jan-01 01:25:10.000000001/
+ 2002-Jan-31 01:25:10.123456789]
+// string occupies one line</screen></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+
+ <anchor id="time_period_operators" />
+ <bridgehead renderas="sect3">Operators</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;&lt;</screen></entry>
+ <entry>Output streaming operator for time duration. Uses facet to output [date time_of_day/date time_of_day]. The default is format is <code>[YYYY-mmm-DD hh:mm:ss.fffffffff/YYYY-mmm-DD hh:mm:ss.fffffffff]</code> string where <code>mmm</code> is 3 char month name and the fractional seconds are left out when zero.</entry>
+ </row>
+ <row>
+ <entry><screen>[2002-Jan-01 01:25:10.000000001/ \
+ 2002-Jan-31 01:25:10.123456789]</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;&gt;</screen></entry>
+ <entry>Input streaming operator for time duration. Uses facet to read [date time_of_day/date time_of_day]. The default is format is <code>[YYYY-mmm-DD hh:mm:ss.fffffffff/YYYY-mmm-DD hh:mm:ss.fffffffff]</code> string where <code>mmm</code> is 3 char month name and the fractional seconds are left out when zero.</entry>
+ </row>
+ <row>
+ <entry><screen>[2002-Jan-01 01:25:10.000000001/ \
+ 2002-Jan-31 01:25:10.123456789]</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator==, operator!=</screen></entry>
+ <entry>Equality operators. Periods are equal if p1.begin == p2.begin &amp;&amp; p1.last == p2.last</entry>
+ </row>
+ <row>
+ <entry><screen>if (tp1 == tp2) {...</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;</screen></entry>
+ <entry>Ordering with no overlap. True if tp1.end() less than tp2.begin()</entry>
+ </row>
+ <row>
+ <entry><screen>if (tp1 &lt; tp2) {...</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&gt;</screen></entry>
+ <entry>Ordering with no overlap. True if tp1.begin() greater than tp2.end()</entry>
+ </row>
+ <row>
+ <entry><screen>if (tp1 > tp2) {... etc</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>operator&lt;=, operator&gt;=</screen></entry>
+ <entry>Defined in terms of the other operators.</entry>
+ </row>
+ <row>
+ <entry></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/time_zone_base.xml b/libs/date_time/xmldoc/time_zone_base.xml
new file mode 100644
index 000000000..53ddc2862
--- /dev/null
+++ b/libs/date_time/xmldoc/time_zone_base.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time.time_zone_base">
+ <title>Time Zone (abstract)</title>
+
+ <link linkend="time_zone_base_intro">Introduction</link> --
+ <link linkend="time_zone_base_header">Header</link> --
+ <link linkend="time_zone_base_constr">Construction</link> --
+ <link linkend="time_zone_base_accessors">Accessors</link>
+
+ <anchor id="time_zone_base_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The time_zone_base class is an abstract base class template for representing time zones. Time zones are a set of data and rules that provide information about a time zone. The date_time library handles time_zones by means of a boost::shared_ptr&lt;time_zone_base&gt;. A user's custom time zone class will work in the date_time library by means of this shared_ptr.
+ </para>
+ <para>
+ For convienience, the time_zone_base class is typedef'd as time_zone. All references in the documentation to time_zone, are referring to this typedef.
+ </para>
+
+ <anchor id="time_zone_base_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ The time_zone_base class is defined in the header:
+ <programlisting>#include "boost/date_time/time_zone_base.hpp"
+ </programlisting>
+ </para>
+
+ <anchor id="time_zone_base_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ A default constructor is provided in the time_zone_base class. There are no private data members in this base class to initialize.
+ </para>
+ <para>
+ Template parameters are time_type (typically posix_time::ptime) and CharT (defaults to char).
+ </para>
+
+ <anchor id="time_zone_base_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ All of the accessors listed here are pure virtual functions.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top"><screen>
+string_type dst_zone_abbrev();</screen></entry>
+ <entry>Returns the daylight savings abbreviation for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+string_type std_zone_abbrev();</screen></entry>
+ <entry>Returns the standard abbreviation for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+string_type dst_zone_name();</screen></entry>
+ <entry>Returns the daylight savings name for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+string_type std_zone_name();</screen></entry>
+ <entry>Returns the standard name for the represented time zone.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>bool has_dst();</screen></entry>
+ <entry>Returns true if this time zone does not make a daylight savings shift.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+time_type dst_local_start_time(year_type);</screen></entry>
+ <entry>The date and time daylight savings time begins in given year.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+time_type dst_local_end_time(year_type);</screen></entry>
+ <entry valign="top">The date and time daylight savings time ends in given year.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+time_duration_type base_utc_offset();</screen></entry>
+ <entry>The amount of time offset from UTC (typically in hours).</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+time_duration_type dst_offset();</screen></entry>
+ <entry>The amount of time shifted during daylight savings.</entry>
+ </row>
+ <row>
+ <entry valign="top"><screen>
+std::string to_posix_string();</screen></entry>
+ <entry>Returns a posix time zone string representation of this time_zone_base object. For a detailed description of a posix time zone string see <link linkend="date_time.local_time.posix_time_zone">posix_time_zone</link>.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/tradeoffs.xml b/libs/date_time/xmldoc/tradeoffs.xml
new file mode 100644
index 000000000..4b72f9697
--- /dev/null
+++ b/libs/date_time/xmldoc/tradeoffs.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.tradeoffs">
+ <title>Tradeoffs: Stability, Predictability, and Approximations</title>
+ <bridgehead renderas="sect2">
+ Unavoidable Trade-offs
+ </bridgehead>
+ <para>
+ The library does its best to provide everything a user could want, but there are certain inherent constraints that limit what <emphasis>any</emphasis> temporal library can do. Specifically, a user must choose which two of the following three capabilities are desired in any particular application:
+ <itemizedlist mark="bullet">
+ <listitem>exact agreement with wall-clock time</listitem>
+ <listitem>accurate math, e.g. duration calculations</listitem>
+ <listitem>ability to handle timepoints in the future</listitem>
+ </itemizedlist>
+ Some libraries may implicitly promise to deliver all three, but if you actually put them to the test, only two can be true at once. This limitation is not a deficiency in the design or implementation of any particular library; rather it is a consequence of the way different time systems are defined by international standards. Let's look at each of the three cases:
+ </para>
+ <para>
+ If you want exact agreement with wall-clock time, you must use either UTC or local time. If you compute a duration by subtracting one UTC time from another and you want an answer accurate to the second, the two times must not be too far in the future because leap seconds affect the count but are only determined about 6 months in advance. With local times a future duration calculation could be off by an entire hour, since legislatures can and do change DST rules at will.
+ </para>
+ <para>
+ If you want to handle wall-clock times in the future, you won't be able (in the general case) to calculate exact durations, for the same reasons described above.
+ </para>
+ <para>
+ If you want accurate calculations with future times, you will have to use TAI or an equivalent, but the mapping from TAI to UTC or local time depends on leap seconds, so you will not have exact agreement with wall-clock time.
+ </para>
+
+ <bridgehead renderas="sect2">
+ Stability, Predictability, and Approximations
+ </bridgehead>
+ <para>
+ Here is some underlying theory that helps to explain what's going on. Remember that a temporal type, like any abstract data type (ADT), is a set of values together with operations on those values.
+ </para>
+
+ <bridgehead renderas="sect3">
+ Stability
+ </bridgehead>
+ <para>
+ The representation of a type is <emphasis>stable</emphasis> if the bit pattern associated with a given value does not change over time. A type with an unstable representation is unlikely to be of much use to anyone, so we will insist that any temporal library use only stable representations.
+ </para>
+ <para>
+ An operation on a type is stable if the result of applying the operation to a particular operand(s) does not change over time.
+ </para>
+
+ <bridgehead renderas="sect3">
+ Predictability
+ </bridgehead>
+ <para>
+ Sets are most often classified into two categories: well-defined and ill-defined. Since a type is a set, we can extend these definitions to cover types. For any type T, there must be a predicate <emphasis>is_member( x )</emphasis> which determines whether a value x is a member of type T. This predicate must return <emphasis>true, false,</emphasis> or <emphasis>dont_know</emphasis>.
+ </para>
+ <para>
+ If for all x, is_member( x ) returns either true or false, we say the set T is <emphasis>well-defined</emphasis>.
+ </para>
+ <para>
+ If for any x, is_member( x ) returns dont_know, we say the set T is <emphasis>ill-defined</emphasis>.
+ </para>
+ <para>
+ Those are the rules normally used in math. However, because of the special characteristics of temporal types, it is useful to refine this view and create a third category as follows:
+ </para>
+ <para>
+ For any temporal type T, there must be a predicate <emphasis>is_member( x, t )</emphasis> which determines whether a value x is a member of T. The parameter t represents the time when the predicate is evaluated. For each x<subscript>i</subscript>, there must be a time t<subscript>i</subscript> and a value v such that:
+ <itemizedlist mark="bullet">
+ <listitem>v = true or v = false, and</listitem>
+ <listitem>for all t &lt; t<subscript>i</subscript>, is_member( x<subscript>i</subscript>, t ) returns dont_know, and</listitem>
+ <listitem>for all t >= t<subscript>i</subscript>, is_member( x<subscript>i</subscript>, t ) returns v.</listitem>
+ </itemizedlist>
+ t<subscript>i</subscript> is thus the time when we "find out" whether x<subscript>i</subscript> is a member of T. Now we can define three categories of temporal types:
+ </para>
+ <para>
+ If for all x<subscript>i</subscript>, t<subscript>i</subscript> = negative infinity, we say the type T is <emphasis>predictable</emphasis>.
+ </para>
+ <para>
+ If for some x<subscript>i</subscript>, t<subscript>i</subscript> = positive infinity, we say the type T is <emphasis>ill-formed</emphasis>.
+ </para>
+ <para>
+ Otherwise we say the type T is <emphasis>unpredictable</emphasis> (this implies that for some x<subscript>i</subscript>, t<subscript>i</subscript> is finite).
+ </para>
+ <para>
+ Ill-formed sets are not of much practical use, so we will not discuss them further. In plain english the above simply says that all the values of a predictable type are known ahead of time, but some values of an unpredictable type are not known until some particular time.
+ </para>
+
+ <bridgehead renderas="sect3">
+ Stability of Operations
+ </bridgehead>
+ <para>
+ Predictable types have a couple of important properties:
+ <itemizedlist mark="bullet">
+ <listitem>there is an order-preserving mapping from their elements onto a set of consecutive integers, and</listitem>
+ <listitem>duration operations on their values are stable</listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ The practical effect of this is that duration calculations can be implemented with simple integer subtraction. Examples of predictable types are TAI timepoints and Gregorian dates.
+ </para>
+ <para>
+ Unpredictable types have exactly the opposite properties:
+ <itemizedlist mark="bullet">
+ <listitem>there is no order-preserving mapping from their elements onto a set of consecutive integers, and</listitem>
+ <listitem>duration operations on their values are not stable. </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Examples of unpredictable types are UTC timepoints and Local Time timepoints.
+ </para>
+ <para>
+ We can refine this a little by saying that a range within an unpredicatable type can be predictable, and operations performed entirely on values within that range will be stable. For example, the range of UTC timepoints from 1970-01-01 through the present is predictable, so calculations of durations within that range will be stable.
+ </para>
+
+ <bridgehead renderas="sect3">
+ Approximations
+ </bridgehead>
+ <para>
+ These limitations are problematical, because important temporal types like UTC and Local Time are in fact unpredictable, and therefore operations on them are sometimes unstable. Yet as a practical matter we often want to perform this kind of operation, such as computing the duration between two timepoints in the future that are specified in Local Time.
+ </para>
+ <para>
+ The best the library can do is to provide an approximation, which is generally possible and for most purposes will be good enough. Of course the documentation must specify when an answer will be approximate (and thus unstable) and how big the error may be. In many respects calculating with unpredictable sets is analogous to the use of floating point numbers, for which results are expected to only be approximately correct. Calculating with predictable sets would then be analogous to the user of integers, where results are expected to be exact.
+ </para>
+ <para>
+ For situations where exact answers are required or instability cannot be tolerated, the user must be able to specify this, and then the library should throw an exception if the user requests a computation for which an exact, stable answer is not possible.
+ </para>
+</section>
diff --git a/libs/date_time/xmldoc/tz_database.xml b/libs/date_time/xmldoc/tz_database.xml
new file mode 100644
index 000000000..b47ad1f9e
--- /dev/null
+++ b/libs/date_time/xmldoc/tz_database.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.local_time.tz_database">
+ <title>Time Zone Database</title>
+
+ <link linkend="tz_database_intro">Introduction</link> --
+ <link linkend="tz_database_header">Header</link> --
+ <link linkend="tz_database_constr">Construction</link> --
+ <link linkend="tz_database_accessors">Accessors</link> --
+ <link linkend="tz_database_datafile">Data File Details</link>
+
+ <anchor id="tz_database_intro" />
+ <bridgehead renderas="sect3">Introduction</bridgehead>
+ <para>
+ The local_time system depends on the ability to store time zone information. Our Time Zone Database (tz_database) is a means of permanently storing that data. The specifications for many time zones (377 at this time) are provided. These specifications are based on data found in the <ulink url="http://www.twinsun.com/tz/tz-link.htm">zoneinfo datebase</ulink>. The specifications are stored in the file:<screen>libs/date_time/data/date_time_zonespec.csv</screen>. While this file already contains specifications for many time zones, it's real intent is for the user to modify it by adding (or removing) time zones to fit their application. See <link linkend="tz_database_datafile">Data File Details</link> to learn how this is accomplished.
+ </para>
+
+ <anchor id="tz_database_header" />
+ <bridgehead renderas="sect3">Header</bridgehead>
+ <para>
+ The inclusion of a single header will bring in all boost::local_time types, functions, and IO operators.
+ <programlisting>#include "boost/date_time/local_time/local_time.hpp"
+ </programlisting>
+ </para>
+
+ <anchor id="tz_database_constr" />
+ <bridgehead renderas="sect3">Construction</bridgehead>
+ <para>
+ The only constructor takes no arguments and creates an empty database. It is up to the user to populate the database. This is typically achieved by loading the desired datafile, but can also be accomplished by means of the <code>add_record(...)</code> function (see the <link linkend="tz_database_accessors">Accessors table</link>). A <code>local_time::data_not_accessible</code> exception will be thrown if given zonespec file cannot be found. <code>local_time::bad_field_count</code> exception will be thrown if the number of fields in given zonespec file is incorrect.
+ </para>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>tz_database()</screen></entry>
+ <entry>Constructor creates an empty database.</entry>
+ </row>
+ <row>
+ <entry><screen>tz_database tz_db;</screen></entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>bool load_from_file(std::string)</screen></entry>
+ <entry>Parameter is path to a time zone spec csv file (see <link linkend="tz_database_datafile">Data File Details</link> for details on the contents of this file). This function populates the database with time zone records found in the zone spec file. A <code>local_time::data_not_accessible</code> exception will be thrown if given zonespec file cannot be found. <code>local_time::bad_field_count</code> exception will be thrown if the number of fields in given zonespec file is incorrect.</entry>
+ </row>
+ <row>
+ <entry><screen>tz_database tz_db;
+tz_db.load_from_file("./date_time_zonespec.csv");</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="tz_database_accessors" />
+ <bridgehead renderas="sect3">Accessors</bridgehead>
+ <para>
+ <informaltable frame="all">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry valign="top" morerows="1">Syntax</entry>
+ <entry>Description</entry>
+ </row>
+ <row>
+ <entry>Example</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry valign="top" morerows="1"><screen>bool tz_db.add_record(std::string id,
+ <link linkend="date_time.local_time.custom_time_zone_ptr">time_zone_ptr</link> tz);</screen></entry>
+ <entry>Adds a time_zone, or a posix_time_zone, to the database. ID is the region name for this zone (Ex: "America/Phoenix").</entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr zone(
+ new posix_time_zone("PST-8PDT,M4.1.0,M10.1.0")
+);
+std::string id("America/West_Coast");
+tz_db.add_record(id, zone);</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>time_zone_ptr
+ tz_db.time_zone_from_region(string id);</screen></entry>
+ <entry>Returns a time_zone, via a time_zone_ptr, that matches the region listed in the data file. A null pointer is returned if no match is found.
+ </entry>
+ </row>
+ <row>
+ <entry><screen>time_zone_ptr nyc =
+ tz_db.time_zone_from_region("America/New_York");</screen>
+ </entry>
+ </row>
+
+ <row>
+ <entry valign="top" morerows="1"><screen>vector&lt;string&gt; tz_db.region_list();</screen></entry>
+ <entry>Returns a vector of strings that holds all the region ID strings from the database.</entry>
+ </row>
+ <row>
+ <entry><screen>std::vector&lt;std::string&gt; regions;
+regions = tz_db.region_list();</screen>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ <anchor id="tz_database_datafile" />
+ <bridgehead renderas="sect3">Data File Details</bridgehead>
+ <link linkend="tz_database_fields">Field Description/Details</link>
+ <para>
+ The csv file containing the zone_specs used by the boost::local_time::tz_database is intended to be customized by the library user. When customizing this file (or creating your own) the file must follow a specific format.
+ </para>
+ <para>
+ This first line is expected to contain column headings and is therefore
+not processed by the tz_database.
+ </para>
+ <para>
+ Each record (line) must have eleven fields. Some of those fields can be empty. Every field (even empty ones) must be enclosed in double-quotes.
+ <literallayout>
+ Ex:
+ "America/Phoenix" &lt;- string enclosed in quotes
+ "" &lt;- empty field
+ </literallayout>
+ </para>
+ <para>
+ Some fields represent a length of time. The format of these fields must be:
+ <literallayout>
+ "{+|-}hh:mm[:ss]" &lt;- length-of-time format
+ </literallayout>
+ Where the plus or minus is mandatory and the seconds are optional.
+ </para>
+ <para>
+ Since some time zones do not use daylight savings it is not always necessary for every field in a zone_spec to contain a value. All zone_specs must have at least ID and GMT offset. Zones that use daylight savings must have all fields filled except: STD ABBR, STD NAME, DST NAME. You should take note that DST ABBR is mandatory for zones that use daylight savings (see field descriptions for further details).
+ </para>
+
+ <anchor id="tz_database_fields" />
+ <bridgehead renderas="sect3">Field Description/Details</bridgehead>
+ <para>
+ <itemizedlist>
+ <listitem>
+ ID
+ <para>
+ Contains the identifying string for the zone_spec. Any string will do as long as it's unique. No two ID's can be the same.
+ </para>
+ </listitem>
+ <listitem>
+ STD ABBR
+ </listitem>
+ <listitem>
+ STD NAME
+ </listitem>
+ <listitem>
+ DST ABBR
+ </listitem>
+ <listitem>
+ DST NAME
+ <para>
+ These four are all the names and abbreviations used by the time zone being described. While any string will do in these fields, care should be taken. These fields hold the strings that will be used in the output of many of the local_time classes.
+ </para>
+ </listitem>
+ <listitem>
+ GMT offset
+ <para>
+ This is the number of hours added to utc to get the local time before any daylight savings adjustments are made. Some examples are: America/New_York offset -5 hours, and Africa/Cairo offset +2 hours. The format must follow the length-of-time format described above.
+ </para>
+ </listitem>
+ <listitem>
+ DST adjustment
+ <para>
+ The amount of time added to gmt_offset when daylight savings is in effect. The format must follow the length-of-time format described above.
+ </para>
+ <para>
+ NOTE: more rule capabilities are needed - this portion of the tz_database is incomplete
+ </para>
+ </listitem>
+ <listitem>
+ DST Start Date rule
+ <para>
+ This is a specially formatted string that describes the day of year in which the transition take place. It holds three fields of it's own, separated by semicolons.
+ <orderedlist>
+ <listitem>
+ The first field indicates the "nth" weekday of the month. The possible values are: 1 (first), 2 (second), 3 (third), 4 (fourth), 5 (fifth), and -1 (last).
+ </listitem>
+ <listitem>
+ The second field indicates the day-of-week from 0-6 (Sun=0).
+ </listitem>
+ <listitem>
+ The third field indicates the month from 1-12 (Jan=1).
+ </listitem>
+ </orderedlist>
+ Examples are: "-1;5;9"="Last Friday of September", "2;1;3"="Second Monday of March"
+ </para>
+ </listitem>
+ <listitem>
+ Start time
+ <para>
+ Start time is the number of hours past midnight, on the day of the start transition, the transition takes place. More simply put, the time of day the transition is made (in 24 hours format). The format must follow the length-of-time format described above with the exception that it must always be positive.
+ </para>
+ </listitem>
+ <listitem>
+ DST End date rule
+ <para>
+ See DST Start date rule. The difference here is this is the day daylight savings ends (transition to STD).
+ </para>
+ </listitem>
+ <listitem>
+ End time
+ <para>
+ Same as Start time.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+</section>
diff --git a/libs/date_time/xmldoc/usage_examples.xml b/libs/date_time/xmldoc/usage_examples.xml
new file mode 100644
index 000000000..541be695c
--- /dev/null
+++ b/libs/date_time/xmldoc/usage_examples.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+"../../../tools/boostbook/dtd/boostbook.dtd">
+
+<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
+ 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)
+-->
+
+<section id="date_time.examples.general_usage_examples">
+ <title>General Usage Examples</title>
+
+ <para>
+ The following provides some sample usage of dates.
+ See <link linkend="date_time.gregorian">Date Programming</link>
+ for more details.
+
+ <programlisting><emphasis role="keyword">using namespace</emphasis> boost::gregorian;
+ date weekstart(<emphasis role="number">2002</emphasis>,Feb,<emphasis role="number">1</emphasis>);
+ date weekend = weekstart + weeks(<emphasis role="number">1</emphasis>);
+ date d2 = d1 + days(<emphasis role="number">5</emphasis>);
+ date today = day_clock::local_day();
+ if (d2 &gt;= today) {} <emphasis role="comment">//date comparison operators</emphasis>
+
+ date_period thisWeek(d1,d2);
+ <emphasis role="keyword">if</emphasis> (thisWeek.contains(today)) {}<emphasis role="comment">//do something
+
+ //iterate and print the week</emphasis>
+ day_iterator itr(weekstart);
+ <emphasis role="keyword">while</emphasis> (itr &lt;= weekend) {
+ std::cout &lt;&lt; (*itr) &lt;&lt; std::endl;
+ ++itr;
+ }
+ <emphasis role="comment">//input streaming</emphasis>
+ std::stringstream ss(<emphasis role="string">"2004-Jan-1"</emphasis>);
+ ss &gt;&gt; d3;
+
+ <emphasis role="comment">//date generator functions</emphasis>
+ date d5 = next_weekday(d4, Sunday); <emphasis role="comment">//calculate Sunday following d4
+
+ //US labor day is first Monday in Sept</emphasis>
+ <emphasis role="keyword">typedef</emphasis> nth_day_of_the_week_in_month nth_dow;
+ nth_dow labor_day(nth_dow::first,Monday, Sep);
+ <emphasis role="comment">//calculate a specific date for 2004 from functor</emphasis>
+ date d6 = labor_day.get_date(<emphasis role="number">2004</emphasis>);
+ </programlisting>
+
+ The following provides some example code using times.
+ See <link linkend="date_time.posix_time">Time Programming</link>
+ for more details.
+
+ <programlisting><emphasis role="keyword">using namespace</emphasis> boost::posix_time;
+ date d(<emphasis role="number">2002</emphasis>,Feb,<emphasis role="number">1</emphasis>); <emphasis role="comment">//an arbitrary date</emphasis>
+ ptime t1(d, hours(<emphasis role="number">5</emphasis>)+nanosec(<emphasis role="number">100</emphasis>)); <emphasis role="comment">//date + time of day offset</emphasis>
+ ptime t2 = t1 - minutes(<emphasis role="number">4</emphasis>)+seconds(<emphasis role="number">2</emphasis>);
+ ptime now = second_clock::local_time(); <emphasis role="comment">//use the clock</emphasis>
+ date today = now.date(); <emphasis role="comment">//Get the date part out of the time</emphasis>
+ date tomorrow = today + date_duration(<emphasis role="number">1</emphasis>);
+ ptime tomorrow_start(tomorrow); <emphasis role="comment">//midnight
+
+ //input streaming</emphasis>
+ std::stringstream ss(<emphasis role="string">"2004-Jan-1 05:21:33.20"</emphasis>);
+ ss &gt;&gt; t2;
+
+ <emphasis role="comment">//starting at current time iterator adds by one hour</emphasis>
+ time_iterator titr(now,hours(<emphasis role="number">1</emphasis>));
+ <emphasis role="keyword">for</emphasis> (; titr &lt; tomorrow_start; ++titr) {
+ std::cout &lt;&lt; (*titr) &lt;&lt; std::endl;
+ }
+ </programlisting>
+ </para>
+
+ <para>
+ The following provides some example code using times.
+ See <link linkend="date_time.local_time">Local Time Programming</link>
+ for more details.
+
+ <programlisting>
+ <emphasis role="keyword">using namespace</emphasis> boost::local_time;
+ <emphasis role="comment">//setup some timezones for creating and adjusting times
+ //first time zone uses the time zone file for regional timezone definitions</emphasis>
+ tz_database tz_db;
+ tz_db.load_from_file(<emphasis role="string">"date_time_zonespec.csv"</emphasis>);
+ time_zone_ptr nyc_tz = tz_db.time_zone_from_region(<emphasis role="string">"America/New_York"</emphasis>);
+ <emphasis role="comment">//This timezone uses a posix time zone string definition to create a time zone</emphasis>
+ time_zone_ptr phx_tz(new posix_time_zone(<emphasis role="string">"MST-07:00:00"</emphasis>));
+
+ <emphasis role="comment">//local departure time in phoenix is 11 pm on April 2 2005
+ // Note that New York changes to daylight savings on Apr 3 at 2 am)</emphasis>
+ local_date_time phx_departure(date(<emphasis role="number">2005</emphasis>, Apr, <emphasis role="number">2</emphasis>), hours(<emphasis role="number">23</emphasis>), phx_tz,
+ local_date_time::NOT_DATE_TIME_ON_ERROR);
+
+ time_duration flight_length = hours(<emphasis role="number">4</emphasis>) + minutes(<emphasis role="number">30</emphasis>);
+ local_date_time phx_arrival = phx_departure + flight_length;
+ <emphasis role="comment">//convert the phx time to a nyz time</emphasis>
+ local_date_time nyc_arrival = phx_arrival.local_time_in(nyc_tz);
+
+ <emphasis role="comment">//2005-Apr-03 06:30:00 EDT</emphasis>
+ std::cout &lt;&lt; nyc_arrival &lt;&lt; std::endl;
+ </programlisting>
+ </para>
+
+</section>