C標準ライブラリ -<time.h>
概要
time.hヘッダーファイルは、4つの変数型、2つのマクロ、および日付と時刻を操作するさまざまな関数を定義しています。
<time.h>C標準ライブラリ内のヘッダーファイルであり、日付と時刻を処理・操作するための関数と型を提供します。このヘッダーファイルの関数は、現在時刻の取得、時刻の設定、時刻のフォーマット、時間差の計算などに使用されます。
定数とマクロ
| 定数/マクロ | 説明 |
|---|---|
CLOCKS_PER_SEC | 1秒あたりのクロック周期数。 |
NULL | ヌルポインタ定数。 |
TIME_UTC | UTC時間(C11)を表します。 |
ライブラリ変数
以下は、ヘッダーファイル time.h で定義されている変数型です:
| 番号 | 変数 & 説明 |
|---|---|
| 1 | size_t 符号なし整数型であり、これはsizeofキーワードの結果です。 |
| 2 | clock_t これはプロセッサ時間を格納するのに適した型です。 |
| 3 | time_t is これはカレンダー時間(暦時刻)を格納するのに適した型です。 |
| 4 | struct 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 で定義されているマクロです:
| 番号 | マクロ & 説明 |
|---|---|
| 1 | NULL このマクロはヌルポインタ定数の値です。 |
| 2 | CLOCKS_PER_SEC このマクロは、1秒あたりのプロセッサクロック数を表します。 |
ライブラリ関数
以下は、ヘッダーファイル time.h で定義されている関数です:
| 番号 | 関数 & 説明 |
|---|---|
| 1 | char *asctime(const struct tm *timeptr) 構造体 timeptr の日付と時刻を表す文字列へのポインタを返します。 |
| 2 | clock_t clock(void) プログラムの実行開始時(通常はプログラムの先頭)からのプロセッサクロックの使用時間を返します。 |
| 3 | char *ctime(const time_t *timer) 引数 timer に基づく現地時間を表す文字列を返します。 |
| 4 | double difftime(time_t time1, time_t time2) time1 と time2 の間の秒数の差 (time1 - time2) を返します。 |
| 5 | struct tm *gmtime(const time_t *timer) timer の値は tm 構造体に分解され、協定世界時(UTC)(グリニッジ標準時(GMT)とも呼ばれる)で表現されます。 |
| 6 | struct tm *localtime(const time_t *timer) timer の値は tm 構造体に分解され、ローカルタイムゾーンで表現されます。 |
| 7 | time_t mktime(struct tm *timeptr) timeptr が指す構造体を、ローカルタイムゾーンに基づく time_t 値に変換します。 |
| 8 | size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) format で定義されたフォーマット規則に従って、構造体 timeptr が表す時刻をフォーマットし、それを str に格納します。 |
| 9 | time_t time(time_t *timer) 現在のカレンダー時間を計算し、それを time_t 形式にエンコードします。 |
| 10 | int timespec_get(struct timespec *ts, int base); 現在時刻を取得します(C11)。 |
例
以下は、<time.h>内のいくつかの関数の使用例です。
現在時刻を取得:
例
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
time(¤t_time);
printf("Current time: %s", ctime(¤t_time));
return 0;
}
#include <time.h>
int main() {
time_t current_time;
time(¤t_time);
printf("Current time: %s", ctime(¤t_time));
return 0;
}
時刻のフォーマット:
例
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
struct tm *time_info;
char buffer[80];
time(¤t_time);
time_info = localtime(¤t_time);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", time_info);
printf("Formatted time: %s\n", buffer);
return 0;
}
#include <time.h>
int main() {
time_t current_time;
struct tm *time_info;
char buffer[80];
time(¤t_time);
time_info = localtime(¤t_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;
}
#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;
}
#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プログラムを作成できます。