[C言語] 日時を扱う方法をわかりやすく解説
C言語で日時を扱うには、標準ライブラリのtime.hを使用します。
このヘッダーファイルには、現在の日時を取得するためのtime()関数や、日時を人間が読みやすい形式に変換するlocaltime()やstrftime()関数が含まれています。
また、struct tmを用いて日時の各要素(年、月、日、時、分、秒)を個別に操作することも可能です。
これらの機能を組み合わせることで、C言語での日時の取得、表示、操作が可能になります。
C言語で日時を扱うための標準ライブラリ
C言語で日時を扱う際には、標準ライブラリを利用することで効率的にプログラムを作成できます。
ここでは、日時を扱うための基本的なライブラリとその使い方について解説します。
time.hヘッダーファイルの役割
time.hは、C言語で日時を扱うための標準ライブラリです。
このヘッダーファイルには、日時を取得、表示、計算するための関数や型が定義されています。
以下に、time.hで提供される主な機能を示します。
| 機能 | 説明 | 
|---|---|
| time_t型 | 時刻を表すためのデータ型 | 
| struct tm | 日時を分解して表現するための構造体 | 
| time()関数 | 現在の時刻を取得する関数 | 
| localtime()関数 | time_t型の時刻をstruct tmに変換する関数 | 
| strftime()関数 | 日時をフォーマットして文字列に変換する関数 | 
struct tm構造体の基本
struct tmは、日時を分解して表現するための構造体です。
この構造体を使用することで、年、月、日、時、分、秒といった個別の日時情報を扱うことができます。
struct tmの主なメンバーは以下の通りです。
| メンバー | 説明 | 
|---|---|
| tm_year | 年(1900年からの経過年数) | 
| tm_mon | 月(0から11、1月が0) | 
| tm_mday | 日(1から31) | 
| tm_hour | 時(0から23) | 
| tm_min | 分(0から59) | 
| tm_sec | 秒(0から60、うるう秒を考慮) | 
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // `time_t`を`struct tm`に変換
    struct tm *local = localtime(&now);
    // 日時を表示
    printf("現在の日時: %d年%d月%d日 %d時%d分%d秒\n",
           local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
           local->tm_hour, local->tm_min, local->tm_sec);
    return 0;
}現在の日時: 2023年10月5日 14時30分45秒このコードは、現在の日時を取得し、struct tmを用いて年、月、日、時、分、秒を個別に表示しています。
time_t型の使い方
time_tは、時刻を表すためのデータ型で、通常はエポック(1970年1月1日00:00:00 UTC)からの経過秒数として表現されます。
この型を使用することで、日時の計算や比較が容易になります。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // 1日後の時刻を計算
    time_t tomorrow = now + 24 * 60 * 60;
    // `time_t`を`struct tm`に変換して表示
    struct tm *local = localtime(&tomorrow);
    printf("1日後の日時: %d年%d月%d日 %d時%d分%d秒\n",
           local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
           local->tm_hour, local->tm_min, local->tm_sec);
    return 0;
}1日後の日時: 2023年10月6日 14時30分45秒このコードは、現在の時刻から1日後の日時を計算し、表示しています。
time_t型を用いることで、簡単に日時の加算が可能です。
日時の取得と表示
C言語では、日時を取得して表示するためのさまざまな方法が用意されています。
ここでは、現在の日時を取得する方法や、日時をフォーマットして表示する方法について詳しく解説します。
現在の日時を取得する方法
現在の日時を取得するには、time()関数を使用します。
この関数は、エポック(1970年1月1日00:00:00 UTC)からの経過秒数を返します。
取得した時刻は、localtime()やgmtime()を使って人間が読みやすい形式に変換できます。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // 取得した時刻を表示
    printf("現在の時刻(エポックからの秒数): %ld\n", now);
    return 0;
}現在の時刻(エポックからの秒数): 1696501845このコードは、現在の時刻をエポックからの秒数として表示します。
localtime関数とgmtime関数の違い
localtime()とgmtime()は、time_t型の時刻をstruct tmに変換するための関数です。
これらの関数の違いは、変換後の時刻がローカルタイムかUTC(協定世界時)かにあります。
| 関数名 | 説明 | 
|---|---|
| localtime() | time_tをローカルタイムに変換 | 
| gmtime() | time_tをUTCに変換 | 
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // ローカルタイムに変換
    struct tm *local = localtime(&now);
    printf("ローカルタイム: %d年%d月%d日 %d時%d分%d秒\n",
           local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
           local->tm_hour, local->tm_min, local->tm_sec);
    // UTCに変換
    struct tm *utc = gmtime(&now);
    printf("UTC: %d年%d月%d日 %d時%d分%d秒\n",
           utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday,
           utc->tm_hour, utc->tm_min, utc->tm_sec);
    return 0;
}ローカルタイム: 2023年10月5日 23時30分45秒
UTC: 2023年10月5日 14時30分45秒このコードは、現在の時刻をローカルタイムとUTCで表示します。
日時をフォーマットして表示する方法
日時をフォーマットして表示するには、strftime()関数を使用します。
この関数は、struct tmの情報を指定したフォーマットに従って文字列に変換します。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    struct tm *local = localtime(&now);
    // フォーマットされた日時を格納する文字列
    char buffer[80];
    // 日時をフォーマットして文字列に変換
    strftime(buffer, sizeof(buffer), "%Y年%m月%d日 %H時%M分%S秒", local);
    printf("フォーマットされた日時: %s\n", buffer);
    return 0;
}フォーマットされた日時: 2023年10月5日 23時30分45秒このコードは、strftime()を使用して、日時を「年-月-日 時:分:秒」の形式で表示します。
strftime関数の使い方
strftime()関数は、日時を指定したフォーマットで文字列に変換するための関数です。
フォーマット指定子を使用して、出力形式を細かく制御できます。
以下に、よく使われるフォーマット指定子を示します。
| 指定子 | 説明 | 
|---|---|
| %Y | 年(4桁) | 
| %m | 月(01から12) | 
| %d | 日(01から31) | 
| %H | 時(00から23) | 
| %M | 分(00から59) | 
| %S | 秒(00から60) | 
strftime()を使うことで、日時を自由にフォーマットして表示することが可能です。
日時の計算
C言語では、日時の計算を行うためのさまざまな方法が用意されています。
ここでは、日時の加算や減算、時間差の計算、日時の比較方法について解説します。
日時の加算と減算
日時の加算や減算は、time_t型を用いることで簡単に行うことができます。
time_tはエポックからの経過秒数を表すため、秒単位での計算が可能です。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // 1日(24時間)の秒数
    int seconds_in_a_day = 24 * 60 * 60;
    // 1日後の時刻を計算
    time_t tomorrow = now + seconds_in_a_day;
    // 1日前の時刻を計算
    time_t yesterday = now - seconds_in_a_day;
    // `struct tm`に変換して表示
    struct tm *local_tomorrow = localtime(&tomorrow);
    struct tm *local_yesterday = localtime(&yesterday);
    printf("1日後の日時: %d年%d月%d日 %d時%d分%d秒\n",
           local_tomorrow->tm_year + 1900, local_tomorrow->tm_mon + 1,
           local_tomorrow->tm_mday, local_tomorrow->tm_hour,
           local_tomorrow->tm_min, local_tomorrow->tm_sec);
    printf("1日前の日時: %d年%d月%d日 %d時%d分%d秒\n",
           local_yesterday->tm_year + 1900, local_yesterday->tm_mon + 1,
           local_yesterday->tm_mday, local_yesterday->tm_hour,
           local_yesterday->tm_min, local_yesterday->tm_sec);
    return 0;
}1日後の日時: 2023年10月6日 23時30分45秒
1日前の日時: 2023年10月4日 23時30分45秒このコードは、現在の時刻から1日後と1日前の日時を計算し、表示します。
difftime関数での時間差の計算
difftime()関数は、2つのtime_t型の時刻の差を計算するために使用されます。
この関数は、2つの時刻の差を秒単位で返します。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // 1時間後の時刻を計算
    time_t one_hour_later = now + 60 * 60;
    // 時間差を計算
    double difference = difftime(one_hour_later, now);
    printf("現在の時刻と1時間後の時刻の差: %.0f秒\n", difference);
    return 0;
}現在の時刻と1時間後の時刻の差: 3600秒このコードは、現在の時刻と1時間後の時刻の差を秒単位で計算し、表示します。
日時の比較方法
日時の比較は、time_t型を用いることで簡単に行うことができます。
time_tは整数型として扱われるため、通常の比較演算子(<, >, ==など)を使用して比較できます。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // 1時間後の時刻を計算
    time_t one_hour_later = now + 60 * 60;
    // 時刻の比較
    if (now < one_hour_later) {
        printf("現在の時刻は1時間後の時刻よりも前です。\n");
    } else if (now > one_hour_later) {
        printf("現在の時刻は1時間後の時刻よりも後です。\n");
    } else {
        printf("現在の時刻と1時間後の時刻は同じです。\n");
    }
    return 0;
}現在の時刻は1時間後の時刻よりも前です。このコードは、現在の時刻と1時間後の時刻を比較し、結果を表示します。
time_t型を用いることで、日時の比較が容易に行えます。
日時の入力と変換
C言語では、日時を文字列として入力し、それを日時データに変換する方法や、逆に日時データを文字列として出力する方法が用意されています。
ここでは、文字列と日時の相互変換について解説します。
文字列から日時への変換
文字列から日時への変換は、ユーザーからの入力を日時データとして扱う際に必要です。
この変換には、strptime()関数を使用します。
strptime()は、指定されたフォーマットに従って文字列を解析し、struct tm構造体に変換します。
strptime関数の使い方
strptime()関数は、文字列を解析してstruct tmに変換するための関数です。
この関数は、指定されたフォーマットに基づいて文字列を解析します。
フォーマット指定子はstrftime()と同様のものを使用します。
#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>
int main() {
    // 解析する文字列
    const char *date_str = "2023-10-05 14:30:45";
    // 解析結果を格納する構造体
    struct tm tm;
    // 文字列を解析して`struct tm`に変換
    if (strptime(date_str, "%Y-%m-%d %H:%M:%S", &tm) != NULL) {
        printf("解析成功: %d年%d月%d日 %d時%d分%d秒\n",
               tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
               tm.tm_hour, tm.tm_min, tm.tm_sec);
    } else {
        printf("解析失敗\n");
    }
    return 0;
}解析成功: 2023年10月5日 14時30分45秒このコードは、指定されたフォーマットに従って文字列を解析し、struct tmに変換します。
日時から文字列への変換
日時データを文字列として出力するには、strftime()関数を使用します。
この関数は、struct tmの情報を指定したフォーマットに従って文字列に変換します。
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    struct tm *local = localtime(&now);
    // フォーマットされた日時を格納する文字列
    char buffer[80];
    // 日時をフォーマットして文字列に変換
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
    printf("フォーマットされた日時: %s\n", buffer);
    return 0;
}フォーマットされた日時: 2023-10-05 23:30:45このコードは、strftime()を使用して、日時を「年-月-日 時:分:秒」の形式で文字列に変換し、表示します。
strftime()を使うことで、日時を自由にフォーマットして文字列として出力することが可能です。
応用例
C言語で日時を扱う技術を応用することで、さまざまな機能を実装することができます。
ここでは、タイマー機能、ログ機能、スケジュール管理アプリの基礎について解説します。
タイマー機能の実装
タイマー機能は、指定した時間が経過したことを検知するために使用されます。
C言語では、time()関数を用いて経過時間を計測することができます。
#include <stdio.h>
#include <time.h>
int main() {
    // タイマーの開始時刻を取得
    time_t start_time = time(NULL);
    // 5秒間待機
    printf("5秒間待機します...\n");
    while (difftime(time(NULL), start_time) < 5) {
        // 何もしない
    }
    printf("5秒経過しました!\n");
    return 0;
}5秒間待機します...
5秒経過しました!このコードは、プログラムの実行を5秒間待機し、その後にメッセージを表示します。
difftime()を用いて経過時間を計測しています。
日時を用いたログ機能の作成
ログ機能は、プログラムの動作を記録するために使用されます。
日時を用いることで、ログの記録時刻を明示することができます。
#include <stdio.h>
#include <time.h>
void log_message(const char *message) {
    // 現在の時刻を取得
    time_t now = time(NULL);
    struct tm *local = localtime(&now);
    // フォーマットされた日時を格納する文字列
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
    // ログメッセージを表示
    printf("[%s] %s\n", buffer, message);
}
int main() {
    log_message("プログラムが開始されました。");
    // ここにプログラムの処理を記述
    log_message("プログラムが終了しました。");
    return 0;
}[2023-10-05 23:30:45] プログラムが開始されました。
[2023-10-05 23:30:45] プログラムが終了しました。このコードは、プログラムの開始と終了時にログメッセージを表示します。
strftime()を用いて日時をフォーマットし、ログに記録しています。
日時を用いたスケジュール管理アプリの基礎
スケジュール管理アプリでは、日時を用いてイベントの登録や通知を行います。
ここでは、簡単なイベントの登録と表示を行うプログラムを紹介します。
#include <stdio.h>
#include <time.h>
typedef struct {
    char title[50];
    struct tm date;
} Event;
void print_event(const Event *event) {
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &event->date);
    printf("イベント: %s, 日時: %s\n", event->title, buffer);
}
int main() {
    // イベントの作成
    Event meeting;
    snprintf(meeting.title, sizeof(meeting.title), "会議");
    // イベントの日付を設定
    strptime("2023-10-10 10:00:00", "%Y-%m-%d %H:%M:%S", &meeting.date);
    // イベントを表示
    print_event(&meeting);
    return 0;
}イベント: 会議, 日時: 2023-10-10 10:00:00このコードは、イベントのタイトルと日時を設定し、表示します。
strptime()を用いて文字列から日時を解析し、イベントの日付を設定しています。
これを基に、スケジュール管理アプリの機能を拡張することができます。
まとめ
C言語で日時を扱う方法を理解することで、さまざまなアプリケーションに応用できます。
日時の取得、表示、計算、変換の基本を学ぶことで、より複雑な日時処理を行うことが可能になります。
この記事を参考に、実際のプログラムで日時を扱う機能を実装してみてください。
 
![[C言語] 年月日から曜日を求める方法を解説](https://af-e.net/wp-content/uploads/2024/08/thumbnail-4747.png)
![[C言語] 現在時刻をマイクロ秒で取得する方法【Windows/UNIX】](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2583.png)
![[C言語] ミリ秒の数値を時間に変換する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2589.png)
![[C言語] 現在時刻を文字列として取得する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2588.png)
![[C言語] 現在時刻を画面に表示する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2587.png)
![[C言語] 現在時刻を取得する方法【Windows/UNIX】](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2586.png)
![[C言語] Windows環境で現在時刻をミリ秒単位で取得する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2585.png)
![[C言語] 現在時刻をミリ秒単位で取得する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2584.png)
![[C言語] 時間を時分秒に変換する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2596.png)
![[C言語] 2つの時間の大小を比較する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2595.png)
![[C言語] 時間を足し算したあとの時刻を取得する](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2594.png)
![[C言語] 現在の時間を取得する方法](https://af-e.net/wp-content/uploads/2024/08/thumbnail-2593.png)