arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
localtime()
localtime()

この関数の目的

localtime() は、 time_t 型のオブジェクトを現在の時間帯で struct tm に変換する。

定義

	#include <time.h>
	struct tm *localtime(const time_t *timer);

働き

この関数は、 timer が指すカレンダー時間を展開時間に変換する。

返り値は、オブジェクトへのポインタである。

解説

time_t に関しては time()struct tm 型に関してはヘッダーを参照のこと。

ポインタの指すオブジェクトについては何も触れられていないが、静的変数と思われる。 つまり一つのオブジェクトをプログラム全体で使いまわしているので、二回目の呼び出しで一回目の返り値の指すオブジェクトが変わる、 ということがありうる。さらに他の関数( mktime() など)によってオブジェクトが変化する処理系もある。 このため、 localtime() の返り値はすぐにコピーを取っておくぐらいの気持ちでいたほうが安全である。 同じことは gmtime() にもいえる。

	struct tm broken_time;
	broken_time = *localtime(&timer);

下のプログラムで localtime() と gmtime() の使っているオブジェクトが同じかどうかを確かめることが出来る。

#include 
int main(void){
	time_t t;
	struct tm tl, tg, *ptl, *ptg;
	double dt1;
	time(&t);
	tl = *(ptl = localtime(&t));
	ptg = gmtime(&t);
	if(ptg)
		tg = *ptg;
	else{
		printf("UTC time is not available in this machine.\n");
		return 0;
	}

	dt1 = difftime(mktime(ptl), mktime(ptg));
	if(dt1 == 0)
		printf("Your compiler's localtime and gmtime shares the same static tm structure object!\n");
	else
		printf("Your compiler's localtime and gmtime uses different tm structure object!");
	printf("delta-time: %g\n", dt1);
	printf("real delta-time: %g hours\n", difftime(mktime(&tl), mktime(&tg)) / 60 / 60);
	return 0;
}

局所時間と相対するのが世界共通の UTC 時間であり、 gmtime() によって取得できる。

arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC