【C言語】現在時刻を取得する方法【Windows/UNIX】

この記事では、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言語での現在時刻を利用した応用例です。

ログファイルへの時刻付きメッセージの記録やタイマー機能の実装は、実際のプログラム開発において非常に役立つ技術です。

ぜひ、これらのサンプルコードを参考にして、自分のプロジェクトに応用してみてください。

目次から探す