時間関数 (time.h)

clock_t clock( void );   [OS]

プログラム起動の瞬間から経過した時間を取得します。clock() / CLOCKS_PER_SEC が秒数になります。Light C の場合、clock() はミリ秒単位の値を返します。

time_t time( time_t* ptr );   [OS]

現在の時刻を time_t 型で取得します。ptr に NULL 以外を使用すると、*ptr に戻り値と同じ値が設定されます。

Light C では、time_t は long として定義されており、グリニッジ標準時間 (ロンドン時間、GMT) 1970/1/1 00:00:00 からの経過秒数を表します。これは多くのコンパイラで採用されている方法です。この time_t では、1970/1/1 から 2038/1/18 までの日時を表すことができます。

struct tm* gmtime( time_t* ptr );
struct tm*
localtime( time_t* ptr );

ptr で指定された time_t 値を tm 構造体に変換します。gmtime ではグリニッジ標準時間 (ロンドン時間)、localtime ではローカル時間 (Light C では日本時間) が tm 構造体に格納されます。指定する time_t 値は、通常 time() で取得します。

tm 構造体には、次のメンバがあります。これは ISO/JIS/ANSI の規定です。
struct tm {
  int tm_sec; // 秒 (0-59)
  int tm_min; // 分 (0-59)
  int tm_hour; // 時 (0-23)
  int tm_mday; // 日 (1-31)
  int tm_mon; // 月 - 1 (0-11)
  int tm_year; // 年 - 1900
  int tm_wday; // 曜日 (0-6)
  int tm_yday; // 年通算日 (0-365)
  int tm_isdst; // 季節時間フラグ (-1)
};

gmtime と localtime が返す値は、ライブラリ内部の単一の静的な tm 構造体へのポインタです。そのため、これらの関数 (または ctime) を再び呼び出すと、最初の戻り値の内容が変化します。返された tm 値を確実に保存するには、返されたポインタをそのまま保存するのではなく、次のように tm 構造体の内容をコピーしてください。
time_t t = time( NULL );
struct tm tim = *localtime( &t );

time とは異なり、gmtime と localtime は OS の API を呼び出さないため、OS には依存しません。Light C (および多くのコンパイラ) の gmtime と localtime は、1970/1/1 00:00:00 GMT からの経過秒数を表す time_t 値を、ISO/JIS/ANSI 規定の tm 構造体に変換します。

time_t mktime( struct tm* tim );

tm 構造体で示されたローカル時間 (日本時間) を time_t 値に変換します。localtime の逆の関数です。

char* ctime( time_t* ptr );
char*
asctime( struct tm* tim );

日時を文字列に変換します。日時は、ctime では time_t へのポインタで、asctime では tm 構造体へのポインタで指定します。 次のような 25 文字 (末尾の 0 を入れて 26 バイト) の文字列が返されます。
Wed Aug 10 01:12:48 1999\n

ライブラリ内部の静的な領域へのポインタが返されるため、これらの関数を再び呼び出すと、最初の戻り値の内容が変化します。

size_t strftime( char* buf, size_t len, char* form, struct tm* tim );

日時 tim を書式 form に従って文字列化し、最大 len-1 バイトまで buf に格納します。文字列の末尾には 0 が付加されます。変換後の文字列の長さが len-1 以下の場合は文字列の長さが返され、長さが超えた場合は 0 が返されます。

form には、sprintf と同様の形式で書式を指定します。ただし、使用できる変換指定子が異なります。strftime では、次の変換指定子を使用できます。

指定子 出力例 説明
%a, %A 曜日 (処理系依存)
%b, %B 8 月 月 (処理系依存)
%c 99-08-04 13:35:52 日付および時刻 (処理系依存)
%d 07 2 桁の日付 (01 〜 31)
%H 07 2 桁の時間 (00 〜 23)
%I 07 2 桁の時間 (00 〜 11)
%j 077 3 桁の年通算日 (001 〜 366)
%m 07 2 桁の月 (01 〜 12)
%M 07 2 桁の分 (00 〜 59)
%p AM 午前と午後の区別 (処理系依存)
%S 07 2 桁の秒 (00 〜 59)
%U 07 日曜日を週の先頭とした年通算週 (00 〜 53)
%w 06 日曜日を 0 とした 1 桁の曜日 (0 〜 6)
%W 07 月曜日を週の先頭とした年通算週 (00 〜 53)
%x 99-08-04 日付 (処理系依存)
%X 13:35:52 時刻 (処理系依存)
%y 99 西暦下 2 桁
%Y 1999 西暦年
%Z TOKYO 時間帯の名前 (処理系依存)
%% % % 自体

double difftime( time_t t1, time_t t2 );

時間の秒単位の差 (t1 - t2) を double 値で返します。