【C言語】日付を書式を指定して任意の文字列に変換する

この記事では、C言語を使って日付や時刻を指定したフォーマットで文字列に変換する方法について学びます。

具体的には、strftime()関数を使って年、月、日、時、分、秒などをフォーマットする方法や、日付の計算、比較などの応用例も紹介します。

初心者の方でも理解しやすいように、サンプルコードとその実行結果を交えて解説していきますので、ぜひ参考にしてください。

目次から探す

日付の書式指定

C言語で日付や時刻を扱う際、特定のフォーマットで文字列に変換することがよくあります。

これを実現するために、strftime()関数を使用します。

このセクションでは、strftime()関数の基本的な使い方と、よく使われる書式指定子について詳しく解説します。

書式指定子の基本

strftime()関数の概要

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

この関数は、標準ライブラリの <time.h> ヘッダーファイルに含まれています。

関数のプロトタイプは以下の通りです。

size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
項目名説明
s変換後の文字列を格納するバッファ
maxバッファの最大サイズ
format書式指定子を含むフォーマット文字列
tm変換元の struct tm 構造体

この関数は、変換後の文字列の長さを返します。

変換に失敗した場合は0を返します。

書式指定子の一覧

strftime()関数で使用できる書式指定子は多数あります。

以下に代表的な書式指定子を表で紹介します。

書式指定子説明
%Y西暦4桁2023
%y西暦下2桁23
%m月(01-12)04
%d日(01-31)05
%H時(00-23)14
%M分(00-59)30
%S秒(00-59)45
%A曜日(フルスペル)Wednesday
%a曜日(省略形)Wed
%B月(フルスペル)April
%b月(省略形)Apr

よく使われる書式指定子

ここでは、特によく使われる書式指定子について詳しく見ていきます。

%Y(年)

%Yは西暦4桁を表します。

例えば、2023年の場合は 2023 と表示されます。

char buffer[80];
time_t t = time(NULL);
struct tm *tm_info = localtime(&t);
strftime(buffer, 80, "%Y", tm_info);
printf("Year: %s\n", buffer);  // 出力例: Year: 2023

%m(月)

%mは月を2桁で表します。

例えば、4月の場合は 04 と表示されます。

strftime(buffer, 80, "%m", tm_info);
printf("Month: %s\n", buffer);  // 出力例: Month: 04

%d(日)

%dは日を2桁で表します。

例えば、5日の場合は 05 と表示されます。

strftime(buffer, 80, "%d", tm_info);
printf("Day: %s\n", buffer);  // 出力例: Day: 05

%H(時)

%Hは24時間制の時を2桁で表します。

例えば、午後2時の場合は 14 と表示されます。

strftime(buffer, 80, "%H", tm_info);
printf("Hour: %s\n", buffer);  // 出力例: Hour: 14

%M(分)

%Mは分を2桁で表します。

例えば、30分の場合は 30 と表示されます。

strftime(buffer, 80, "%M", tm_info);
printf("Minute: %s\n", buffer);  // 出力例: Minute: 30

%S(秒)

%Sは秒を2桁で表します。

例えば、45秒の場合は 45 と表示されます。

strftime(buffer, 80, "%S", tm_info);
printf("Second: %s\n", buffer);  // 出力例: Second: 45

これらの書式指定子を組み合わせることで、様々なフォーマットで日付や時刻を表示することができます。

次のセクションでは、実際のコード例を通じて具体的な使い方を見ていきます。

実際のコード例

ここでは、実際にC言語で日付を書式指定して文字列に変換する方法を具体的なコード例を通じて解説します。

各例では、strftime()関数を使用して日付や時刻をフォーマットします。

基本的な日付フォーマット

まずは、基本的な日付フォーマットの例を見てみましょう。

以下のコードでは、現在の日付と時刻を取得し、指定したフォーマットで文字列に変換します。

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

このコードを実行すると、以下のような出力が得られます。

現在の日付と時刻: 2023-10-05 14:30:45

年月日を表示する例

次に、年月日だけを表示する例を見てみましょう。

以下のコードでは、年、月、日をそれぞれフォーマットして表示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d", &tm);
    printf("現在の年月日: %s\n", buffer);
    return 0;
}

このコードを実行すると、以下のような出力が得られます。

現在の年月日: 2023-10-05

時分秒を表示する例

次に、時分秒だけを表示する例を見てみましょう。

以下のコードでは、時、分、秒をそれぞれフォーマットして表示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%H:%M:%S", &tm);
    printf("現在の時分秒: %s\n", buffer);
    return 0;
}

このコードを実行すると、以下のような出力が得られます。

