一般に C言語で現在の日付や時刻を取得するには,以下の 2 ステップの処理が必要になります.
#include <time.h>
time_t time( time_t *timer );
time 関数は,現在の暦時刻を処理系の最良の近似で返す関数です.
time 関数は,引数 timer が空ポインタ (NULL) でない場合は,timer が指すオブジェクトにも戻り値を格納します.time 関数の呼び出しに失敗した場合は (time_t)-1 を返します.
time 関数の返す暦時刻は time_t 型の値です.time_t 型は時刻を表すことができる算術型の型ですが,そのままでは人間には読めません.そこで,以下の gmtime 関数や,localtime 関数を使用して読めるように変換します.
#include <time.h>
localtime
struct tm *localtime(
const time_t *timer
);
gmtime
struct tm *gmtime(
const time_t *timer
);
localtime 関数は,timer が指す暦時刻を地方時 (local time) に変換し,tm 構造体に格納して,そのポインタを返す関数です.
gmtime 関数は,timer が指す暦時刻を協定世界時 (UTC) に変換し,tm 構造体に格納して,そのポインタを返す関数です.
localtime 関数と gmtime 関数は,暦時刻の変換に失敗した場合は空ポインタを返します.
localtime 関数や,gmtime 関数が返す tm 構造体は以下のような構造をしています.
型 | メンバ | 意味 |
---|---|---|
int | tm_sec | 秒 (0 ~ 60) |
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 | 1 月1 日からの日数 (0 ~ 365) |
int | tm_isdst | 夏時間フラグ 夏時間を採用しているとき: 正 夏時間を採用していないとき: 0 この情報が得られないとき: 負 |
以下に time 関数を使用して日付・時刻を取得し,localtime 関数と gmtime 関数をそれぞれ使用して表示するサンプルプログラムを示します.
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* main */
int main(void) {
time_t timer;
struct tm *local;
struct tm *utc;
/* 現在時刻を取得 */
timer = time(NULL);
local = localtime(&timer); /* 地方時に変換 */
/* 地方時 変換後表示 */
printf("地方時: ");
printf("%4d/", local->tm_year + 1900);
printf("%2d/", local->tm_mon + 1);
printf("%2d ", local->tm_mday);
printf("%2d:", local->tm_hour);
printf("%2d:", local->tm_min);
printf("%2d", local->tm_sec);
printf(" %d\n", local->tm_isdst);
utc = gmtime(&timer); /* 協定世界時(UTC)に変換 */
/* 協定世界時 変換後表示 */
printf("協定世界時: ");
printf("%4d/", utc->tm_year + 1900);
printf("%2d/", utc->tm_mon + 1);
printf("%2d ", utc->tm_mday);
printf("%2d:", utc->tm_hour);
printf("%2d:", utc->tm_min);
printf("%2d", utc->tm_sec);
printf(" %d\n", utc->tm_isdst);
return EXIT_SUCCESS;
}
サンプルプログラムの実行結果は以下のようになります.
地方時: 2008/12/29 19: 4:11 0 協定世界時: 2008/12/29 10: 4:11 0
※ 結果は実行環境により異なります.
たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.
C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.