<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>time_get</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="swap-ranges.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="time-get-byname.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>time_get</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-6.html">Localization</A></P>

<PRE><HR>        <IMG SRC="images/inherits.gif"> <B><I>time_base</I></B> 
<B><I>time_get</I></B> 
        <IMG SRC="images/inherits.gif"> <B><I>locale::facet</I></B> <HR></PRE>
<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Specializations</A></LI>
<LI><A HREF="#sec5">Description</A></LI>
<LI><A HREF="#sec6">Interface</A></LI>
<LI><A HREF="#sec7">Member Types</A></LI>
<LI><A HREF="#sec8">Constructors</A></LI>
<LI><A HREF="#sec9">Destructor</A></LI>
<LI><A HREF="#sec10">Facet ID</A></LI>
<LI><A HREF="#sec11">Public Member Functions</A></LI>
<LI><A HREF="#sec12">Extensions of this Implementation</A></LI>
<LI><A HREF="#sec13">Protected Member Functions</A></LI>
<LI><A HREF="#sec14">Extension of this Implementation</A></LI>
<LI><A HREF="#sec15">Example</A></LI>
<LI><A HREF="#sec16">See Also</A></LI>
<LI><A HREF="#sec17">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
<H4>Members</H4>
<UL><TABLE CELLPADDING=3>
<TR><TD VALIGN=top>
<A HREF="#idx1227">char_type</A><BR>
<A HREF="#idx1232">date_order()</A><BR>
<A HREF="#idx1235">do_date_order()</A><BR>
<A HREF="#idx1241">do_get()</A><BR>
<A HREF="#idx1236">do_get_date()</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx1237">do_get_monthname()</A><BR>
<A HREF="#idx1238">do_get_time()</A><BR>
<A HREF="#idx1239">do_get_weekday()</A><BR>
<A HREF="#idx1240">do_get_year()</A><BR>
<A HREF="#idx1233">get()</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx1232">get_date()</A><BR>
<A HREF="#idx1232">get_monthname()</A><BR>
<A HREF="#idx1232">get_time()</A><BR>
<A HREF="#idx1232">get_weekday()</A><BR>
<A HREF="#idx1232">get_year()</A><BR>
</TD>
<TD VALIGN=top><A HREF="#idx1231">id</A><BR>
<A HREF="#idx1228">iter_type</A><BR>
<A HREF="#idx1229">time_get()</A><BR>
<A HREF="#idx1230">~time_get()</A><BR>
</TD></TR>
</TABLE></UL>

<A NAME="sec2"><H3>Summary</H3></A>
<P>A time formatting facet for input, and for parsing of date and time values </P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;locale&gt;

namespace std {
  class time_base;
  template &lt;class charT, class InputIterator = 
              istreambuf_iterator&lt;charT&gt; &gt;
  class time_get;
}
</PRE>
<A NAME="sec4"><H3>Specializations</H3></A>
<P>The primary template can be implicitly or explicitly specialized on any character type that satisfies the requirements on the type of character used by iostream class templates, and on any iterator type that satisfies the requirements of Input Iterator.</P>
<A NAME="sec5"><H3>Description</H3></A>
<P>Members of the <B><I>time_get</I></B> facet extract time and date components from a sequence of characters and store the resulting values in one or more members of a <SAMP>struct tm</SAMP> argument. The functions parse the input sequence according to the same locale-specific format as the one used by the <A HREF="time-put.html">time_put</A> facet to format time and date values. If the sequence does not match the format, the facet indicates an error by setting <SAMP>ios_base::failbit</SAMP> in <SAMP>err</SAMP>. See member function descriptions for details.</P>
<P>The <B><I>time_base</I></B> class includes a set of values for specifying the order in which the three parts of a date appear. The <SAMP>dateorder</SAMP> function returns one of these five possible values, as illustrated in <A HREF="time-get.html#Table&nbsp;33">Table&nbsp;33</A>:</P>
<H4><A NAME="Table&nbsp;33">Table&nbsp;33: Possible values of the dateorder function of the time_base class&nbsp;</A></H4>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="3">
<tr><td valign=top><B>Order</B>
</td>
<td valign=top><B>Meaning</B>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>no_order</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Date format has no set ordering</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>dmy</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Date order is day, month, year</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>mdy</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Date order is month, day, year</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>ymd</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Date order is year, month, day</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>ydm</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Date order is year, day, month</P>
</td>
</tr>
</TABLE>
<A NAME="sec6"><H3>Interface</H3></A>

