【C言語】日時を扱う方法をわかりやすく解説

この記事では、C言語で日時を扱う方法と日時の演算について解説します。

目次から探す

日時の表現方法

プログラミングにおいて、日時を扱う方法はいくつかあります。

ここでは、C言語で日時を表現する方法について解説します。

エポック秒

エポック秒は、1970年1月1日00:00:00 UTCからの経過秒数で日時を表現する方法です。

C言語では、time_t型を使用してエポック秒を表します。

以下は、現在のエポック秒を取得するサンプルコードです。

#include <stdio.h>
#include <time.h>
int main() {
    time_t epoch_seconds = time(NULL);
    printf("現在のエポック秒: %ld\n", epoch_seconds);
    return 0;
}

実行結果は以下のようになります。

現在のエポック秒: 1621234567

構造体tm

構造体tmは、年、月、日、時、分、秒などの要素を個別に持つことができるデータ型です。

C言語では、time.hヘッダーファイルに定義されています。

以下は、現在の日時を構造体tmで取得するサンプルコードです。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time = time(NULL);
    struct tm* time_info = localtime(¤tTime);
    
    printf("現在の日時: %d年%d月%d日 %d:%d:%d\n",
           time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
           time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
    
    return 0;
}

実行結果は以下のようになります。

現在の日時: 2021年5月17日 10:30:45

文字列

日時を文字列として表現する方法もあります。

C言語では、strftime関数を使用して、指定したフォーマットに従った文字列を生成することができます。

以下は、現在の日時を指定したフォーマットの文字列で表示するサンプルコードです。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time = time(NULL);
    struct tm* time_info = localtime(¤tTime);
    
    char time_string[100];
    strftime(time_string, sizeof(time_string), "%Y/%m/%d %H:%M:%S", time_info);
    
    printf("現在の日時: %s\n", time_string);
    
    return 0;
}

実行結果は以下のようになります。

現在の日時: 2021/05/17 10:30:45

以上が、C言語で日時を表現する方法の解説です。

エポック秒、構造体tm、文字列のいずれかの方法を適切に使い、日時を扱うプログラムを作成してみてください。

日時の演算

日時を扱う際には、演算を行うこともあります。

ここでは、エポック秒と構造体tmを用いた日時の演算方法について解説します。

エポック秒の演算

エポック秒の加算・減算

エポック秒は、1970年1月1日00:00:00を起点として経過した秒数を表します。

エポック秒の加算や減算は、単純に秒数を足したり引いたりすることで行うことができます。

以下に、エポック秒の加算と減算の例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time = time(NULL); // 現在のエポック秒を取得
    // 1日後のエポック秒を計算
    time_t next_day = current_time + (24 * 60 * 60);
    // 1日前のエポック秒を計算
    time_t previous_day = current_time - (24 * 60 * 60);
    printf("現在のエポック秒: %ld\n", current_time);
    printf("1日後のエポック秒: %ld\n", next_day);
    printf("1日前のエポック秒: %ld\n", previous_day);
    return 0;
}
現在のエポック秒: 1621234567
1日後のエポック秒: 1621320967
1日前のエポック秒: 1621148167

エポック秒の比較

エポック秒同士の比較も行うことができます。

比較演算子を用いて、エポック秒の大小を判定することができます。

以下に、エポック秒の比較の例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time = time(NULL); // 現在のエポック秒を取得
    // 1日後のエポック秒を計算
    time_t next_day = current_time + (24 * 60 * 60);
    if (next_day > current_time) {
        printf("1日後は現在よりも未来です\n");
    } else if (next_day < current_time) {
        printf("1日後は現在よりも過去です\n");
    } else {
        printf("1日後は現在と同じです\n");
    }
    return 0;
}
1日後は現在よりも未来です

構造体tmの演算

構造体tmの加算・減算

構造体tmは、年月日時分秒などの要素を個別に持つことができるデータ型です。

構造体tmの加算や減算は、time.hライブラリに用意されている関数を使用することで行うことができます。

以下に、構造体tmの加算と減算の例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time = time(NULL); // 現在のエポック秒を取得
    struct tm* current_tm = localtime(¤tTime); // エポック秒を構造体tmに変換
    // 1日後の構造体tmを計算
    time_t next_day = current_time + (24 * 60 * 60);
    struct tm* next_day_tm = localtime(&next_day);
    // 1日前の構造体tmを計算
    time_t previous_day = current_time - (24 * 60 * 60);
    struct tm* previous_day_tm = localtime(&previous_day);
    printf("現在の日時: %d/%d/%d %d:%d:%d\n", current_tm->tm_year + 1900, current_tm->tm_mon + 1, current_tm->tm_mday, current_tm->tm_hour, current_tm->tm_min, current_tm->tm_sec);
    printf("1日後の日時: %d/%d/%d %d:%d:%d\n", next_day_tm->tm_year + 1900, next_day_tm->tm_mon + 1, next_day_tm->tm_mday, next_day_tm->tm_hour, next_day_tm->tm_min, next_day_tm->tm_sec);
    printf("1日前の日時: %d/%d/%d %d:%d:%d\n", previous_day_tm->tm_year + 1900, previous_day_tm->tm_mon + 1, previous_day_tm->tm_mday, previous_day_tm->tm_hour, previous_day_tm->tm_min, previous_day_tm->tm_sec);
    return 0;
}
現在の日時: 2021/5/17 10:30:27
1日後の日時: 2021/5/18 10:30:27
1日前の日時: 2021/5/16 10:30:27

構造体tmの比較

構造体tm同士の比較も行うことができます。

比較演算子を用いて、構造体tmの大小を判定することができます。

以下に、構造体tmの比較の例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time = time(NULL); // 現在のエポック秒を取得
    struct tm* current_tm = localtime(¤tTime); // エポック秒を構造体tmに変換
    // 1日後の構造体tmを計算
    time_t next_day = current_time + (24 * 60 * 60);
    struct tm* next_day_tm = localtime(&next_day);
    if (next_day_tm->tm_year > current_tm->tm_year) {
        printf("1日後は現在よりも未来です\n");
    } else if (next_day_tm->tm_year < current_tm->tm_year) {
        printf("1日後は現在よりも過去です\n");
    } else {
        if (next_day_tm->tm_mon > current_tm->tm_mon) {
            printf("1日後は現在よりも未来です\n");
        } else if (next_day_tm->tm_mon < current_tm->tm_mon) {
            printf("1日後は現在よりも過去です\n");
        } else {
            if (next_day_tm->tm_mday > current_tm->tm_mday) {
                printf("1日後は現在よりも未来です\n");
            } else if (next_day_tm->tm_mday < current_tm->tm_mday) {
                printf("1日後は現在よりも過去です\n");
            } else {
                printf("1日後は現在と同じです\n");
            }
        }
    }
    return 0;
}
1日後は現在よりも未来です

目次から探す