struct tm *getdate(const char *string);
extern int getdate_err;
#define _GNU_SOURCE
#include <time.h>
int getdate_r(const char *string, struct tm *res);
(format 引き数でフォーマットを指定する) strptime(3) とは違い、 getdate() は環境変数 DATEMSK で指定されたフルパス名のファイルに書いてあるフォーマットを用いる。
マッチの際には大文字小文字を区別しない。 パターン中でも変換される文字列中でも、余分な空白文字は無視される。
パターンに指定できる変換指定は、 strptime(3) のものと同じである。 POSIX.1-2001 では一つの変換指定が追加で規定されている。
%Z が指定された場合、要素別の時刻を格納する構造体は、 指定されたタイムゾーンにおける現在時刻に対応する値で初期化される。 指定されていない場合、この構造体は現在のローカルタイムに対応する 要素別の時刻で初期化される (localtime(3) を呼び出した場合と同じ)。
曜日だけが指定された場合、 今日または今日以降で、 その曜日に合致する最初の日が採用される。
(年なしで) 月だけが指定された場合、 今月または今月以降で、 その月に合致する最初の月が採用される。
時・分・秒がいずれも指定されなかった場合、 現在の時・分・秒が採用される。
日付の指定がなかったが、時間 (hour) だけ指定された場合は、 現在の時間またはそれ以降で、その指定に合致する最初の時間が採用される。
getdate_r() は GNU 拡張で getdate() のリエントラント版を提供している。 getdate_r() では、エラーを報告するのにグローバル変数を使用したり、 要素別の時刻を返すのに静的なバッファを使用したりせず、 エラーを関数の返り値経由で報告し、要素別の時刻を 引き数 res が指し示す呼び出し側で割り当てたバッファに格納して返す。
成功すると、 getdate_r() は 0 を返す。 失敗すると、以下に示すエラー番号のいずれか一つを返す。
$ TFILE=$PWD/tfile $ echo aq%Aaq > $TFILE # Full weekday name $ echo aq%Taq >> $TFILE # ISO date (YYYY-MM-DD) $ echo aq%Faq >> $TFILE # Time (HH:MM:SS) $ date $ export DATEMSK=$TFILE $ ./a.out Tuesday aq2009-12-28aq aq12:22:33aq Sun Sep 7 06:03:36 CEST 2008 Call 1 ("Tuesday") succeeded: tm_sec = 36 tm_min = 3 tm_hour = 6 tm_mday = 9 tm_mon = 8 tm_year = 108 tm_wday = 2 tm_yday = 252 tm_isdst = 1 Call 2 ("2009-12-28") succeeded: tm_sec = 36 tm_min = 3 tm_hour = 6 tm_mday = 28 tm_mon = 11 tm_year = 109 tm_wday = 1 tm_yday = 361 tm_isdst = 0 Call 3 ("12:22:33") succeeded: tm_sec = 33 tm_min = 22 tm_hour = 12 tm_mday = 7 tm_mon = 8 tm_year = 108 tm_wday = 0 tm_yday = 250 tm_isdst = 1
#define _GNU_SOURCE 500 #include <time.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct tm *tmp; int j; for (j = 1; j < argc; j++) { tmp = getdate(argv[j]); if (tmp == NULL) { printf("Call %d failed; getdate_err = %d\n", j, getdate_err); continue; } printf("Call %d (\"%s\") succeeded:\n", j, argv[j]); printf(" tm_sec = %d\n", tmp->tm_sec); printf(" tm_min = %d\n", tmp->tm_min); printf(" tm_hour = %d\n", tmp->tm_hour); printf(" tm_mday = %d\n", tmp->tm_mday); printf(" tm_mon = %d\n", tmp->tm_mon); printf(" tm_year = %d\n", tmp->tm_year); printf(" tm_wday = %d\n", tmp->tm_wday); printf(" tm_yday = %d\n", tmp->tm_yday); printf(" tm_isdst = %d\n", tmp->tm_isdst); } exit(EXIT_SUCCESS); }