【C言語】日付を計算して何日前・何日後を計算する

この記事では、C言語を使って日付の計算方法を学びます。

具体的には、日付の加算や減算、そして日付の差分計算の方法を解説します。

これにより、日付を計算して何日前や何日後かを求めることができるようになります。

初心者の方にもわかりやすく解説していきますので、ぜひご覧ください。

目次から探す

日付の計算方法

日付の計算は、C言語の標準ライブラリである<time.h>を使用して行うことができます。

<time.h>には、日付や時間を扱うための構造体や関数が定義されています。

日付の加算

日付の加算を行うには、struct tm構造体を使用します。

struct tm構造体は、年、月、日、時、分、秒などの要素を持っています。

以下は、指定した日数を加算する関数の例です。

#include <stdio.h>
#include <time.h>
void addDays(struct tm *date, int days) {
    time_t t = mktime(date);  // 指定した日付をtime_t型に変換
    t += days * 24 * 60 * 60; // 日数を秒に変換して加算
    *date = *localtime(&t);   // time_t型をstruct tm型に変換
}
int main() {
    struct tm date = {0};  // 初期化
    date.tm_year = 2022 - 1900;  // 年は1900年からの経過年数で指定
    date.tm_mon = 0;  // 月は0から始まるため、1月を表すには0を指定
    date.tm_mday = 1;  // 日は1から始まるため、1日を表すには1を指定
    addDays(&date, 10);  // 10日加算
    printf("加算後の日付: %d/%d/%d\n", date.tm_year + 1900, date.tm_mon + 1, date.tm_mday);
    return 0;
}

上記のコードでは、addDays関数を定義しています。

この関数は、指定した日数を加算するために、time_t型に変換してから秒単位で加算し、最後にstruct tm型に戻しています。

main関数では、初期の日付を設定し、addDays関数を呼び出して10日加算した結果を表示しています。

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

加算後の日付: 2022/1/11

日付の減算

日付の減算も、加算と同様にstruct tm構造体を使用して行います。

加算と異なるのは、減算する日数を負の値で指定する点です。

以下は、指定した日数を減算する関数の例です。

#include <stdio.h>
#include <time.h>
void subtractDays(struct tm *date, int days) {
    time_t t = mktime(date);  // 指定した日付をtime_t型に変換
    t -= days * 24 * 60 * 60; // 日数を秒に変換して減算
    *date = *localtime(&t);   // time_t型をstruct tm型に変換
}
int main() {
    struct tm date = {0};  // 初期化
    date.tm_year = 2022 - 1900;  // 年は1900年からの経過年数で指定
    date.tm_mon = 0;  // 月は0から始まるため、1月を表すには0を指定
    date.tm_mday = 11;  // 日は1から始まるため、11日を表すには11を指定
    subtractDays(&date, 10);  // 10日減算
    printf("減算後の日付: %d/%d/%d\n", date.tm_year + 1900, date.tm_mon + 1, date.tm_mday);
    return 0;
}

上記のコードでは、subtractDays関数を定義しています。

この関数は、指定した日数を減算するために、time_t型に変換してから秒単位で減算し、最後にstruct tm型に戻しています。

main関数では、初期の日付を設定し、subtractDays関数を呼び出して10日減算した結果を表示しています。

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

減算後の日付: 2022/1/1

日付の差分計算

日付の差分を計算するには、2つの日付をstruct tm構造体で表現し、その差を秒単位で計算します。

以下は、2つの日付の差分を計算する関数の例です。

#include <stdio.h>
#include <time.h>
int getDaysDifference(struct tm *date1, struct tm *date2) {
    time_t t1 = mktime(date1);  // 日付1をtime_t型に変換
    time_t t2 = mktime(date2);  // 日付2をtime_t型に変換
    double diff = difftime(t2, t1);  // 秒単位の差分を計算
    return (int)(diff / (24 * 60 * 60));  // 日単位に変換して返す
}
int main() {
    struct tm date1 = {0};  // 初期化
    date1.tm_year = 2022 - 1900;  // 年は1900年からの経過年数で指定
    date1.tm_mon = 0;  // 月は0から始まるため、1月を表すには0を指定
    date1.tm_mday = 1;  // 日は1から始まるため、1日を表すには1を指定
    struct tm date2 = {0};  // 初期化
    date2.tm_year = 2022 - 1900;  // 年は1900年からの経過年数で指定
    date2.tm_mon = 0;  // 月は0から始まるため、1月を表すには0を指定
    date2.tm_mday = 11;  // 日は1から始まるため、11日を表すには11を指定
    int difference = getDaysDifference(&date1, &date2);  // 日付の差分を計算
    printf("日付の差分: %d日\n", difference);
    return 0;
}

上記のコードでは、getDaysDifference関数を定義しています。

この関数は、2つの日付をtime_t型に変換して差分を計算し、最後に日単位に変換して返します。

main関数では、2つの日付を設定し、getDaysDifference関数を呼び出して日付の差分を表示しています。

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

日付の差分: 10日

以上が、C言語で日付の計算を行う方法の例です。

<time.h>ライブラリの関数や構造体を活用することで、日付の加算、減算、差分計算を簡単に行うことができます。

目次から探す