ホームC言語Tips集日付・時刻 ≫ 現在の日付や時刻を取得する

C言語Tips集 - 現在の日付や時刻を取得する

一般に C言語で現在の日付や時刻を取得するには,以下の 2 ステップの処理が必要になります.

  1. time 関数を使用して,現在の暦時刻 (calendar time) を取得する
  2. localtime 関数や,gmtime 関数を使用して取得した暦時刻を変換する

time

#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 関数を使用して読めるように変換します.

localtime と gmtime

#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 関数は,暦時刻の変換に失敗した場合は空ポインタを返します.

tm 構造体

localtime 関数や,gmtime 関数が返す tm 構造体は以下のような構造をしています.

メンバ意味
inttm_sec秒 (0 〜 60)
inttm_min分 (0 〜 59)
inttm_hour時 (0 〜 23)
inttm_mday日 (1 〜 31)
inttm_mon1 月からの月数 (0 〜 11)
inttm_year1900 年からの年数
inttm_wday日曜日からの日数 (0 〜 6)
inttm_yday1 月1 日からの日数 (0 〜 365)
inttm_isdst夏時間フラグ
夏時間を採用しているとき: 正
夏時間を採用していないとき: 0
この情報が得られないとき: 負

C言語サンプルプログラム

以下に 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言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.

日付・時刻の取得