WisdomSoft - for your serial experiences.

9.9 時間関数

C 言語の標準関数を用いてコンピュータの時間を取得します。時間は単純な数値として扱われているため、日時として扱うにはシステムのローカル時刻に変換しなければなりません。

9.9.1 日時を処理する

データ管理などを行うとき、時間は重要な存在です。例えば情報の更新が行われたときなどは、プログラムは更新ログを残す等の処理が求められるでしょう。多くのシステムにはシステム時計があるため、利用者に「今の時間を入力せよ」と問いかけるプログラムは不親切です。プログラムは今の日時を知りたい場合、システム時計から時刻を算出するべきだと考えられます。

現在の時刻を取得したり、新たに設定するようなプログラムを作る場合、基本的にはシステムに問い合わせるべきです。システムがサポートしている時間関連機能を最大限に発揮させる場合は、C言語の標準関数だけでサポートできるものではないからです。しかし、複雑な API を使わなくても、時間の取得や変換などの基本的な処理は標準関数でサポートされています。

時間関連関数は time.h ヘッダファイルで宣言されています。システム時計から時刻を取得するには time() 関数を使います。

time() 関数
time_t time( time_t *timer );

timer にはシステム時刻を得る time_t 型変数へのポインタを指定します。time_t 型は time.h ヘッダファイルで定義されている時間を表す算術型の typedef 名です。time_t 型の実際の型は実装に依存します。time() 関数は引数から得られる値と同じ値を返します。すなわち time() 関数は時刻を得る手段として、ポインタに間接参照で値を格納する方法と戻り値から得る方法を選択することができます。戻り値で値を得るという場合は、引数を NULL にしてもかまいません。

この関数で得られる値は、システムの符号化された time_t 型のカレンダー時間です。時間を得ることができない場合は -1 を返します。time() 関数が返す値は実装に依存するため、お使いのシステムの時間方式を調べてください。Microsoft Windows では、システム クロックに従って、万国標準時 (UCT) の 1970 年 1 月 1 日の 0 時 0 分 0 秒からの経過時間を秒単位で表した数値を返すでしょう。

このままでは、とても時間とは思えないような数値が表示されるだけですので(何より、システムに依存した時間処理はシステムに依存したソースを書くことになってしまうため)、これを現在時刻に変換しなければなりません。演算によって経過時間から現在時刻を得ることができますが、localtime() 関数がこの処理を行ってくれます。

localtime() 関数
struct tm *localtime( const time_t *timer );

timer には、変換する時刻値へのポインタを指定します。時間は、年/月/日 などの値を表すメンバを持つ tm 構造体へのポインタを返します。tm 構造体は次のように宣言されています。

tm 構造体
struct tm {
        int tm_sec;   /* 秒 - [0~61] (閏秒を考慮) */
        int tm_min;   /* 分 - [0~59] */
        int tm_hour;  /* 時 - [0~23] */
        int tm_mday;  /* 日 - [1~31] */
        int tm_mon;   /* 月 - [0~11] */
        int tm_year;  /* 1900 からの年 */
        int tm_wday;  /* 日曜日からの曜日 - [0~6] */
        int tm_yday;  /* 年初からの通算日数 - [0~365] */
        int tm_isdst; /* 夏時間が有効ならば正数、無効ならば 0、不明ならば負数 */
};

localtime() 関数は、引数 timer で指定した時刻値を元に、それぞれのメンバを適切な値で初期化されている tm 構造体へのポインタを返します。この関数が返したポインタを用いれば、時刻値から人間が理解可能な時間を表示することが可能となります。

tm 構造体の月は 0 から数えられるので、1 月が 0 であることに注意してください。また、年は 1900 年から数えた値となります。実際の西暦に変換するには 1900 を加算する必要があります。

コード1
#include <stdio.h>
#include <time.h>

int main() {
	struct tm *date;
	const time_t t = time(NULL);
	date = localtime(&t);

	printf(
		"%d/%d/%d %d:%d:%d\n" , date->tm_year + 1900 , date->tm_mon + 1 ,
		date->tm_mday , date->tm_hour , date->tm_min , date->tm_sec
	);

	return 0;
}
実行結果
コード1 実行結果

コード1は、現在時刻を表示するプログラムです。時刻は 年/月/日 時:分:秒 という形で標準出力に表示されるでしょう。プログラムは最初に time() 関数を使ってシステム時計から時刻値を取得します。次に localtime() 関数を使って時刻値を tm 構造体に変換しています。あとは、tm 構造体の日時を表す各メンバにアクセスして時間を表示します。