【C言語】現在の日付を取得する方法

この記事では、C言語を使って現在の日付を取得し、フォーマットする方法について解説します。

具体的には、time.hヘッダーファイルを使って現在の時刻を取得し、それを人間が読みやすい形式に変換する方法を学びます。

目次から探す

C言語で日付を取得する基本的な方法

C言語で現在の日付を取得するためには、標準ライブラリのtime.hヘッダーファイルを使用します。

このセクションでは、time.hの基本的な使い方と、日付を取得するための具体的な関数について解説します。

time.hヘッダーファイルの紹介

time.hとは何か

time.hは、C言語の標準ライブラリに含まれるヘッダーファイルで、時間や日付に関連する関数や型を提供します。

このヘッダーファイルを使用することで、現在の時刻を取得したり、時刻をフォーマットしたりすることができます。

time.hで提供される主な関数

time.hヘッダーファイルには、以下のような主な関数が含まれています。

関数名説明
time()現在の時刻を取得する
localtime()time_t型の時刻を分解して、struct tm型に変換する
strftime()struct tm型の時刻を指定したフォーマットで文字列に変換する
mktime()struct tm型の時刻をtime_t型に変換する
difftime()2つのtime_t型の時刻の差を計算する

次に、これらの関数の中でも特に重要なtime()関数localtime()関数について詳しく見ていきます。

time関数の使用

time関数の概要

time()関数は、現在の時刻を取得するための関数です。

この関数は、time_t型の値を返します。

time_t型は、通常、エポック(1970年1月1日00:00:00 UTC)からの秒数を表します。

time_t型の説明

time_t型は、時間を表すためのデータ型で、通常は整数型として定義されています。

この型は、エポックからの経過秒数を格納するために使用されます。

time関数の使い方と例

以下に、time()関数を使用して現在の時刻を取得する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    
    // 現在の時刻を取得
    current_time = time(NULL);
    
    // 取得した時刻を表示
    printf("現在の時刻(エポックからの秒数): %ld\n", current_time);
    
    return 0;
}

このプログラムを実行すると、現在の時刻がエポックからの秒数として表示されます。

localtime関数の使用

localtime関数の概要

localtime()関数は、time_t型の時刻を分解して、struct tm型に変換するための関数です。

struct tm型は、年、月、日、時、分、秒などの情報を個別に格納するための構造体です。

struct tm型の説明

struct tm型は、以下のようなメンバを持つ構造体です。

項目説明範囲
tm_year年 (1900年からの経過年数)任意の整数
tm_mon月 (0から11、0が1月)0 – 11
tm_mday日 (1から31)1 – 31
tm_hour時 (0から23)0 – 23
tm_min分 (0から59)0 – 59
tm_sec秒 (0から60)0 – 60
tm_wday曜日 (0から6、0が日曜日)0 – 6
tm_yday年内の日数 (0から365)0 – 365
tm_isdst夏時間のフラグ (正の値が夏時間、0が標準時間、負の値が不明)正の値, 0, 負の値

localtime関数の使い方と例

以下に、localtime()関数を使用して現在の日付と時刻を取得する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    struct tm *local_time;
    
    // 現在の時刻を取得
    current_time = time(NULL);
    
    // 現在の時刻をstruct tm型に変換
    local_time = localtime(¤t_time);
    
    // 取得した日付と時刻を表示
    printf("現在の日付と時刻: %d-%02d-%02d %02d:%02d:%02d\n",
           local_time->tm_year + 1900,
           local_time->tm_mon + 1,
           local_time->tm_mday,
           local_time->tm_hour,
           local_time->tm_min,
           local_time->tm_sec);
    
    return 0;
}

このプログラムを実行すると、現在の日付と時刻が「年-月-日 時:分:秒」の形式で表示されます。

例えば、 2023-10-05 14:30:45 のように表示されます。

以上が、C言語で現在の日付を取得する基本的な方法です。

次のセクションでは、取得した日付をフォーマットする方法について詳しく解説します。

現在の日付をフォーマットする方法

C言語で現在の日付を取得するだけでなく、特定のフォーマットで表示することもよくあります。

ここでは、strftime関数を使用して日付をフォーマットする方法について詳しく説明します。

strftime関数の使用

strftime関数の概要

strftime関数は、日付と時刻を指定されたフォーマットで文字列に変換するための関数です。

この関数を使用することで、日付や時刻を人間が読みやすい形式に整形することができます。

size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
項目説明
sフォーマットされた文字列を格納するバッファ
maxバッファの最大サイズ
formatフォーマット指定子を含む文字列
tmstruct tm 型のポインタ

strftime関数のフォーマット指定子

strftime関数では、以下のようなフォーマット指定子を使用して日付や時刻を整形します。

指定子説明
%Y西暦4桁2023
%m月(01-12)04
%d日(01-31)05
%H時(00-23)14
%M分(00-59)30
%S秒(00-59)45
%A曜日(完全な名前)Monday
%a曜日(短縮形)Mon
%B月(完全な名前)April
%b月(短縮形)Apr
%pAM/PMAM

strftime関数の使い方と例

以下に、strftime関数を使用して現在の日付と時刻をフォーマットする例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL); // 現在の時刻を取得
    struct tm *tm_info = localtime(&t); // time_tをstruct tmに変換
    char buffer[80]; // フォーマットされた文字列を格納するバッファ
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", tm_info); // フォーマット
    printf("現在の日付と時刻: %s\n", buffer); // フォーマットされた日付と時刻を表示
    return 0;
}