<UL><PRE>namespace std {
  class time_base {
    public:
    enum dateorder { no_order, dmy, mdy, ymd, ydm };
  };

  template &lt;class charT, class InputIterator = 
            istreambuf_iterator&lt;charT&gt; &gt;
  class time_get : public locale::facet, public time_base {

    public:
    typedef charT  char_type;
    typedef InputIterator  iter_type;
    explicit time_get(size_t = 0);
    dateorder date_order()  const;
    iter_type get_time(iter_type, iter_type, ios_base&amp;,
                       ios_base::iostate&amp;, tm*)  const;
    iter_type get_date(iter_type, iter_type, ios_base&amp;,
                       ios_base::iostate&amp;, tm*)  const;
    iter_type get_weekday(iter_type, iter_type, ios_base&amp;,
                          ios_base::iostate&amp;, tm*) const;
    iter_type get_monthname(iter_type, iter_type, ios_base&amp;,
                            ios_base::iostate&amp;, tm*) const;
    iter_type get_year(iter_type, iter_type, ios_base&amp;,
                       ios_base::iostate&amp;, tm*) const;

     // extension of this implementation 
     iter_type
     get (iter_type, iter_type, ios_base&amp;, ios_base::iostate&amp;,
          tm*, const char_type*, const char_type*) const; 

     // extension of this implementation 
     iter_type 
     get (iter_type, iter_type, ios_base&amp;, ios_base::iostate&amp;,
          tm*, char, char) const;

    static locale::id id;

    protected:
    virtual dateorder do_date_order()  const;
    virtual iter_type do_get_time(iter_type, iter_type,
           ios_base&amp;, ios_base::iostate&amp;, tm*) const;
    virtual iter_type do_get_date(iter_type, iter_type,
          ios_base&amp;, ios_base::iostate&amp;, tm*) const;
    virtual iter_type do_get_weekday(iter_type, iter_type,
          ios_base&amp;, ios_base::iostate&amp;, tm*) const;
    virtual iter_type do_get_monthname(iter_type, iter_type,
          ios_base&amp;, ios_base::iostate&amp;, tm*) const;
    virtual iter_type do_get_year(iter_type, iter_type,
          ios_base&amp;, ios_base::iostate&amp;, tm*) const;
 
    // extension of this implementation 
    virtual iter_type 
    do_get (iter_type, iter_type, ios_base&amp;, ios_base::iostate&amp;,
            tm*, char, char) const;
  };
}
</PRE></UL>
<A NAME="sec7"><H3>Member Types</H3></A>

<A NAME="idx1227"></A><PRE><B>char_type</B></PRE>
<UL>
<P>Type of the first template argument, <SAMP>charT</SAMP>.</P>
</UL>


<A NAME="idx1228"></A><PRE><B>iter_type</B></PRE>
<UL>
<P>Type of the second template argument, <SAMP>InputIterator</SAMP>.</P>
</UL>

<A NAME="sec8"><H3>Constructors</H3></A>

<A NAME="idx1229"></A><PRE>explicit <B>time_get</B>(size_t refs = 0) </PRE>
<UL>
<P>Constructs a <B><I>time_get</I></B> object. Calls<SAMP> locale::facet (refs)</SAMP>.</P>
<P>The <SAMP>refs</SAMP> argument is set to the initial value of the <B><I>time_get</I></B> object's reference count. A <B><I>time_get</I></B> object <SAMP>f</SAMP> constructed with <SAMP>(refs == 0)</SAMP> that is installed in one or more locale objects will be destroyed and the storage it occupies will be deallocated when the last locale object containing the facet is destroyed, as if by calling <SAMP>delete</SAMP> <SAMP>static_cast&lt;locale::facet*&gt;(&amp;f)</SAMP>. </P>
<P>A <B><I>time_get</I></B> object constructed with <SAMP>(refs != 0)</SAMP> will not be destroyed by any locale objects in which it may have been installed. </P>
</UL>

<A NAME="sec9"><H3>Destructor</H3></A>

<A NAME="idx1230"></A><PRE>virtual <B>~time_get</B>();</PRE>
<UL>
<P>Destroys the facet.</P>
</UL>

<A NAME="sec10"><H3>Facet ID</H3></A>

<A NAME="idx1231"></A><PRE>static locale::id <B>id</B>;</PRE>
<UL>
<P>Unique identifier for this type of facet. </P>
</UL>

