この記事では、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言語で日付を扱う際の基本的な操作と応用例です。
これらの知識を活用して、日付の計算や比較を行うプログラムを作成してみてください。