blob: 11964a6280255f1ce72e2483806dfba1e6c1dda2 [file] [log] [blame]
<html lang="en">
<head>
<title>General Time String Parsing - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Parsing-Date-and-Time.html#Parsing-Date-and-Time" title="Parsing Date and Time">
<link rel="prev" href="Low_002dLevel-Time-String-Parsing.html#Low_002dLevel-Time-String-Parsing" title="Low-Level Time String Parsing">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="General-Time-String-Parsing"></a>
<p>
Previous:&nbsp;<a rel="previous" accesskey="p" href="Low_002dLevel-Time-String-Parsing.html#Low_002dLevel-Time-String-Parsing">Low-Level Time String Parsing</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Parsing-Date-and-Time.html#Parsing-Date-and-Time">Parsing Date and Time</a>
<hr>
</div>
<h5 class="subsubsection">21.4.6.2 A More User-friendly Way to Parse Times and Dates</h5>
<p>The Unix standard defines another function for parsing date strings.
The interface is weird, but if the function happens to suit your
application it is just fine. It is problematic to use this function
in multi-threaded programs or libraries, since it returns a pointer to
a static variable, and uses a global variable and global state (an
environment variable).
<!-- time.h -->
<!-- Unix98 -->
<div class="defun">
&mdash; Variable: <b>getdate_err</b><var><a name="index-getdate_005ferr-2664"></a></var><br>
<blockquote><p>This variable of type <code>int</code> contains the error code of the last
unsuccessful call to <code>getdate</code>. Defined values are:
<dl>
<dt>1<dd>The environment variable <code>DATEMSK</code> is not defined or null.
<br><dt>2<dd>The template file denoted by the <code>DATEMSK</code> environment variable
cannot be opened.
<br><dt>3<dd>Information about the template file cannot retrieved.
<br><dt>4<dd>The template file is not a regular file.
<br><dt>5<dd>An I/O error occurred while reading the template file.
<br><dt>6<dd>Not enough memory available to execute the function.
<br><dt>7<dd>The template file contains no matching template.
<br><dt>8<dd>The input date is invalid, but would match a template otherwise. This
includes dates like February 31st, and dates which cannot be represented
in a <code>time_t</code> variable.
</dl>
</p></blockquote></div>
<!-- time.h -->
<!-- Unix98 -->
<div class="defun">
&mdash; Function: struct tm * <b>getdate</b> (<var>const char *string</var>)<var><a name="index-getdate-2665"></a></var><br>
<blockquote><p>The interface to <code>getdate</code> is the simplest possible for a function
to parse a string and return the value. <var>string</var> is the input
string and the result is returned in a statically-allocated variable.
<p>The details about how the string is processed are hidden from the user.
In fact, they can be outside the control of the program. Which formats
are recognized is controlled by the file named by the environment
variable <code>DATEMSK</code>. This file should contain
lines of valid format strings which could be passed to <code>strptime</code>.
<p>The <code>getdate</code> function reads these format strings one after the
other and tries to match the input string. The first line which
completely matches the input string is used.
<p>Elements not initialized through the format string retain the values
present at the time of the <code>getdate</code> function call.
<p>The formats recognized by <code>getdate</code> are the same as for
<code>strptime</code>. See above for an explanation. There are only a few
extensions to the <code>strptime</code> behavior:
<ul>
<li>If the <code>%Z</code> format is given the broken-down time is based on the
current time of the timezone matched, not of the current timezone of the
runtime environment.
<p><em>Note</em>: This is not implemented (currently). The problem is that
timezone names are not unique. If a fixed timezone is assumed for a
given string (say <code>EST</code> meaning US East Coast time), then uses for
countries other than the USA will fail. So far we have found no good
solution to this.
<li>If only the weekday is specified the selected day depends on the current
date. If the current weekday is greater or equal to the <code>tm_wday</code>
value the current week's day is chosen, otherwise the day next week is chosen.
<li>A similar heuristic is used when only the month is given and not the
year. If the month is greater than or equal to the current month, then
the current year is used. Otherwise it wraps to next year. The first
day of the month is assumed if one is not explicitly specified.
<li>The current hour, minute, and second are used if the appropriate value is
not set through the format.
<li>If no date is given tomorrow's date is used if the time is
smaller than the current time. Otherwise today's date is taken.
</ul>
<p>It should be noted that the format in the template file need not only
contain format elements. The following is a list of possible format
strings (taken from the Unix standard):
<pre class="smallexample"> %m
%A %B %d, %Y %H:%M:%S
%A
%B
%m/%d/%y %I %p
%d,%m,%Y %H:%M
at %A the %dst of %B in %Y
run job at %I %p,%B %dnd
%A den %d. %B %Y %H.%M Uhr
</pre>
<p>As you can see, the template list can contain very specific strings like
<code>run job at %I %p,%B %dnd</code>. Using the above list of templates and
assuming the current time is Mon Sep 22 12:19:47 EDT 1986 we can obtain the
following results for the given input.
<p><table summary=""><tr align="left"><td valign="top">Input </td><td valign="top">Match </td><td valign="top">Result
<br></td></tr><tr align="left"><td valign="top">Mon </td><td valign="top">%a </td><td valign="top">Mon Sep 22 12:19:47 EDT 1986
<br></td></tr><tr align="left"><td valign="top">Sun </td><td valign="top">%a </td><td valign="top">Sun Sep 28 12:19:47 EDT 1986
<br></td></tr><tr align="left"><td valign="top">Fri </td><td valign="top">%a </td><td valign="top">Fri Sep 26 12:19:47 EDT 1986
<br></td></tr><tr align="left"><td valign="top">September </td><td valign="top">%B </td><td valign="top">Mon Sep 1 12:19:47 EDT 1986
<br></td></tr><tr align="left"><td valign="top">January </td><td valign="top">%B </td><td valign="top">Thu Jan 1 12:19:47 EST 1987
<br></td></tr><tr align="left"><td valign="top">December </td><td valign="top">%B </td><td valign="top">Mon Dec 1 12:19:47 EST 1986
<br></td></tr><tr align="left"><td valign="top">Sep Mon </td><td valign="top">%b %a </td><td valign="top">Mon Sep 1 12:19:47 EDT 1986
<br></td></tr><tr align="left"><td valign="top">Jan Fri </td><td valign="top">%b %a </td><td valign="top">Fri Jan 2 12:19:47 EST 1987
<br></td></tr><tr align="left"><td valign="top">Dec Mon </td><td valign="top">%b %a </td><td valign="top">Mon Dec 1 12:19:47 EST 1986
<br></td></tr><tr align="left"><td valign="top">Jan Wed 1989 </td><td valign="top">%b %a %Y </td><td valign="top">Wed Jan 4 12:19:47 EST 1989
<br></td></tr><tr align="left"><td valign="top">Fri 9 </td><td valign="top">%a %H </td><td valign="top">Fri Sep 26 09:00:00 EDT 1986
<br></td></tr><tr align="left"><td valign="top">Feb 10:30 </td><td valign="top">%b %H:%S </td><td valign="top">Sun Feb 1 10:00:30 EST 1987
<br></td></tr><tr align="left"><td valign="top">10:30 </td><td valign="top">%H:%M </td><td valign="top">Tue Sep 23 10:30:00 EDT 1986
<br></td></tr><tr align="left"><td valign="top">13:30 </td><td valign="top">%H:%M </td><td valign="top">Mon Sep 22 13:30:00 EDT 1986
<br></td></tr></table>
<p>The return value of the function is a pointer to a static variable of
type <code>struct&nbsp;tm</code><!-- /@w -->, or a null pointer if an error occurred. The
result is only valid until the next <code>getdate</code> call, making this
function unusable in multi-threaded applications.
<p>The <code>errno</code> variable is <em>not</em> changed. Error conditions are
stored in the global variable <code>getdate_err</code>. See the
description above for a list of the possible error values.
<p><em>Warning:</em> The <code>getdate</code> function should <em>never</em> be
used in SUID-programs. The reason is obvious: using the
<code>DATEMSK</code> environment variable you can get the function to open
any arbitrary file and chances are high that with some bogus input
(such as a binary file) the program will crash.
</p></blockquote></div>
<!-- time.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: int <b>getdate_r</b> (<var>const char *string, struct tm *tp</var>)<var><a name="index-getdate_005fr-2666"></a></var><br>
<blockquote><p>The <code>getdate_r</code> function is the reentrant counterpart of
<code>getdate</code>. It does not use the global variable <code>getdate_err</code>
to signal an error, but instead returns an error code. The same error
codes as described in the <code>getdate_err</code> documentation above are
used, with 0 meaning success.
<p>Moreover, <code>getdate_r</code> stores the broken-down time in the variable
of type <code>struct tm</code> pointed to by the second argument, rather than
in a static variable.
<p>This function is not defined in the Unix standard. Nevertheless it is
available on some other Unix systems as well.
<p>The warning against using <code>getdate</code> in SUID-programs applies to
<code>getdate_r</code> as well.
</p></blockquote></div>
</body></html>