<A NAME="sec11"><H3>Public Member Functions</H3></A>
<P>The public members of the <B><I>time_get</I></B> facet include an interface to protected members. Each public member function <SAMP>get_xxx()</SAMP> calls the corresponding protected virtual member function <SAMP>do_get_xxx()</SAMP>. For instance, the public function <SAMP>get_time()</SAMP> calls its protected cousin <SAMP>do_get_time()</SAMP>. The result   of the call may be cached. Subsequent calls to the public function with the same arguments may return the cached result to avoid the expense of repeatedly calling the virtual function.</P>

<A NAME="idx1232"></A><PRE>dateorder 
<B>date_order</B>()  const; 
iter_type 
<B>get_date</B>(iter_type s, iter_type end, ios_base&amp; f,
         ios_base::iostate&amp; err, tm* t)  const; 
iter_type 
<B>get_monthname</B>(iter_type s, iter_type end, ios_base&amp; f,
              ios_base::iostate&amp; err, tm* t) const; 
iter_type 
<B>get_time</B>(iter_type s, iter_type end, ios_base&amp; f,
         ios_base::iostate&amp; err, tm* t)  const; 
iter_type 
<B>get_weekday</B>(iter_type s, iter_type end, ios_base&amp; f,
            ios_base::iostate&amp; err, tm* t) const; 
iter_type 
<B>get_year</B>(iter_type s, iter_type end, ios_base&amp; f,
         ios_base::iostate&amp; err, tm* t) const; </PRE>
<UL>
<P>Each of these public functions calls the corresponding protected virtual <SAMP>do_xxx()</SAMP> function.</P>
</UL>

<A NAME="sec12"><H3>Extensions of this Implementation</H3></A>

<A NAME="idx1233"></A><PRE>iter_type 
<B>get</B> (iter_type s, iter_type end, ios_base &amp;io,<br>     ios_base::iostate &amp;err,tm *t, const char_type *pat, const<br>     char_type *pat_end) const; </PRE>
<P>The function iterates over characters in the range  <SAMP>[pat,  pat_end)</SAMP> that is composed of zero or more directives. Each directive is composed as follows: either a non-empty sequence of white-space characters (as determined by <SAMP>isspace(io.getloc(), c)</SAMP>); or an ordinary character other than <SAMP>'%'</SAMP> or white-space; or a conversion specification. Each conversion specification   is composed of a leading <SAMP>'%'</SAMP> character followed by an optional conversion modifier, <SAMP>mod</SAMP>, and then by a conversion specifier, <SAMP>fmt</SAMP>, which determines the interpretation of the input character(s). The modifier and specifier characters are obtained by converting the (possibly wide) characters following the leading <SAMP>'%'</SAMP> character extracted from the input sequence as if by <SAMP>use_facet&lt;ctype&lt;char_type&gt; &gt;(io.getloc()).narrow(c, '\0')</SAMP>.        </P>
<P>For each ordinary character other than white-space, the function extracts a character from the input sequence and compares the two.   If they are not equal, the function indicates an error by setting <SAMP>ios_base::failbit</SAMP> in <SAMP>err</SAMP> and the algorithm terminates. If the function reaches the end of the input sequence, it sets  <SAMP>ios_base::eofbit</SAMP> in  <SAMP>err</SAMP> and the algorithm terminates.</P>
<P>For each white-space character, the function extracts any white-space characters from the input sequence until it encounters a character other than white-space. If the function reaches   the   end   of   the   input   sequence,   it   sets <SAMP>ios_base::eofbit</SAMP> in <SAMP>err</SAMP> and the algorithm terminates.</P>
<P>For each conversion specification given by the characters <SAMP>fmt</SAMP> and <SAMP>mod</SAMP>, the function performs <SAMP>s = get (s, end, io, errtmp, t, fmt,  mod)</SAMP> with a <SAMP>errtmp</SAMP> argument of type <SAMP>ios_base::iostate</SAMP> initialized to  <SAMP>ios_base::good</SAMP>. If <SAMP>(errtmp  != ios_base::good)</SAMP> evaluates to true after the call, the function performs <SAMP>err |= errtmp</SAMP> and the algorithm terminates.</P>
<P>Returns an iterator pointing just beyond the last extracted character.</P>