このプログラムを実行すると、現在の日付と時刻が YYYY-MM-DD HH:MM:SS の形式で表示されます。

日付のカスタムフォーマット

カスタムフォーマットの必要性

特定のアプリケーションやシステムでは、標準的なフォーマットではなく、独自のフォーマットで日付や時刻を表示する必要がある場合があります。

例えば、ログファイルのタイムスタンプやユーザーインターフェースでの表示などです。

よく使われるフォーマット例

以下に、よく使われるカスタムフォーマットの例をいくつか示します。

フォーマット内容
YYYY/MM/DD2023/04/05
DD-MM-YYYY05-04-2023
MM/DD/YYYY04/05/2023
HH:MM:SS AM/PM02:30:45 PM

カスタムフォーマットの実装例

以下に、カスタムフォーマットを使用して日付と時刻を表示する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL); // 現在の時刻を取得
    struct tm *tm_info = localtime(&t); // time_tをstruct tmに変換
    char buffer[80]; // フォーマットされた文字列を格納するバッファ
    strftime(buffer, 80, "%Y/%m/%d %I:%M:%S %p", tm_info); // カスタムフォーマット
    printf("カスタムフォーマットの日付と時刻: %s\n", buffer); // フォーマットされた日付と時刻を表示
    return 0;
}

このプログラムを実行すると、現在の日付と時刻が YYYY/MM/DD HH:MM:SS AM/PM の形式で表示されます。

以上が、C言語で現在の日付をフォーマットする方法です。

strftime関数を使用することで、さまざまなフォーマットで日付や時刻を表示することができます。

これを活用して、アプリケーションの要件に応じた日付表示を実現してください。

応用例

日付の計算

C言語では、日付の計算を行うためにいくつかの関数が用意されています。

特に、日付の加算・減算や日付の比較はよく使われる操作です。

ここでは、それらの操作を具体的に見ていきましょう。

日付の加算・減算

日付の加算や減算を行うには、struct tm構造体を操作し、mktime関数を使用します。

mktime関数は、struct tm構造体を標準の時間形式に変換し、必要な調整を行います。

mktime関数の使用

mktime関数は、struct tm構造体を引数に取り、その構造体を標準の時間形式(time_t型)に変換します。

この関数を使うことで、日付の加算や減算を簡単に行うことができます。

以下に、日付を1日加算する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL); // 現在の時刻を取得
    struct tm *tm = localtime(&t); // time_tをstruct tmに変換
    // 日付を1日加算
    tm->tm_mday += 1;
    // mktime関数で調整
    mktime(tm);
    // 調整後の日付を表示
    printf("1日後の日付: %d-%02d-%02d\n", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
    return 0;
}

このコードでは、現在の日付を取得し、tm_mdayフィールドに1を加算しています。

その後、mktime関数を呼び出して日付を調整し、結果を表示しています。

日付の比較

日付の比較を行うには、time_t型の値を比較する方法が一般的です。

time_t型は整数型であり、比較が容易です。

日付の比較方法

以下に、2つの日付を比較する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm tm1 = {0};
    struct tm tm2 = {0};
    // 2023年10月1日を設定
    tm1.tm_year = 2023 - 1900;
    tm1.tm_mon = 9; // 10月は0から始まるので9
    tm1.tm_mday = 1;
    // 2023年10月2日を設定
    tm2.tm_year = 2023 - 1900;
    tm2.tm_mon = 9;
    tm2.tm_mday = 2;
    // time_tに変換
    time_t t1 = mktime(&tm1);
    time_t t2 = mktime(&tm2);
    // 比較
    if (t1 < t2) {
        printf("2023年10月1日は2023年10月2日より前です。\n");
    } else if (t1 > t2) {
        printf("2023年10月1日は2023年10月2日より後です。\n");
    } else {
        printf("2023年10月1日は2023年10月2日と同じ日です。\n");
    }
    return 0;
}

このコードでは、2つのstruct tm構造体を設定し、それぞれをmktime関数time_t型に変換しています。

その後、time_t型の値を比較して結果を表示しています。

difftime関数の使用

difftime関数は、2つのtime_t型の値の差を秒単位で返します。

この関数を使うことで、日付の差を簡単に計算できます。

以下に、2つの日付の差を計算する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm tm1 = {0};
    struct tm tm2 = {0};
    // 2023年10月1日を設定
    tm1.tm_year = 2023 - 1900;
    tm1.tm_mon = 9; // 10月は0から始まるので9
    tm1.tm_mday = 1;
    // 2023年10月2日を設定
    tm2.tm_year = 2023 - 1900;
    tm2.tm_mon = 9;
    tm2.tm_mday = 2;
    // time_tに変換
    time_t t1 = mktime(&tm1);
    time_t t2 = mktime(&tm2);
    // 差を計算
    double diff = difftime(t2, t1);
    // 結果を表示
    printf("2023年10月1日と2023年10月2日の差は%.0f秒です。\n", diff);
    return 0;
}

このコードでは、2つのstruct tm構造体を設定し、それぞれをmktime関数time_t型に変換しています。

その後、difftime関数を使って2つの日付の差を計算し、結果を表示しています。

以上が、C言語で日付を取得し、計算や比較を行う方法の基本的な解説です。

これらの方法を使うことで、日付に関するさまざまな操作を簡単に行うことができます。

目次から探す