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).
int contains the error code of the last
unsuccessful call to getdate. Defined values are:
DATEMSK is not defined or null.
DATEMSK environment variable
cannot be opened.
time_t variable.
getdate is the simplest possible for a function
to parse a string and return the value. string is the input
string and the result is returned in a statically-allocated variable.
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 DATEMSK. This file should contain
lines of valid format strings which could be passed to strptime.
The getdate 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.
Elements not initialized through the format string retain the values
present at the time of the getdate function call.
The formats recognized by getdate are the same as for
strptime. See above for an explanation. There are only a few
extensions to the strptime behavior:
%Z 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.
Note: 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 EST 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.
tm_wday
value the current week's day is chosen, otherwise the day next week is chosen.
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):
%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
As you can see, the template list can contain very specific strings like
run job at %I %p,%B %dnd. 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.
@multitable {xxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
struct tm, or a null pointer if an error occurred. The
result is only valid until the next getdate call, making this
function unusable in multi-threaded applications.
The errno variable is not changed. Error conditions are
stored in the global variable getdate_err. See the
description above for a list of the possible error values.
Warning: The getdate function should never be
used in SUID-programs. The reason is obvious: using the
DATEMSK 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.
getdate_r function is the reentrant counterpart of
getdate. It does not use the global variable getdate_err
to signal an error, but instead returns an error code. The same error
codes as described in the getdate_err documentation above are
used, with 0 meaning success.
Moreover, getdate_r stores the broken-down time in the variable
of type struct tm pointed to by the second argument, rather than
in a static variable.
This function is not defined in the Unix standard. Nevertheless it is
available on some other Unix systems as well.
The warning against using getdate in SUID-programs applies to
getdate_r as well.
Go to the first, previous, next, last section, table of contents.