early-access version 3088

This commit is contained in:
pineappleEA
2022-11-05 15:35:56 +01:00
parent 4e4fc25ce3
commit b601909c6d
35519 changed files with 5996896 additions and 860 deletions

View File

@@ -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 set ;
using boostbook ;
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.

View File

@@ -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)

View File

@@ -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>

View File

@@ -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/example/gregorian -- example programs for dates
/libs/date_time/example/posix_time -- time example programs
/libs/date_time/example/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/lexical_cast/index.html">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>

View File

@@ -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>

View File

@@ -0,0 +1,898 @@
<?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.73 to 1.74 </bridgehead>
<informaltable frame="all">
<tgroup cols="2">
<thead>
<row>
<entry>Type</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>Bug-Fix</entry>
<entry>
Fix constrained_value::assign to be constexpr so ptime and date construction are constexpr. See:
<ulink url="https://github.com/boostorg/date_time/pull/161">pull 161</ulink> and
<ulink url="https://github.com/boostorg/date_time/pull/162">pull 161</ulink>.
</entry>
</row>
<row>
<entry>Bug-Fix</entry>
<entry>
Suppress MSVC CRT deprecations on Clang. See:
<ulink url="https://github.com/boostorg/date_time/pull/160">pull 160</ulink>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<bridgehead renderas="sect3">Changes from Boost 1.72 to 1.73 </bridgehead>
<informaltable frame="all">
<tgroup cols="2">
<thead>
<row>
<entry>Type</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>Enhancement</entry>
<entry>
Make date_time all inline. Users no longer need to link the library for any library functions.
Note that an empty stub library is maintained for backward compatibility. Resolves:
(<ulink url="https://github.com/boostorg/date_time/issues/134">github issue #134</ulink>) and
(<ulink url="https://github.com/boostorg/date_time/issues/85">github issue #85</ulink>).
Remove the link library to resolve linking/visibility concerns
</entry>
</row>
<row>
<entry>Enhancement</entry>
<entry>
Support for constexpr has been added when in c++14 mode and above. For example:
<code>
constexpr microseconds ms(1000);
static_assert(ms.total_microseconds() == 1000, "constexpr total_microseconds");
</code>
(<ulink url="https://github.com/boostorg/date_time/issues/123">github issue #123</ulink>).
</entry>
</row>
<row>
<entry>Enhancement</entry>
<entry>
C++20 ambiguous comparison operator warning with clang 10
(<ulink url="https://github.com/boostorg/date_time/issues/132">github issue #132</ulink>).
</entry>
</row>
<row>
<entry>Cleanup</entry>
<entry>
Deprecated support for legacy io and USE_DATE_TIME_PRE_1_33_FACET_IO macro
(<ulink url="https://github.com/boostorg/date_time/issues/61">github issue #61</ulink>).
</entry>
</row>
<row>
<entry>Bug Fix</entry>
<entry>
Documentation clarifications for gettimeofday, day_number, and from_iso_extended_string.
<ulink url="https://github.com/boostorg/date_time/issues/127">github issue #127</ulink>
<ulink url="https://github.com/boostorg/date_time/issues/125">github issue #125</ulink>, and
<ulink url="https://github.com/boostorg/date_time/issues/116">github issue #116</ulink>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,208 @@
<?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. Can return the given date.</entry>
</row>
<row>
<entry><screen>date d(2004,Jun,1); // Tuesday
greg_weekday gw1(Friday);
greg_weekday gw2(Tuesday);
next_weekday(d, gw1); // 2004-Jun-4
next_weekday(d, gw2); // 2004-Jun-1
</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. Can return the given date. </entry>
</row>
<row>
<entry><screen>date d(2004,Jun,1); // Tuesday
greg_weekday gw1(Friday);
greg_weekday gw2(Tuesday);
previous_weekday(d, gw1); // 2004-May-28
previous_weekday(d, gw2); // 2004-Jun-1
</screen>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>

View File

@@ -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_of_week(); // --> 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(pos_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_isdst => -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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.is_null() --> 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>

View File

@@ -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$">
<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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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$">
<title>The Boost Date Time Library</title>
<xi:include href="./date_time.xml"/>
</boostbook>

View File

@@ -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) 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. When used to parse input, the leading zero is optional.
</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.
When used to parse input, the leading space is optional.
</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>

View File

@@ -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>

View File

@@ -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 mapping is implementation defined, however the library implements the 1400-01-01 epoch as follows <screen> date(gregorian_calendar::epoch()).day_number() == 2232400</screen></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>

File diff suppressed because it is too large Load Diff

View File

@@ -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/example/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>

View File

@@ -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>

View File

@@ -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_isdst => 1 */</screen>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,574 @@
<?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>
<row>
<entry valign="top" morerows="1"><screen>ptime from_iso_extended_string(std::string)</screen></entry>
<entry>From delimited iso form string.</entry>
</row>
<row>
<entry><screen>std::string ts("2020-01-31T23:59:59.123");
ptime t(from_iso_extended_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_isdst => -1 */</screen>
</entry>
</row>
<row>
<entry valign="top" morerows="1"><screen>ptime ptime_from_tm(tm timetm)</screen></entry>
<entry>A function for converting a <code>tm</code> struct to a <code>ptime</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_isdst => -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>

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,621 @@
<?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:10
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>boost::int64_t 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>boost::int64_t 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>boost::int64_t seconds() const</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>boost::int64_t total_seconds() const</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>boost::int64_t total_milliseconds() const</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>boost::int64_t total_microseconds() const</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>boost::int64_t total_nanoseconds() const</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>boost::int64_t fractional_seconds() const</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() const</screen></entry>
<entry>True if and only 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>bool is_zero() const</screen></entry>
<entry>True if and only if duration is zero.</entry>
</row>
<row>
<entry><screen>time_duration td(0,0,0);
td.is_zero(); // --> true</screen></entry>
</row>
<row>
<entry valign="top" morerows="1"><screen>bool is_positive() const</screen></entry>
<entry>True if and only if duration is positive.</entry>
</row>
<row>
<entry><screen>time_duration td(1,0,0);
td.is_positive(); // --> true</screen></entry>
</row>
<row>
<entry valign="top" morerows="1"><screen>time_duration invert_sign() const</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>time_duration abs() const</screen></entry>
<entry>Generate a new duration with the absolute value of the time duration.</entry>
</row>
<row>
<entry><screen>time_duration td(-1,0,0);
td.abs(); // --> 01:00:00</screen></entry>
<entry><screen>time_duration td(+1,0,0);
td.abs(); // --> 01:00:00</screen></entry>
</row>
<row>
<entry valign="top" morerows="1"><screen>date_time::time_resolutions time_duration::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>unsigned short time_duration::num_fractional_digits()</screen></entry>
<entry>Returns 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>boost::int64_t 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 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_isdst => -1 */</screen>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>