【C言語】2つ日付を加算してその日数を求める方法

この記事では、C言語を使用して日付の加算方法を学ぶことができます。

日付の入力方法や年、月、日の単位での加算方法、さらにうるう年の考慮方法まで、初心者にもわかりやすく解説しています。

日付の計算に興味がある方は、ぜひ読んでみてください。

目次から探す

日付の加算方法

日付の入力方法

日付を入力する方法はいくつかありますが、ここでは以下の2つの方法を紹介します。

  1. 年、月、日を個別に入力する方法
  2. 文字列から日付を取得する方法

年、月、日を入力する方法

年、月、日を個別に入力する方法では、ユーザーに年、月、日を順番に入力してもらいます。

以下は、この方法で日付を入力するためのサンプルコードです。

#include <stdio.h>
int main() {
    int year, month, day;
    printf("年を入力してください: ");
    scanf("%d", &year);
    printf("月を入力してください: ");
    scanf("%d", &month);
    printf("日を入力してください: ");
    scanf("%d", &day);
    printf("入力された日付は %d年%d月%d日 です。\n", year, month, day);
    return 0;
}

上記のコードでは、scanf関数を使用してユーザーから年、月、日を入力しています。

入力された値はそれぞれyearmonthdayという変数に格納され、最後に入力された日付が表示されます。

文字列から日付を取得する方法

文字列から日付を取得する方法では、ユーザーに日付を表す文字列を入力してもらいます。

以下は、この方法で日付を取得するためのサンプルコードです。

#include <stdio.h>
#include <stdlib.h>
int main() {
    char dateStr[11]; // 日付を表す文字列を格納する配列
    printf("日付を入力してください(YYYY/MM/DD): ");
    scanf("%s", dateStr);
    int year = atoi(dateStr); // 年を取得
    int month = atoi(dateStr + 5); // 月を取得
    int day = atoi(dateStr + 8); // 日を取得
    printf("入力された日付は %d年%d月%d日 です。\n", year, month, day);
    return 0;
}

上記のコードでは、scanf関数を使用してユーザーから日付を表す文字列を入力しています。

入力された文字列はdateStrという配列に格納され、atoi関数を使用して年、月、日を取得しています。

最後に取得した日付が表示されます。

以上が日付の入力方法についての説明です。

次に、日付の加算方法について説明します。

日付の加算手法

日付の加算は、年、月、日の単位で行うことができます。

以下では、それぞれの単位での加算方法について説明します。

年単位での加算方法

年単位での加算を行う場合は、単純に指定した年数を加えるだけです。

以下に例を示します。

#include <stdio.h>
int main() {
    int year = 2021;
    int addYears = 3;
    int resultYear = year + addYears;
    printf("加算後の年: %d\n", resultYear);
    return 0;
}

上記のコードでは、yearに2021年を、addYearsに3を指定しています。

resultYearには、yearaddYearsを加えた結果が格納されます。

実行結果は以下の通りです。

加算後の年: 2024

月単位での加算方法

月単位での加算を行う場合は、指定した月数を加えるだけではなく、月のオーバーフローにも注意する必要があります。

以下に例を示します。

#include <stdio.h>
int main() {
    int year = 2021;
    int month = 12;
    int addMonths = 3;
    // 月のオーバーフローを考慮して年と月を計算
    int resultYear = year + (month + addMonths) / 12;
    int resultMonth = (month + addMonths) % 12;
    printf("加算後の年月: %d年%d月\n", resultYear, resultMonth);
    return 0;
}

上記のコードでは、yearに2021年、monthに12月、addMonthsに3を指定しています。

resultYearには、年の加算結果が、resultMonthには月の加算結果が格納されます。

実行結果は以下の通りです。

加算後の年月: 2022年3月

日単位での加算方法

日単位での加算を行う場合は、指定した日数を加えるだけです。

以下に例を示します。

#include <stdio.h>
int main() {
    int year = 2021;
    int month = 12;
    int day = 31;
    int addDays = 7;
    // 日のオーバーフローを考慮して年、月、日を計算
    int resultYear = year;
    int resultMonth = month;
    int resultDay = day + addDays;
    if (resultDay > 31) {
        resultMonth += resultDay / 31;
        resultDay %= 31;
        if (resultMonth > 12) {
            resultYear += resultMonth / 12;
            resultMonth %= 12;
        }
    }
    printf("加算後の年月日: %d年%d月%d日\n", resultYear, resultMonth, resultDay);
    return 0;
}

上記のコードでは、yearに2021年、monthに12月、dayに31日、addDaysに7を指定しています。

resultYearには年の加算結果が、resultMonthには月の加算結果が、resultDayには日の加算結果が格納されます。

実行結果は以下の通りです。

加算後の年月日: 2022年1月7日

うるう年の考慮した加算方法

うるう年の考慮も行いたい場合は、以下のように判定を追加します。

#include <stdio.h>
int isLeapYear(int year) {
    if (year % 400 == 0) {
        return 1;
    } else if (year % 100 == 0) {
        return 0;
    } else if (year % 4 == 0) {
        return 1;
    } else {
        return 0;
    }
}
int main() {
    int year = 2020;
    int month = 2;
    int day = 28;
    int addDays = 3;
    // 日のオーバーフローを考慮して年、月、日を計算
    int resultYear = year;
    int resultMonth = month;
    int resultDay = day + addDays;
    if (resultDay > 28) {
        if (resultMonth == 2) {
            if (isLeapYear(resultYear) && resultDay > 29) {
                resultMonth++;
                resultDay -= 29;
            } else if (!isLeapYear(resultYear) && resultDay > 28) {
                resultMonth++;
                resultDay -= 28;
            }
        } else if (resultMonth == 4 || resultMonth == 6 || resultMonth == 9 || resultMonth == 11) {
            resultMonth++;
            resultDay -= 30;
        } else {
            resultMonth++;
            resultDay -= 31;
        }
        if (resultMonth > 12) {
            resultYear++;
            resultMonth -= 12;
        }
    }
    printf("加算後の年月日: %d年%d月%d日\n", resultYear, resultMonth, resultDay);
    return 0;
}

上記のコードでは、isLeapYear関数を定義してうるう年の判定を行っています。

yearに2020年、monthに2月、dayに28日、addDaysに3を指定しています。

resultYearには年の加算結果が、resultMonthには月の加算結果が、resultDayには日の加算結果が格納されます。

実行結果は以下の通りです。

加算後の年月日: 2020年3月2日

以上が、日付の加算方法についての説明です。

年、月、日の単位で加算することで、日付の計算を行うことができます。

また、うるう年の考慮も忘れずに行いましょう。

目次から探す