[C言語 標準ライブラリ] time.hの使い方

スポンサーリンク

time.hには、時間を操作するための型や関数が宣言および定義されています。
多くの関数は、現在の日付と時刻を表すカレンダータイムを扱います。
いくつかの関数は、特定のタイムゾーンで表現されるカレンダータイムであるローカルタイムや、ローカルタイムを決定するアルゴリズムの一時的な変更である夏時間を扱います。ローカルタイムゾーンと夏時間は実装で定義されます。

スポンサーリンク

マクロ

CLOCKS_PER_SEC

clock関数が返す値の、1秒あたりの数を定義するオブジェクト形式のマクロです。

NULL

NULLポインタ定数です。
stddef.h、locale.h、stdio.h、stdlib.h、string.h、time.h、wchar.hで定義されます。

clock_t

clock関数が返す時刻を表す型です。
算術型として定義されます。

size_t

sizeof演算子が生成する結果を表すための符号無し整数型です。
stddef.h、stdio.h、stdlib.h、string.h、time.h、wchar.hで定義されます。

struct tm

暦時刻を要素型の時刻として表す構造体型です。
tmは以下のメンバを含みます。

メンバ名説明(値の範囲)
inttm_sec秒を表します。(0~60、0~61)※1
inttm_min分を表します。(0~59)
inttm_hour時を表します。(0~24)
inttm_mday日を表します。(1~31)
inttm_mon1月からの月数を表します。(0~11)
inttm_year1900年からの年数を表します。
inttm_wday日曜日からの日数を表します。(0~6)
inttm_yday1月1日からの日数を表します。(0~365)
inttm_isdst夏時間フラグです。※2

※1:C89の値の範囲は0~61です。2秒までのうるう秒が考慮されています。C99/C11の値の範囲は0~60です。正のうるう秒が考慮されています。

※2:夏時間を採用しているときに正、夏時間を採用していないときに0,その情報が得られないときに負となります。

time_t

暦時刻を表す型です。
算術型として定義されます。

時間を扱う関数

clock_t clock(void)

現在のプロセッサ時間を取得します。
プログラムの実行のみに関係する、経過したプロセッサ時間の値が返されます。
戻り値をCLOCKS_PRE_SECで割ることで、秒での経過時間を算出できます。
プロセッサ時間が使用できない、または値が表現できない場合は-1が返されます。

double difftime(time_t time1, time_t time0)

time1 – time0の2つのカレンダー時間の差を計算します。
秒で計った差が返されます。

time_t mktime(struct tm *timeptr)

展開時間をtime_t型に変換します。
引数timeptrが指すオブジェクトの局所時間で表した展開時間が、time関数が返す値と同じ形式で返されます。
構造体メンバのtm_wdayとtm_ydayは無視されます。
正常に終了した場合は、構造体メンバのtm_wdayおよびtm_ydayには、適切な値が格納されます。
tm_mdayの終端値はtm_monおよびtm_yearが決定されるまで設定されません。
指定されたカレンダー時間をtime_t型としてエンコードした値が返されます。
カレンダー時間が表現不可能な場合は、-1が返されます。

time_t time(time_t *timer)

現在のカレンダー時間を取得します。
カレンダー時間が使用できない場合は、-1が返されます。
timerがNULLポインタでなければ、ポインタが指すオブジェクトにも戻り値が格納されます。

時間変換関数

char *asctime(const struct tm *timeptr)

struct tm型のオブジェクトを以下の形式の文字列に変換します。

Sun Sep 16 01:03:52 1973\n\0

この文字列へのポインタが返されます。

char *ctime(const time_t *timer)

time_t型のオブジェクトを文字列に変換します。
asctime(localtime(timer))と同等です。
asctime関数が返す値が返されます。

struct tm *gmtime(const time_t *timer)

time_t型のオブジェクトをUTC(Coordinated Universal Time:協定世界時)としてstruct tmに変換します。
渡されたオブジェクトへのポインタが返されます。
UTC が使用不能な場合はNULLポインタが返されます。

struct tm *localtime(const time_t *timer)

time_t型のオブジェクトを現在の時間帯でstruct tmに変換します。
オブジェクトへのポインタが返されます。

size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr)

引数sが指す配列にformatに制御される文字列を格納します。
書式はマルチバイト文字の連なりで、初期シフト状態に始まり初期シフト状態で終わる必要があります。
format文字列は0以上の変換指定子とマルチバイト文字から成っています。
変換指定子は1文字の%と、その後の変換動作を決定する一文字から成っています。
終端のNULL文字を含む全てのマルチバイト文字は、変更を加えられずに配列にコピーされます。
コピーが重複するオブジェクト間で発生した場合の動作は未定義です。
maxsize以下の文字が配列に格納されます。
各変換指定子は下表の文字列によって置き換えられます。
適切な文字列は、LC_TIME分野のロケールおよびtimeptrが指すオブジェクトによって決定されます。

変換指定子説明
%aロケールでの曜日の略名で置換されます。
%Aロケールでの曜日の名前で置換されます。
%bロケールでの月の略名で置換されます。
%Bロケールでの月の名前で置換されます。
%cロケールでの適切な日付と時刻で置換されます。
%d月の中の日が10進数で置換されます。(01-31)
%H24時間時計での時間が10進数で置換されます。(00-23)
%I12時間時計での時間が10進数で置換されます。(01-12)
%j年の中の日が10進数で置換されます。(001-366)
%m月が10進数で置換されます。(01-12)
%M分が10進数で置換されます。(00-59)
%pロケールでの、12時間時計でいう午前・午後に相当する文字列で置換されます。
%S秒が10進数で置換されます。(00-61)
%U年の始まりから経過した週の数(最初の日曜を最初の週の最初の日として)が10進数で置換されます。(00-53)
%w日曜を0として、曜日が10進数で置換されます。(0-6)
%W年の始まりから経過した週の数(最初の月曜を最初の週の最初の日として)が10進数で置換されます。(00-53)
%xロケールでの適切な日付表現で置換されます。
%Xロケールでの適切な時刻表現で置換されます。
%y世紀を除いた年が10進数で置換されます。(00-99)
%Y世紀を含んだ年が10進数で置換されます。
%z時間帯の略名か、時間帯が決定されない場合は空文字列で置換されます。
%%%で置換されます。

変換指定子が上記のものに該当しない場合の動作は未定義です。
終端のNULL文字を含む結果の文字数がmaxsize以下なら、sが指す配列に配置された終端のNULL文字を含まない文字数が返されます。
そうでなければ0が返され、配列の内容は不定となります。

スポンサーリンク
C言語
コッコ隊長の勉強部屋

コメント