時間・時刻処理について(2)

このエントリーをはてなブックマークに追加

前回は時間の作成方法について解説しました。
今回は、time(3)関数で作成したデータを表示する為に文字列への変換する方法について解説していきます。

時間を文字列に変換

今回は前回作成した時間を人間が読みやすいように文字列に変換する関数について解説していきます。

関数名説明
ctime(3)time_t型を文字列へ変換します
asctime(3)struct tm型を文字列へ変換します
strftime(3)struct tm型をフォーマットを指定して文字列へ変換します


ctime(3)

time_t型は標準関数で宣言している型でユーザが簡単に把握できる型ではないので不便です。
そこで人間が読める文字列に変換してくれます。変換する文字列は"Sun Jun 01 15:39:10 2012\n"というフォーマットです。

//ctime.c
#include <stdio.h>
#include <time.h>

int main(void)
{
	time_t t;
	char *s;

	t = time(NULL);

	s = ctime(&t);
	printf("%s", s);

	return 0;
}

実行すると文字列が表示されているのが分かります。
注意事項として、ctime(3)の戻り値は静的に確保されたメモリということです。free(3)をする必要はありません。
また、この時間はtime(2)関数が作成した時間の場合、UTCになっている事にも注意が必要です。1

$ gcc -o ctime ctime.c
$ ./ctime
Sun Jun 01 15:39:10 2012

asctime(3)

引数がstruct tm型ですがそれさえ除けば、ctime(3)とは同じ動作となります。

//asctime.c
#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void)
{
	struct tm m;

	memset(&pm, 0, sizeof(struct tm));

	//2012/1/1 00:00:00
	m.tm_year = 102; //2012年 1900年からの経過年月
	m.tm_mon = 0;
	m.tm_mday = 1;
	m.tm_hour = 0;
	m.tm_min = 0;
	m.tm_sec = 0;
	m.tm_isdst = 0; //夏時間は無効

	s = asctime(&m);
	printf("%s", s);

	return 0;
}

実行結果や注意事項はctime(3)と同じです。

$ gcc -o asctime asctime.c
$ ./asctime
Sun Jun 01 00:00:00 2012

strftime(3)

ctime(3)、asctime(3)の不便な所はフォーマットが最初から決まっている所です。しかも日本人には分かり辛いフォーマットです。
アメリカはSI単位系(長さならばメートル)の代わりにヤード・ポンド法(こっちはマイル)を使ったりと良く分かりません。イギリスでさえMKS単位系に移行しているのに...

話がそれましたがソースコードを見ていきましょう。

//strftime.c
#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void)
{
	char s[256];
	struct tm m;

	memset(&pm, 0, sizeof(struct tm));

	//2012/1/1 00:00:00
	m.tm_year = 102; //2012年 1900年からの経過年月
	m.tm_mon = 0;
	m.tm_mday = 1;
	m.tm_hour = 0;
	m.tm_min = 0;
	m.tm_sec = 0;
	m.tm_isdst = 0; //夏時間は無効

	strftime(s, sizeof(s), "%Y/%m/%d %H:%M:%S", &m);
	printf("%s", s);

	return 0;
}

strftime(3)の第3引数でprintf(3)に似た形でフォーマットを指定しています。このフォーマットの一覧は"man 3 strftime"にあります。
Webで見たい人はJM:strftime(3)にあります。
実行すると指定した通りに表示がされていることが分かります。

$ gcc -o strftime strftime.c
$ ./strftime
2002/01/01 00:00:00

まとめ

いかがだったでしょうか。これでひとまず私たちが読みやすいように文字列に変換する事が出来るようになりました。
さてまだ標準関数は残っているのですが、長くなってしまったのでこのあたりで今回は解説を一旦終わります。
次回は残っている時間系(UTCとローカルタイム)の変換、時間差の計算について解説します。