この記事では、C言語を使って現在時刻を取得する方法について解説します。
WindowsとUNIX/Linuxの両方の環境での方法を紹介し、具体的なサンプルコードも提供します。
また、取得した時刻をフォーマットして表示する方法や、ログファイルへの記録、タイマー機能の実装など、実際のプログラムで役立つ応用例も説明します。
Windowsでの現在時刻の取得方法
Windows環境で現在時刻を取得する方法はいくつかあります。
ここでは、time 関数
、GetSystemTime 関数
、GetLocalTime 関数
を使った方法について詳しく解説します。
time
関数を使った方法
time
関数の使い方
time 関数
は、C言語の標準ライブラリに含まれている関数で、現在の時刻を取得するために使用されます。
この関数は、1970年1月1日からの経過秒数を返します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
current_time = time(NULL);
printf("Current time in seconds since Epoch: %ld\n", current_time);
return 0;
}
localtime 関数と gmtime 関数の違い
time 関数
で取得した時刻を人間が読みやすい形式に変換するために、localtime 関数
と gmtime 関数
を使用します。
localtime 関数
は、取得した時刻をローカルタイム(システムのタイムゾーン)に変換します。gmtime 関数
は、取得した時刻をUTC(協定世界時)に変換します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
struct tm *local_time, *utc_time;
current_time = time(NULL);
local_time = localtime(¤t_time);
utc_time = gmtime(¤t_time);
printf("Local time: %s", asctime(local_time));
printf("UTC time: %s", asctime(utc_time));
return 0;
}
サンプルコード
以下に、time 関数
と localtime 関数
を使って現在時刻を取得し、表示するサンプルコードを示します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
struct tm *local_time;
// 現在時刻を取得
current_time = time(NULL);
// ローカルタイムに変換
local_time = localtime(¤t_time);
// 現在時刻を表示
printf("Current local time: %s", asctime(local_time));
return 0;
}
GetSystemTime 関数を使った方法
GetSystemTime 関数の使い方
GetSystemTime 関数
は、Windows APIの一部で、システム時刻をUTCで取得します。
この関数は、SYSTEMTIME
構造体に時刻情報を格納します。
#include <stdio.h>
#include <windows.h>
int main() {
SYSTEMTIME st;
GetSystemTime(&st);
printf("System time (UTC): %04d-%02d-%02d %02d:%02d:%02d\n",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return 0;
}
SYSTEMTIME 構造体の説明
SYSTEMTIME
構造体は、以下のメンバーを持ちます。
メンバー | 説明 |
---|---|
wYear | 年 |
wMonth | 月 |
wDayOfWeek | 曜日 |
wDay | 日 |
wHour | 時 |
wMinute | 分 |
wSecond | 秒 |
wMilliseconds | ミリ秒 |
サンプルコード
以下に、GetSystemTime 関数
を使って現在時刻を取得し、表示するサンプルコードを示します。
#include <stdio.h>
#include <windows.h>
int main() {
SYSTEMTIME st;
GetSystemTime(&st);
printf("System time (UTC): %04d-%02d-%02d %02d:%02d:%02d\n",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return 0;
}
GetLocalTime 関数を使った方法
GetLocalTime 関数の使い方
GetLocalTime 関数
は、Windows APIの一部で、システム時刻をローカルタイムで取得します。
この関数も、SYSTEMTIME
構造体に時刻情報を格納します。
#include <stdio.h>
#include <windows.h>
int main() {
SYSTEMTIME st;
GetLocalTime(&st);
printf("Local time: %04d-%02d-%02d %02d:%02d:%02d\n",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return 0;
}
SYSTEMTIME 構造体の再利用
SYSTEMTIME
構造体は、GetSystemTime 関数
と同じ構造体を使用します。
これにより、UTCとローカルタイムの両方を簡単に取得できます。
サンプルコード
以下に、GetLocalTime 関数
を使って現在時刻を取得し、表示するサンプルコードを示します。
#include <stdio.h>
#include <windows.h>
int main() {
SYSTEMTIME st;
GetLocalTime(&st);
printf("Local time: %04d-%02d-%02d %02d:%02d:%02d\n",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return 0;
}
以上が、Windows環境で現在時刻を取得する方法です。
time 関数
、GetSystemTime 関数
、GetLocalTime 関数
を使い分けることで、さまざまな形式で現在時刻を取得できます。
UNIX/Linuxでの現在時刻の取得方法
UNIX/Linux環境で現在時刻を取得する方法はいくつかあります。
ここでは、time 関数
、gettimeofday 関数
、clock_gettime 関数
を使った方法について解説します。
time 関数を使った方法
time 関数の使い方
time 関数
は、現在のカレンダー時刻を取得するための標準的な方法です。
この関数は、1970年1月1日からの経過秒数を返します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
current_time = time(NULL);
if (current_time == ((time_t)-1)) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
printf("現在の時刻(エポックからの秒数): %ld\n", current_time);
return 0;
}
localtime 関数と gmtime 関数の違い
time 関数
で取得した時刻を人間が読みやすい形式に変換するために、localtime 関数
と gmtime 関数
を使用します。
localtime 関数
は、取得した時刻をローカルタイム(システムのタイムゾーン)に変換します。gmtime 関数
は、取得した時刻をUTC(協定世界時)に変換します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
struct tm *local_time, *utc_time;
current_time = time(NULL);
if (current_time == ((time_t)-1)) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
local_time = localtime(¤t_time);
utc_time = gmtime(¤t_time);
printf("ローカルタイム: %s", asctime(local_time));
printf("UTC: %s", asctime(utc_time));
return 0;
}
サンプルコード
以下は、time 関数
と localtime 関数
、gmtime 関数
を使って現在時刻を取得し、表示するサンプルコードです。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
struct tm *local_time, *utc_time;
current_time = time(NULL);
if (current_time == ((time_t)-1)) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
local_time = localtime(¤t_time);
utc_time = gmtime(¤t_time);
printf("ローカルタイム: %s", asctime(local_time));
printf("UTC: %s", asctime(utc_time));
return 0;
}
gettimeofday 関数を使った方法
gettimeofday 関数の使い方
gettimeofday 関数
は、マイクロ秒単位で現在時刻を取得するための関数です。
この関数は、struct timeval
構造体に時刻を格納します。
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval tv;
if (gettimeofday(&tv, NULL) == -1) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
printf("現在の時刻(秒): %ld\n", tv.tv_sec);
printf("現在の時刻(マイクロ秒): %ld\n", tv.tv_usec);
return 0;
}
struct timeval 構造体の説明
struct timeval
構造体は、以下の2つのメンバを持ちます。
tv_sec
: 1970年1月1日からの秒数tv_usec
: 秒未満のマイクロ秒数
サンプルコード
以下は、gettimeofday 関数
を使って現在時刻を取得し、表示するサンプルコードです。
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval tv;
if (gettimeofday(&tv, NULL) == -1) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
printf("現在の時刻(秒): %ld\n", tv.tv_sec);
printf("現在の時刻(マイクロ秒): %ld\n", tv.tv_usec);
return 0;
}
clock_gettime 関数を使った方法
clock_gettime 関数の使い方
clock_gettime 関数
は、ナノ秒単位で現在時刻を取得するための関数です。
この関数は、struct timespec
構造体に時刻を格納します。
#include <stdio.h>
#include <time.h>
int main() {
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
printf("現在の時刻(秒): %ld\n", ts.tv_sec);
printf("現在の時刻(ナノ秒): %ld\n", ts.tv_nsec);
return 0;
}
struct timespec 構造体の説明
struct timespec
構造体は、以下の2つのメンバを持ちます。
tv_sec
: 1970年1月1日からの秒数tv_nsec
: 秒未満のナノ秒数
サンプルコード
以下は、clock_gettime 関数
を使って現在時刻を取得し、表示するサンプルコードです。
#include <stdio.h>
#include <time.h>
int main() {
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
printf("時刻の取得に失敗しました。\n");
return 1;
}
printf("現在の時刻(秒): %ld\n", ts.tv_sec);
printf("現在の時刻(ナノ秒): %ld\n", ts.tv_nsec);
return 0;
}
以上が、UNIX/Linux環境で現在時刻を取得する方法です。
各関数の使い方や構造体の説明を参考にして、適切な方法を選んでください。
時刻のフォーマットと表示
C言語では、取得した時刻を人間が読みやすい形式にフォーマットして表示するための関数がいくつか用意されています。
ここでは、strftime 関数
、asctime 関数
、ctime 関数
の使い方について解説します。
strftime 関数を使ったフォーマット
strftime 関数の使い方
strftime 関数
は、時刻を指定したフォーマットで文字列に変換するための関数です。
この関数を使うことで、自由な形式で時刻を表示することができます。
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
s
: フォーマットされた時刻を格納する文字列バッファmax
: バッファの最大サイズformat
: フォーマット指定子を含む文字列tm: struct tm 型
の時刻情報
フォーマット指定子の一覧
以下は、strftime 関数
で使用できる主なフォーマット指定子の一覧です。
指定子 | 説明 | 例 |
---|---|---|
%Y | 西暦(4桁) | 2023 |
%m | 月(01-12) | 01 |
%d | 日(01-31) | 01 |
%H | 時(00-23) | 14 |
%M | 分(00-59) | 30 |
%S | 秒(00-60) | 45 |
%A | 曜日(完全な名前) | Monday |
%a | 曜日(短縮形) | Mon |
%B | 月(完全な名前) | January |
%b | 月(短縮形) | Jan |
%c | 日付と時刻 | Mon Jan 1 14:30:45 2023 |
%x | 日付 | 01/01/2023 |
%X | 時刻 | 14:30:45 |
サンプルコード
以下は、strftime 関数
を使って現在時刻をフォーマットするサンプルコードです。
#include <stdio.h>
#include <time.h>
int main() {
time_t rawtime;
struct tm *timeinfo;
char buffer[80];
// 現在時刻を取得
time(&rawtime);
timeinfo = localtime(&rawtime);
// 時刻をフォーマット
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
printf("現在時刻: %s\n", buffer);
return 0;
}
このコードを実行すると、以下のような出力が得られます。
現在時刻: 2023-01-01 14:30:45
asctime 関数と ctime 関数
asctime 関数の使い方
asctime 関数
は、struct tm 型
の時刻情報を標準的な文字列形式に変換する関数です。
char *asctime(const struct tm *tm);
tm: struct tm 型
の時刻情報
ctime 関数の使い方
ctime 関数
は、time_t 型
の時刻情報を標準的な文字列形式に変換する関数です。
char *ctime(const time_t *timep);
timep: time_t 型
の時刻情報
サンプルコード
以下は、asctime 関数
と ctime 関数
を使って現在時刻を表示するサンプルコードです。
#include <stdio.h>
#include <time.h>
int main() {
time_t rawtime;
struct tm *timeinfo;
// 現在時刻を取得
time(&rawtime);
timeinfo = localtime(&rawtime);
// asctime 関数を使って時刻を表示
printf("現在時刻 (asctime): %s", asctime(timeinfo));
// ctime 関数を使って時刻を表示
printf("現在時刻 (ctime): %s", ctime(&rawtime));
return 0;
}
このコードを実行すると、以下のような出力が得られます。
現在時刻 (asctime): Mon Jan 1 14:30:45 2023
現在時刻 (ctime): Mon Jan 1 14:30:45 2023
以上が、C言語で現在時刻をフォーマットして表示する方法です。
strftime 関数
を使うことで、自由な形式で時刻を表示することができ、asctime 関数
と ctime 関数
を使うことで、標準的な形式で簡単に時刻を表示することができます。
応用例
ログファイルへの時刻付きメッセージの記録
ログファイルの基本
ログファイルは、プログラムの実行状況やエラー情報を記録するためのファイルです。
これにより、プログラムの動作を後から確認したり、問題が発生した際の原因を特定するのに役立ちます。
ログファイルには通常、時刻情報が含まれており、いつ何が起こったのかを明確にすることができます。
時刻付きメッセージのフォーマット
時刻付きメッセージをログファイルに記録する際には、以下のようなフォーマットが一般的です。
[YYYY-MM-DD HH:MM:SS] メッセージ内容
このフォーマットに従うことで、ログの読みやすさが向上し、後から解析する際にも便利です。
サンプルコード
以下に、C言語で時刻付きメッセージをログファイルに記録するサンプルコードを示します。
#include <stdio.h>
#include <time.h>
void log_message(const char *message) {
FILE *log_file = fopen("logfile.txt", "a");
if (log_file == NULL) {
perror("Failed to open log file");
return;
}
time_t now = time(NULL);
struct tm *local_time = localtime(&now);
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", local_time);
fprintf(log_file, "[%s] %s\n", time_str, message);
fclose(log_file);
}
int main() {
log_message("プログラムが開始されました。");
log_message("エラーが発生しました。");
log_message("プログラムが終了しました。");
return 0;
}
このコードでは、log_message 関数
を使ってログファイルに時刻付きメッセージを記録しています。
strftime 関数
を使って時刻をフォーマットし、fprintf 関数
でログファイルに書き込んでいます。
タイマー機能の実装
タイマーの基本概念
タイマーは、一定の時間が経過した後に特定の処理を実行するための機能です。
C言語では、time 関数
や clock 関数
を使って時間を計測し、タイマー機能を実装することができます。
時刻を使ったタイマーの実装
以下に、C言語で簡単なタイマー機能を実装するサンプルコードを示します。
この例では、指定した秒数が経過した後にメッセージを表示します。
サンプルコード
#include <stdio.h>
#include <time.h>
void start_timer(int seconds) {
time_t start_time = time(NULL);
time_t end_time = start_time + seconds;
printf("タイマーを開始します。%d秒後にメッセージを表示します。\n", seconds);
while (time(NULL) < end_time) {
// 何もしないで待つ
}
printf("タイマーが終了しました。\n");
}
int main() {
start_timer(5); // 5秒のタイマーを設定
return 0;
}
このコードでは、start_timer 関数
を使ってタイマーを開始し、指定した秒数が経過するまで待機します。
time 関数
を使って現在時刻を取得し、ループ内で経過時間をチェックしています。
指定した時間が経過すると、メッセージを表示します。
以上が、C言語での現在時刻を利用した応用例です。
ログファイルへの時刻付きメッセージの記録やタイマー機能の実装は、実際のプログラム開発において非常に役立つ技術です。
ぜひ、これらのサンプルコードを参考にして、自分のプロジェクトに応用してみてください。