mktime

tm 構造体を time_t 型に変換します.

#include <time.h>
time_t mktime(
    struct tm *timeptr
);

mktime 関数は引数 timeptr が指す tm 構造体の中の地方時 (local time) を表現している要素別の時刻を,time 関数が返す値と同じ形式の暦時刻 (calendar time) の値に変換します.

変換の際には tm_wday 要素 (日曜日からの日数) と tm_yday要素 (1月1日からの日数) の元の値は無視され自動的に適切な値が格納されます.

戻り値

  • 成功時: 暦時刻 (time_t型) に変換された値
  • 失敗時: (time_t)(-1)

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

mktime 関数を使用して tm 構造体の内容を time 関数が返す値と同じ形式の暦時刻の値に変換するサンプルプログラムを以下に示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* functions */
void DisplayTime(struct tm *timeptr);

/* main */
int main(void) {
    time_t t;
    struct tm t_in, *local;

    t_in.tm_year = 100; /* 年 (2000) */
    t_in.tm_mon  = 12;  /* 月 */
    t_in.tm_mday = 31;  /* 日 */
    t_in.tm_hour = 23;  /* 時 */
    t_in.tm_min  = 59;  /* 分 */
    t_in.tm_sec  = 59;  /* 秒 */
    t_in.tm_wday = 0;   /* 曜日 (適当に入力) */
    t_in.tm_yday = 0;   /* 1月1日からの日数 (適当に入力) */

    /* 表示 */
    DisplayTime(&t_in);

    /* mktime 関数で変換 */
    if ( (t = mktime(&t_in) ) == (time_t)(-1) ) {
        fprintf(stderr, "error\n");
        return EXIT_FAILURE;
    }

    /* 地方時に変換 */
    local = localtime(&t);

    /* 表示 */
    DisplayTime(local);

    return EXIT_SUCCESS;
}

/* tm構造体の中身を表示する */
void DisplayTime(struct tm *timeptr) {
    printf("%4d/", timeptr->tm_year);
    printf("%2d/", timeptr->tm_mon);
    printf("%2d ", timeptr->tm_mday);
    printf("%2d:", timeptr->tm_hour);
    printf("%2d:", timeptr->tm_min);
    printf("%2d", timeptr->tm_sec);
    printf(" %2d", timeptr->tm_wday);
    printf(" %3d\n", timeptr->tm_yday);
}

実行例

サンプルプログラムの実行結果は以下のようになります.

 100/12/31 23:59:59  0   0
 101/ 0/31 22:59:59  3  30

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

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

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


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

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