現在の時分秒: 14:30:45

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

次に、カスタムフォーマットの例を見てみましょう。

以下のコードでは、独自のフォーマットで日付と時刻を表示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    char buffer[80];
    strftime(buffer, sizeof(buffer), "今日は%Y年%m月%d日です。現在の時刻は%H時%M分%S秒です。", &tm);
    printf("%s\n", buffer);
    return 0;
}

このコードを実行すると、以下のような出力が得られます。

今日は2023年10月05日です。現在の時刻は14時30分45秒です。

日付と時刻を組み合わせた例

次に、日付と時刻を組み合わせた例を見てみましょう。

以下のコードでは、日付と時刻を一緒にフォーマットして表示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tm);
    printf("現在の日付と時刻: %s\n", buffer);
    return 0;
}

このコードを実行すると、以下のような出力が得られます。

現在の日付と時刻: 2023-10-05 14:30:45

曜日を含めた例

最後に、曜日を含めた例を見てみましょう。

以下のコードでは、曜日も含めて日付と時刻をフォーマットして表示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %A %H:%M:%S", &tm);
    printf("現在の日付と時刻(曜日含む): %s\n", buffer);
    return 0;
}

このコードを実行すると、以下のような出力が得られます。

現在の日付と時刻(曜日含む): 2023-10-05 Thursday 14:30:45

以上が、C言語で日付を書式指定して任意の文字列に変換する方法の具体的なコード例です。

これらの例を参考にして、さまざまなフォーマットで日付や時刻を表示するプログラムを作成してみてください。

応用例

日付の計算

C言語では、日付の計算を行うために標準ライブラリの関数を利用します。

特に、time.hヘッダーファイルに含まれる関数が役立ちます。

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

日付の加算・減算

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

例えば、1日を加算する場合は、tm_mdayフィールドを1増やします。

以下に例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    struct tm *tm_now = localtime(&now);
    // 1日を加算
    tm_now->tm_mday += 1;
    // 時刻を正規化
    mktime(tm_now);
    // 結果を表示
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_now);
    printf("1日後: %s\n", buffer);
    return 0;
}

mktime()関数の使い方

mktime()関数は、struct tm構造体を標準のtime_t型に変換し、時刻を正規化します。

これにより、日付の加算や減算を行った後の不正な日付を修正できます。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm date = {0};
    // 2023年10月1日を設定
    date.tm_year = 2023 - 1900; // 年は1900年からの経過年数
    date.tm_mon = 9; // 月は0から11
    date.tm_mday = 1;
    // 時刻を正規化
    time_t t = mktime(&date);
    // 結果を表示
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d", &date);
    printf("日付: %s\n", buffer);
    return 0;
}

日付の比較

日付の比較には、time_t型を使用します。

time_t型は整数型であり、比較演算子を使って簡単に比較できます。

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

difftime()関数の使い方

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

これにより、2つの日付の間隔を計算できます。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm date1 = {0}, date2 = {0};
    // 2023年10月1日を設定
    date1.tm_year = 2023 - 1900;
    date1.tm_mon = 9;
    date1.tm_mday = 1;
    // 2023年10月2日を設定
    date2.tm_year = 2023 - 1900;
    date2.tm_mon = 9;
    date2.tm_mday = 2;
    // time_t型に変換
    time_t t1 = mktime(&date1);
    time_t t2 = mktime(&date2);
    // 差を計算
    double diff = difftime(t2, t1);
    printf("日付の差: %.0f秒\n", diff);
    return 0;
}

日付の前後関係の判定

日付の前後関係を判定するには、time_t型を比較します。

以下の例では、2つの日付の前後関係を判定します。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm date1 = {0}, date2 = {0};
    // 2023年10月1日を設定
    date1.tm_year = 2023 - 1900;
    date1.tm_mon = 9;
    date1.tm_mday = 1;
    // 2023年10月2日を設定
    date2.tm_year = 2023 - 1900;
    date2.tm_mon = 9;
    date2.tm_mday = 2;
    // time_t型に変換
    time_t t1 = mktime(&date1);
    time_t t2 = mktime(&date2);
    // 前後関係を判定
    if (t1 < t2) {
        printf("date1はdate2より前の日付です。\n");
    } else if (t1 > t2) {
        printf("date1はdate2より後の日付です。\n");
    } else {
        printf("date1とdate2は同じ日付です。\n");
    }
    return 0;
}

以上が、C言語で日付を扱う際の基本的な操作と応用例です。

これらの知識を活用して、日付の計算や比較を行うプログラムを作成してみてください。

目次から探す