<A NAME="idx1234"></A><PRE>
iter_type 
<B>get</B> (iter_type s, iter_type end, ios_base &amp;io, <br>     ios_base::iostate &amp;err, tm *t, char fmt, char mod = '\0')<br>     const; </PRE>
<UL>
<P>Returns <SAMP>do_get (s, end, io, err, t, fmt, mod)</SAMP>.</P>
</UL>

<A NAME="sec13"><H3>Protected Member Functions</H3></A>
<P>The facet functions parse the string input sequence according to the same locale-specific format as the one used by the <A HREF="time-put.html">time_put</A> facet to format time and date values. If the input sequence does not match the expected format, the functions indicate an error by setting <SAMP>ios_base::failbit</SAMP> in <SAMP>err</SAMP>. If the functions reach the end of the input sequence while attempting to extract additional characters, they set <SAMP>ios_base::eofbit</SAMP> in <SAMP>err</SAMP>. The <SAMP>io</SAMP> argument is used to obtain a reference to the <SAMP>ctype&lt;char_type&gt;</SAMP> facet installed in the object's locale. </P>
<P>The behavior of the functions is undefined if the <SAMP>t</SAMP> pointer does not point to a valid object of type <SAMP>tm</SAMP>. </P>

<A NAME="idx1235"></A><PRE>
virtual dateorder 
<B>do_date_order</B>()  const; </PRE>
<UL>
<P>Returns the a value indicating the relative ordering of the three basic parts of a date. Possible return values are:</P>
<UL>
<LI><P CLASS="LIST"><SAMP>no_order</SAMP>, indicating that the date format has no ordering, an ordering cannot be determined, or the date format contains components other than Month, Day and Year. <SAMP>no_order</SAMP> is never returned by the primary template, but may be used by derived classes. In the C  locale, the function returns <SAMP>mdy</SAMP>.</P></LI>
<LI><P CLASS="LIST">One of <SAMP>dmy</SAMP>, <SAMP>mdy</SAMP>, <SAMP>ymd</SAMP>, <SAMP>ydm</SAMP>, indicating the relative ordering of Day, Month, and Year.</P></LI>
</UL>
</UL>


<A NAME="idx1236"></A><PRE>
virtual iter_type 
<B>do_get_date</B>(iter_type s, iter_type end, ios_base &amp;io,
            ios_base::iostate&amp; err, tm* t) const; </PRE>
<UL>
<P>Fills the appropriate members of the object pointed to by the <SAMP>t</SAMP> argument with values parsed from the character buffer specified by the range <SAMP>[s,end)</SAMP>. Alphabetic characters are compared without regard to case. If the input sequence does not contain a valid date representation corresponding to the <SAMP>"</SAMP><SAMP>%x</SAMP><SAMP>"</SAMP> <SAMP>time_put</SAMP> specifier, then the object pointed to by <SAMP>t</SAMP> is not modified and <SAMP>ios_base::failbit</SAMP> is set in the <SAMP>err</SAMP> argument. </P>
<P>Returns an iterator pointing just beyond the last extracted character. </P>
</UL>


<A NAME="idx1237"></A><PRE>virtual iter_type 
<B>do_get_monthname</B>(iter_type s, ios_base &amp;io,
                 ios_base::iostate&amp; err, tm* t) const; </PRE>
<UL>
<P>Fills the <SAMP>t-&gt;tm_mon</SAMP> member with a month number (<SAMP>0</SAMP> for January) parsed from the character buffer specified by the range <SAMP>[s,end)</SAMP>. This name may be an abbreviation, but the function attempts to read a full name if valid characters are found after an abbreviation. For example, if a full name is <SAMP>"</SAMP><SAMP>December</SAMP><SAMP>"</SAMP>, and an abbreviation is <SAMP>"</SAMP><SAMP>Dec</SAMP><SAMP>"</SAMP>, then the string <SAMP>"</SAMP><SAMP>Dece</SAMP><SAMP>"</SAMP> causes an error. Characters are compared without regard to case. If an error occurs, then the object pointed to by <SAMP>t</SAMP> is not modified and <SAMP>ios_base::failbit</SAMP> is set in the <SAMP>err</SAMP> argument. </P>
<P>Returns an iterator pointing just beyond the last extracted character. </P>
</UL>


<A NAME="idx1238"></A><PRE>virtual iter_type 
<B>do_get_time</B>(iter_type s, iter_type end, os_base &amp;io,
            ios_base::iostate&amp; err, tm* t) const; </PRE>
