C標準ライブラリ -<time.h>

概要

time.hヘッダーファイルは、4つの変数型、2つのマクロ、および日付と時刻を操作するさまざまな関数を定義しています。

<time.h>C標準ライブラリ内のヘッダーファイルであり、日付と時刻を処理・操作するための関数と型を提供します。このヘッダーファイルの関数は、現在時刻の取得、時刻の設定、時刻のフォーマット、時間差の計算などに使用されます。

定数とマクロ

定数/マクロ説明
CLOCKS_PER_SEC1秒あたりのクロック周期数。
NULLヌルポインタ定数。
TIME_UTCUTC時間(C11)を表します。

ライブラリ変数

以下は、ヘッダーファイル time.h で定義されている変数型です:

番号変数 & 説明
1size_t
符号なし整数型であり、これはsizeofキーワードの結果です。
2clock_t
これはプロセッサ時間を格納するのに適した型です。
3time_t is
これはカレンダー時間(暦時刻)を格納するのに適した型です。
4struct tm
これは時刻と日付を保存するための構造体です。

tm 構造体の定義は次のとおりです:

struct tm {
   int tm_sec;         /* 秒,范围从 0 到 59        */
   int tm_min;         /* 分,范围从 0 到 59        */
   int tm_hour;        /* 小时,范围从 0 到 23        */
   int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
   int tm_mon;         /* 月,范围从 0 到 11        */
   int tm_year;        /* 自 1900 年起的年数        */
   int tm_wday;        /* 一周中的第几天,范围从 0 到 6    */
   int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
   int tm_isdst;       /* 夏令时                */
};

ライブラリマクロ

以下は、ヘッダーファイル time.h で定義されているマクロです:

番号マクロ & 説明
1NULL
このマクロはヌルポインタ定数の値です。
2CLOCKS_PER_SEC
このマクロは、1秒あたりのプロセッサクロック数を表します。

ライブラリ関数

以下は、ヘッダーファイル time.h で定義されている関数です:

番号関数 & 説明
1char *asctime(const struct tm *timeptr)
構造体 timeptr の日付と時刻を表す文字列へのポインタを返します。
2clock_t clock(void)
プログラムの実行開始時(通常はプログラムの先頭)からのプロセッサクロックの使用時間を返します。
3char *ctime(const time_t *timer)
引数 timer に基づく現地時間を表す文字列を返します。
4double difftime(time_t time1, time_t time2)
time1 と time2 の間の秒数の差 (time1 - time2) を返します。
5struct tm *gmtime(const time_t *timer)
timer の値は tm 構造体に分解され、協定世界時(UTC)(グリニッジ標準時(GMT)とも呼ばれる)で表現されます。
6struct tm *localtime(const time_t *timer)
timer の値は tm 構造体に分解され、ローカルタイムゾーンで表現されます。
7time_t mktime(struct tm *timeptr)
timeptr が指す構造体を、ローカルタイムゾーンに基づく time_t 値に変換します。
8size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
format で定義されたフォーマット規則に従って、構造体 timeptr が表す時刻をフォーマットし、それを str に格納します。
9time_t time(time_t *timer)
現在のカレンダー時間を計算し、それを time_t 形式にエンコードします。
10int timespec_get(struct timespec *ts, int base);
現在時刻を取得します(C11)。

例

以下は、<time.h>内のいくつかの関数の使用例です。

現在時刻を取得:

例

#include <stdio.h>
#include <time.h>

int main() {
    time_t current_time;
    time(&current_time);
    printf("Current time: %s", ctime(&current_time));

    return 0;
}

時刻のフォーマット:

例

#include <stdio.h>
#include <time.h>

int main() {
    time_t current_time;
    struct tm *time_info;
    char buffer[80];

    time(&current_time);
    time_info = localtime(&current_time);

    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", time_info);
    printf("Formatted time: %s\n", buffer);

    return 0;
}

時間差の計算:

例

#include <stdio.h>
#include <time.h>

int main() {
    time_t start_time, end_time;
    double time_diff;

    time(&start_time);
    // 時間のかかる操作をシミュレートする
    for (int i = 0; i < 100000000; i++);

    time(&end_time);
    time_diff = difftime(end_time, start_time);
    printf("Time difference: %.2f seconds\n", time_diff);

    return 0;
}

使用struct tm:

例

#include <stdio.h>
#include <time.h>

int main() {
    struct tm time_info;
    char buffer[80];

    time_info.tm_year = 2024 - 1900;  // 年は1900年から始まる
    time_info.tm_mon = 5;             // 6月、範囲は0から11
    time_info.tm_mday = 12;
    time_info.tm_hour = 12;
    time_info.tm_min = 0;
    time_info.tm_sec = 0;
    time_info.tm_isdst = -1;          // 夏時間かどうかを自動判定

    mktime(&time_info);

    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &time_info);
    printf("Custom time: %s\n", buffer);

    return 0;
}

注意事項

  • 使用localtimeとgmtime時は、返されたポインタが指すstruct tm構造体は静的に格納されており、呼び出しのたびに以前の内容が上書きされます。
  • 使用mktime関数の場合は、必ずstruct tm内の各フィールドが有効であることが必要です。
  • 使用strftime関数で時刻をフォーマットする場合は、バッファオーバーフローを避けるため、対象バッファが十分に大きいことを確認する必要があります。

理解し使用することにより<time.h>提供される関数を利用すると、日付と時刻の操作を簡単に行え、より多機能で効率的なCプログラムを作成できます。

その他の拡張