<UL>
<P>Fills out the appropriate members of the object pointed to by the <SAMP>t</SAMP> argument with time values parsed from the character buffer specified by the range <SAMP>[s,end)</SAMP>. Alphabetic characters are compared without regard to case. If the input sequence does not contain a valid date representation corresponding to the <SAMP>"</SAMP><SAMP>%X</SAMP><SAMP>"</SAMP> <SAMP>time_put</SAMP> specifier, then the object pointed to by <SAMP>t</SAMP> is not modified and <SAMP>ios_base::failbit</SAMP> is set in the <SAMP>err</SAMP> argument. </P>
<P>Returns an iterator pointing just beyond the last extracted character. </P>
</UL>


<A NAME="idx1239"></A><PRE>virtual iter_type 
<B>do_get_weekday</B>(iter_type s, iter_type end, ios_base &amp;io, 
               ios_base::iostate&amp; err, tm* t) const; </PRE>
<UL>
<P>Fills the <SAMP>t-&gt;tm_wday</SAMP> member of the <SAMP>t</SAMP> argument with a weekday number (<SAMP>0</SAMP> for Sunday) parsed from the character buffer specified by the range <SAMP>[s,end)</SAMP>. This name may be an abbreviation, but the function attempts to read a full name if valid characters are found after an abbreviation. For instance, if a full name is <SAMP>"</SAMP><SAMP>Monday</SAMP><SAMP>"</SAMP>, and an abbreviation is <SAMP>"</SAMP><SAMP>Mon</SAMP><SAMP>"</SAMP>, then the string <SAMP>"</SAMP><SAMP>Mond</SAMP>" causes an error. Alphabetic characters are compared without regard to case. If an error occurs, then the object pointed to by <SAMP>t</SAMP> is not modified and <SAMP>ios_base::failbit</SAMP> is set in the <SAMP>err</SAMP> argument. </P>
<P>Returns an iterator pointing just beyond the last extracted character. </P>
</UL>


<A NAME="idx1240"></A><PRE>virtual iter_type 
<B>do_get_year</B>(iter_type s, iter_type end, ios_base &amp;io, 
            ios_base::iostate&amp; err, tm* t) const; </PRE>
<UL>
<P>Fills in the <SAMP>t-&gt;tm_year</SAMP> member of the <SAMP>t</SAMP> argument with a year parsed from the character buffer specified by the range <SAMP>[s,end)</SAMP>. Values in the range <SAMP>[69,99]</SAMP> are assumed to refer to years 1969 through 1999, and values in the range <SAMP>[0, 68]</SAMP> are assumed to refer to years 2000 through 2068; all other values are assumed to include the century. This behavior follows the requirement on the <SAMP>strptime()</SAMP> function of IEEE Std 1003.1-2001. If an error occurs, then <SAMP>ios_base::failbit </SAMP>is set in the <SAMP>err</SAMP> argument. </P>
<P>Returns an iterator pointing just beyond the last extracted character.</P>
</UL>

<A NAME="sec14"><H3>Extension of this Implementation</H3></A>

<A NAME="idx1241"></A><PRE>iter_type 
<B>do_get</B> (iter_type s, iter_type end, ios_base &amp;io,
        ios_base::iostate &amp;err, tm *t, char fmt, char mod)<br>        const; </PRE>
<UL>
<P>Fills the appropriate members of the object pointed to by the <SAMP>t</SAMP> argument with values parsed from the character sequence in the range <SAMP>[s,end)</SAMP> according to the corresponding format specifier and, optionally, modifier (when <SAMP>(mod != '\0')</SAMP> evaluates to <SAMP>true</SAMP>). Alphabetic characters are compared without regard to case. If the input sequence does not match the format of the corresponding specifier and modifier, then the object pointed to by <SAMP>t</SAMP> is not modified and <SAMP>ios_base::failbit</SAMP> is set in the <SAMP>err</SAMP> argument. </P>
<P>The following format specifiers and modifiers are recognized, as illustrated in <A HREF="time-get.html#Table&nbsp;34">Table&nbsp;34</A> and <A HREF="time-get.html#Table&nbsp;35">Table&nbsp;35</A>.</P>
<H4><A NAME="Table&nbsp;34">Table&nbsp;34: Recognized conversion specifiers&nbsp;</A></H4>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="3">
<tr><td valign=top><B>Conversion Specifier</B>
</td>
<td valign=top><B>Description</B>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%a</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the day of the week. <SAMP>%a</SAMP> uses the locale's weekday names, specifiying either the abbreviated or full name.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%A</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Same as or equivalent to <SAMP>%a</SAMP>.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%b</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the month. <SAMP>%b</SAMP> uses the locale's month names, specifiying either the abbreviated or full name.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%B</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Same as or equivalent to <SAMP>%b</SAMP>.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%c</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents date and time formatted appropriate to the locale.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%d</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the day of the month as <SAMP>[01,31]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%D</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the date, expressed as <SAMP>%m / %d / %y</SAMP>. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%e</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Same as or equivalent to <SAMP>%d</SAMP>.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%h</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Same as or equivalent to <SAMP>%b</SAMP>.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%H</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the hour in 24-hour clock form as <SAMP>[00,23]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%I</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the hour in 12-hour clock form as <SAMP>[01,12]</SAMP>. Leading zeros are optional.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%j</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the day number of the year as <SAMP>[001,366]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%m</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the month number as <SAMP>[01,12]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%M</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Expresses the minute as <SAMP>[00,59]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%n</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents blank (white) space. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%p</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents "a.m "or "p.m" formatted as appropriate to the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%r</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the 12-hour clock time using the AM/PM notation. In the classic C locale, equivalent to <SAMP>%I : %M : %S %p</SAMP>.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%R</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the time as <SAMP>%H : %M</SAMP>. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%S</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the seconds as <SAMP>[00,60]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%t</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents blank (white) space. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%T</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the time as <SAMP>%H : %M : %S</SAMP>. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%U</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the week number of the year as a decimal number (<SAMP>[00,53]</SAMP>) with Sunday representing as the first day of the week . Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%w</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Expresses the weekday as a decimal number <SAMP>[0,6]</SAMP>. <SAMP>0 </SAMP>represents Sunday. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%W</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">The week number of the year (Monday as the first day of the week) as a decimal number <SAMP>[00,53]</SAMP>. Leading zeros are optional. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%x</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the date in the locale's date format. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%X</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the time in the locale's time format. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%y</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the year within the century. If a century is not specified, values in the range <SAMP>[59,99]</SAMP> will refer to years 1959 to 1999 inclusive, and values in the range <SAMP>[00,58]</SAMP> will refer to years 2000 to 2058 inclusive. Leading zeros are optional.</P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Y</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the year and includes the century (e.g. 1988). </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%%</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents a literal <SAMP>%</SAMP> character. </P>
</td>
</tr>
</TABLE>
<P><A HREF="time-get.html#Table&nbsp;35">Table&nbsp;35</A> describes the recognized modified conversion specifiers.</P>
<H4><A NAME="Table&nbsp;35">Table&nbsp;35: Recognized modified conversion specifiers&nbsp;</A></H4>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="3">
<tr><td valign=top><B>Name</B>
</td>
<td valign=top><B>Description</B>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Ec </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the locale's alternative appropriate date and time conversion. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%EC </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the locale's alternative name of the base year (period) conversion. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Ex </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the locale's alternative date conversion. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%EX </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the locale's alternative time conversion. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Ey </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the offset from <SAMP>%EC</SAMP> (year only) in an alternate locale conversion. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%EY </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the full alternative year conversion. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Od </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the day of the month by using alternate locale numeric symbols. Note, leading zeros are permitted but not required. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Oe </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Same as or equivalent to <SAMP>%Od</SAMP>. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%OH </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the hour in 24-hour clock form using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%OI </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the hour in 12-hour clock form using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Om </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the month using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%OM </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the minutes using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%OS </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the seconds using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%OU </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the week number of the year, with Sunday as the first day of the week, using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Ow </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the number of the weekday (<SAMP>Sunday=0</SAMP>) using alternative numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%OW </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the week number of the year, with Monday as the first day of the week, using alternate numeric symbols for the locale. </P>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>%Oy </SAMP></P>
</td>
<td valign=top><P CLASS="TABLE">Represents the year (offset from <SAMP>%C</SAMP>) using alternate numeric symbols for the locale. </P>
</td>
</tr>
</TABLE>
<P>Returns an iterator pointing just beyond the last extracted character.</P>
</UL>

<A NAME="sec15"><H3>Example</H3></A>

<UL><PRE>#include &lt;ctime&gt;      // for struct tm
#include &lt;locale&gt;     // for locale, time_get
#include &lt;sstream&gt;    // for stringstream
#include &lt;iostream&gt;   // for cout, endl


// Print out a tm struct value in one atomic operation
std::ostream&amp; operator&lt;&lt; (std::ostream &amp;os, const std::tm &amp;t)
{
    std::stringstream strm;

    strm &lt;&lt; "Daylight Savings = "   &lt;&lt; t.tm_isdst
         &lt;&lt; "\nDay of year      = " &lt;&lt; t.tm_yday
         &lt;&lt; "\nDay of week      = " &lt;&lt; t.tm_wday
         &lt;&lt; "\nYear             = " &lt;&lt; t.tm_year
         &lt;&lt; "\nMonth            = " &lt;&lt; t.tm_mon
         &lt;&lt; "\nDay of month     = " &lt;&lt; t.tm_mday
         &lt;&lt; "\nHour             = " &lt;&lt; t.tm_hour
         &lt;&lt; "\nMinute           = " &lt;&lt; t.tm_min
         &lt;&lt; "\nSecond           = " &lt;&lt; t.tm_sec
         &lt;&lt; '\n';

    // guard for thread safety and output synchronization
    const std::ostream::sentry guard (os);

    if (guard)
        os.rdbuf ()-&gt;sputn (strm.str ().c_str (), strm.str ().size ());
    else
        os.setstate (os.failbit);

    return os;
}


int main ()
{
    typedef std::istreambuf_iterator&lt;char, std::char_traits&lt;char&gt; &gt; Iter;

    // time struct to parse date into
    static std::tm timeb;  // zero initialized

    // Unused, required by time_get
    std::ios_base::iostate state;

    // Stream object to read from
    std::istringstream ins ("");

    // Iterators into the stream object
    Iter begin (ins);
    Iter end;

    const std::locale loc ("C");

    // Get a reference to the time_get facet in locale loc.
    const std::time_get&lt;char, Iter&gt; &amp;tg =
        std::use_facet&lt;std::time_get&lt;char, Iter&gt; &gt;(loc);

    // Display time_base::dateorder value.
    std::cout &lt;&lt; "time_base::dateorder == " &lt;&lt; tg.date_order () &lt;&lt; ".\n";
  
    // Insert date string into stream.
    ins.str ("04/07/69");

    // get_date from the stream and output tm contents.
    tg.get_date (begin, end, ins, state, &amp;timeb);
    std::cout &lt;&lt; "Date: Apr 7 1969\n" &lt;&lt; timeb &lt;&lt; std::endl;

    // Insert weekday string into stream.
    ins.str ("Monday");

    // get_weekday from the stream and output tm contents.
    tg.get_weekday (begin, end, ins, state, &amp;timeb);
    std::cout &lt;&lt; "Weekday: Monday\n" &lt;&lt; timeb &lt;&lt; std::endl;
  
    // Insert time string into stream.
    ins.str ("06:47:32");

    // get_time from the stream and output tm contents.
    tg.get_time (begin, end, ins, state, &amp;timeb);
    std::cout &lt;&lt; "Time: 06:47:32\n" &lt;&lt; timeb &lt;&lt; std::endl;

    return 0;
}

Program Output:
time_base::dateorder == 2.
Date: Apr 7 1969
Daylight Savings = 0
Day of year      = 0
Day of week      = 0
Year             = 69
Month            = 3
Day of month     = 7
Hour             = 0
Minute           = 0
Second           = 0

Weekday: Monday
Daylight Savings = 0
Day of year      = 0
Day of week      = 1
Year             = 69
Month            = 3
Day of month     = 7
Hour             = 0
Minute           = 0
Second           = 0

Time: 06:47:32
Daylight Savings = 0
Day of year      = 0
Day of week      = 1
Year             = 69
Month            = 3
Day of month     = 7
Hour             = 6
Minute           = 47
Second           = 32
</PRE></UL>
<A NAME="sec16"><H3>See Also</H3></A>
<P><B><I><A HREF="locale.html">locale</A></I></B>, <A HREF="facets.html">Facets</A>, <B><I><A HREF="time-put.html">time_put</A></I></B></P>
<A NAME="sec17"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 22.2.5.1</I></P>
<P><I>IEEE Std 1003.1-2001 -- </I><I>The Open Group Base Specifications Issue 6, strptime</I></P>

<BR>
<HR>
<A HREF="swap-ranges.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="time-get-byname.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
