【C言語】日時を扱う方法をわかりやすく解説

C言語で日時を扱う方法を学びたいですか?この記事では、C言語の標準ライブラリを使って現在の日時を取得し、表示し、操作する方法をわかりやすく解説します。

具体的なサンプルコードと実行結果を交えながら、日時の加算・減算や比較、フォーマットの方法まで詳しく説明します。

初心者の方でも安心して学べる内容になっていますので、ぜひ最後までご覧ください。

目次から探す

日時を扱うための基本知識

C言語で日時を扱うためには、標準ライブラリの <time.h> を使用します。

このライブラリには、日時を取得・操作・表示するための関数やデータ型が含まれています。

ここでは、基本的な知識として、標準ライブラリの紹介と日時を表すデータ型について解説します。

標準ライブラリ <time.h> の紹介

<time.h> は、C言語の標準ライブラリの一部で、日時や時間に関連する機能を提供します。

このライブラリを使用することで、現在の日時を取得したり、日時を操作したり、特定の形式で日時を表示したりすることができます。

以下に、主な関数とその役割を簡単に紹介します。

関数名説明
time()現在の時刻を取得します。
localtime()time_t 型の時刻を現地時間に変換します。
gmtime()time_t 型の時刻をUTC(協定世界時)に変換します。
mktime()struct tm 型の時刻を time_t 型に変換します。
strftime()struct tm 型の時刻を指定した形式の文字列に変換します。
difftime()2つの time_t 型の時刻の差を計算します。

日時を表すデータ型 struct tm

struct tm は、日時を表すための構造体で、以下のメンバーを持っています。

項目説明
int tm_sec秒 (0-60)
int tm_min分 (0-59)
int tm_hour時 (0-23)
int tm_mday日 (1-31)
int tm_mon月 (0-11、0が1月)
int tm_year年 (1900年からの経過年数)
int tm_wday曜日 (0-6、0が日曜日)
int tm_yday年内の日数 (0-365)
int tm_isdst夏時間(デイライトセービングタイム)のフラグ

この構造体を使用することで、日時の各要素にアクセスしたり、操作したりすることができます。

時刻を表すデータ型 time_t

time_t は、時刻を表すためのデータ型で、通常はエポック(1970年1月1日 00:00:00 UTC)からの経過秒数として表現されます。

このデータ型は、日時の計算や比較に使用されます。

以下に、time_t 型の変数を使用して現在の時刻を取得する例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    current_time = time(NULL); // 現在の時刻を取得
    printf("現在の時刻: %ld\n", current_time);
    return 0;
}

このプログラムを実行すると、現在の時刻がエポックからの経過秒数として表示されます。

time_t 型の変数は、他の関数と組み合わせて使用することで、より具体的な日時情報を取得することができます。

以上が、C言語で日時を扱うための基本知識です。

次のセクションでは、具体的な日時の取得方法について詳しく解説します。

現在の日時を取得する方法

C言語で現在の日時を取得する方法はいくつかあります。

ここでは、標準ライブラリ <time.h> を使用して、現在の日時を取得する方法を解説します。

time() 関数の使い方

time() 関数は、現在の時刻を取得するための関数です。

この関数は、1970年1月1日からの経過秒数を返します。

以下に、time() 関数の使い方を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    
    // 現在の時刻を取得
    current_time = time(NULL);
    
    // 取得した時刻を表示
    printf("現在の時刻(エポック秒): %ld\n", current_time);
    
    return 0;
}

このプログラムを実行すると、現在の時刻がエポック秒(1970年1月1日からの経過秒数)として表示されます。

localtime() 関数と gmtime() 関数の違い

time() 関数で取得した時刻を人間が読みやすい形式に変換するために、localtime() 関数gmtime() 関数を使用します。

  • localtime() 関数は、取得した時刻をローカルタイム(システムのタイムゾーンに基づく時刻)に変換します。
  • gmtime() 関数は、取得した時刻をUTC(協定世界時)に変換します。

以下に、localtime() 関数gmtime() 関数の使い方を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    struct tm *local_time;
    struct tm *utc_time;
    
    // 現在の時刻を取得
    current_time = time(NULL);
    
    // ローカルタイムに変換
    local_time = localtime(¤t_time);
    printf("ローカルタイム: %s", asctime(local_time));
    
    // UTCに変換
    utc_time = gmtime(¤t_time);
    printf("UTC: %s", asctime(utc_time));
    
    return 0;
}

このプログラムを実行すると、ローカルタイムとUTCの両方が表示されます。

strftime() 関数で日時をフォーマットする

strftime() 関数を使用すると、日時を指定したフォーマットで文字列として出力できます。

以下に、strftime() 関数の使い方を示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    struct tm *local_time;
    char buffer[80];
    
    // 現在の時刻を取得
    current_time = time(NULL);
    
    // ローカルタイムに変換
    local_time = localtime(¤t_time);
    
    // 日時をフォーマットして文字列に変換
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);
    printf("フォーマットされた日時: %s\n", buffer);
    
    return 0;
}

このプログラムを実行すると、現在の日時が YYYY-MM-DD HH:MM:SS の形式で表示されます。

strftime() 関数のフォーマット指定子を変更することで、様々な形式で日時を表示することができます。

以上が、C言語で現在の日時を取得する方法です。

次のセクションでは、日時の操作について詳しく解説します。

日時の操作

C言語では、日時の操作を行うためにいくつかの関数が用意されています。

ここでは、日時の加算・減算と日時の比較について詳しく解説します。

日時の加算・減算

日時の加算・減算を行うためには、まず日時を表すデータ型 struct tm を操作し、その後 mktime() 関数を使用して time_t 型に変換します。

mktime() 関数の使い方

mktime() 関数は、struct tm 型の日時を time_t 型に変換するための関数です。

この関数を使用することで、日時の加算・減算が容易になります。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm timeinfo;
    time_t rawtime;
    // 現在の日時を取得
    time(&rawtime);
    timeinfo = *localtime(&rawtime);
    // 現在の日時を表示
    printf("現在の日時: %s", asctime(&timeinfo));
    // 日時を加算(1日後)
    timeinfo.tm_mday += 1;
    mktime(&timeinfo);
    printf("1日後の日時: %s", asctime(&timeinfo));
    // 日時を減算(1日前)
    timeinfo.tm_mday -= 2;
    mktime(&timeinfo);
    printf("1日前の日時: %s", asctime(&timeinfo));
    return 0;
}

このプログラムでは、現在の日時を取得し、1日後と1日前の日時を表示しています。

日時の加算・減算の具体例

以下に、日時の加算・減算の具体例を示します。

#include <stdio.h>
#include <time.h>
void add_days(struct tm *timeinfo, int days) {
    timeinfo->tm_mday += days;
    mktime(timeinfo);
}
void subtract_days(struct tm *timeinfo, int days) {
    timeinfo->tm_mday -= days;
    mktime(timeinfo);
}
int main() {
    struct tm timeinfo;
    time_t rawtime;
    // 現在の日時を取得
    time(&rawtime);
    timeinfo = *localtime(&rawtime);
    // 現在の日時を表示
    printf("現在の日時: %s", asctime(&timeinfo));
    // 3日後の日時を表示
    add_days(&timeinfo, 3);
    printf("3日後の日時: %s", asctime(&timeinfo));
    // 5日前の日時を表示
    subtract_days(&timeinfo, 5);
    printf("5日前の日時: %s", asctime(&timeinfo));
    return 0;
}

このプログラムでは、現在の日時を取得し、3日後と5日前の日時を表示しています。

日時の比較

日時の比較を行うためには、difftime() 関数を使用します。

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

difftime() 関数の使い方

difftime() 関数は、2つの time_t 型の値の差を計算するための関数です。

#include <stdio.h>
#include <time.h>
int main() {
    time_t now, future;
    double seconds;
    // 現在の日時を取得
    time(&now);
    // 1日後の日時を取得
    future = now + 24 * 60 * 60;
    // 2つの日時の差を計算
    seconds = difftime(future, now);
    // 結果を表示
    printf("現在と1日後の差: %.f秒\n", seconds);
    return 0;
}

このプログラムでは、現在の日時と1日後の日時の差を秒単位で表示しています。

日時の比較の具体例

以下に、日時の比較の具体例を示します。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm timeinfo1, timeinfo2;
    time_t time1, time2;
    double seconds;
    // 1つ目の日時を設定
    timeinfo1.tm_year = 2023 - 1900;
    timeinfo1.tm_mon = 9 - 1;
    timeinfo1.tm_mday = 1;
    timeinfo1.tm_hour = 0;
    timeinfo1.tm_min = 0;
    timeinfo1.tm_sec = 0;
    timeinfo1.tm_isdst = -1;
    time1 = mktime(&timeinfo1);
    // 2つ目の日時を設定
    timeinfo2.tm_year = 2023 - 1900;
    timeinfo2.tm_mon = 9 - 1;
    timeinfo2.tm_mday = 10;
    timeinfo2.tm_hour = 0;
    timeinfo2.tm_min = 0;
    timeinfo2.tm_sec = 0;
    timeinfo2.tm_isdst = -1;
    time2 = mktime(&timeinfo2);
    // 2つの日時の差を計算
    seconds = difftime(time2, time1);
    // 結果を表示
    printf("2023年9月1日と2023年9月10日の差: %.f秒\n", seconds);
    return 0;
}

このプログラムでは、2023年9月1日と2023年9月10日の差を秒単位で表示しています。

日時の表示とフォーマット

C言語で日時を扱う際、表示やフォーマットは非常に重要です。

日時を人間が読みやすい形式で表示するためには、いくつかの関数を使うことができます。

ここでは、strftime() 関数asctime() 関数ctime() 関数について詳しく解説します。

strftime() 関数の詳細

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

この関数を使うことで、日時を自由にカスタマイズして表示することができます。

フォーマット指定子の一覧

strftime() 関数では、以下のようなフォーマット指定子を使って日時をカスタマイズします。

フォーマット指定子説明
%Y西暦(4桁)2023
%m月(2桁)01
%d日(2桁)15
%H時(24時間表記、2桁)14
%M分(2桁)30
%S秒(2桁)45
%A曜日(フルスペル)Monday
%a曜日(省略形)Mon
%B月名(フルスペル)January
%b月名(省略形)Jan

カスタムフォーマットの作成

strftime() 関数を使ってカスタムフォーマットを作成する方法を見てみましょう。

以下は、現在の日時を YYYY-MM-DD HH:MM:SS の形式で表示する例です。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL); // 現在の時刻を取得
    struct tm *tm_info = localtime(&t); // ローカルタイムに変換
    char buffer[80];
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", tm_info); // フォーマットして文字列に変換
    printf("現在の日時: %s\n", buffer); // 結果を表示
    return 0;
}

このプログラムを実行すると、現在の日時が 2023-01-15 14:30:45 のように表示されます。

asctime() 関数と ctime() 関数の使い方

asctime() 関数ctime() 関数は、日時を簡単に文字列に変換するための関数です。

これらの関数は、strftime() 関数ほど柔軟ではありませんが、簡単に日時を表示するのに便利です。

asctime() 関数は、struct tm 構造体を文字列に変換します。

以下はその例です。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL); // 現在の時刻を取得
    struct tm *tm_info = localtime(&t); // ローカルタイムに変換
    char *time_str = asctime(tm_info); // 文字列に変換
    printf("現在の日時: %s", time_str); // 結果を表示
    return 0;
}

このプログラムを実行すると、現在の日時が Sun Jan 15 14:30:45 2023 のように表示されます。

ctime() 関数は、time_t 型の時刻を文字列に変換します。

以下はその例です。

#include <stdio.h>
#include <time.h>
int main() {
    time_t t = time(NULL); // 現在の時刻を取得
    char *time_str = ctime(&t); // 文字列に変換
    printf("現在の日時: %s", time_str); // 結果を表示
    return 0;
}

このプログラムを実行すると、現在の日時が Sun Jan 15 14:30:45 2023 のように表示されます。

以上が、C言語で日時を表示およびフォーマットする方法の詳細です。

strftime() 関数を使えば、日時を自由にカスタマイズして表示することができますし、asctime() 関数ctime() 関数を使えば、簡単に日時を文字列に変換することができます。

実践例

ここでは、C言語で日時を扱う具体的なプログラム例を紹介します。

実際のコードとその実行結果を見ながら、日時の取得、加算・減算、比較の方法を理解していきましょう。

現在の日時を表示するプログラム

まずは、現在の日時を取得して表示するプログラムを見てみましょう。

以下のコードでは、time() 関数で現在の時刻を取得し、localtime() 関数でローカルタイムに変換し、strftime() 関数でフォーマットして表示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t now;
    struct tm *local;
    char buffer[80];
    // 現在の時刻を取得
    time(&now);
    // ローカルタイムに変換
    local = localtime(&now);
    // フォーマットして表示
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
    printf("現在の日時: %s\n", buffer);
    return 0;
}

実行結果

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

このプログラムでは、strftime() 関数を使って日時を「年-月-日 時:分:秒」の形式で表示しています。

日時を加算・減算するプログラム

次に、日時を加算・減算するプログラムを見てみましょう。

以下のコードでは、mktime() 関数を使って日時を操作します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t now;
    struct tm local;
    char buffer[80];
    // 現在の時刻を取得
    time(&now);
    // ローカルタイムに変換
    local = *localtime(&now);
    // 1日加算
    local.tm_mday += 1;
    mktime(&local);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &local);
    printf("1日後の日時: %s\n", buffer);
    // 1時間減算
    local = *localtime(&now);
    local.tm_hour -= 1;
    mktime(&local);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &local);
    printf("1時間前の日時: %s\n", buffer);
    return 0;
}

実行結果

1日後の日時: 2023-10-06 14:30:45
1時間前の日時: 2023-10-05 13:30:45

このプログラムでは、tm_mday フィールドを操作して1日加算し、tm_hour フィールドを操作して1時間減算しています。

日時を比較するプログラム

最後に、日時を比較するプログラムを見てみましょう。

以下のコードでは、difftime() 関数を使って2つの日時の差を計算します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t now, future;
    double seconds;
    struct tm local;
    // 現在の時刻を取得
    time(&now);
    // ローカルタイムに変換
    local = *localtime(&now);
    // 1日後の時刻を設定
    local.tm_mday += 1;
    future = mktime(&local);
    // 時刻の差を計算
    seconds = difftime(future, now);
    printf("現在から1日後までの秒数: %.0f秒\n", seconds);
    return 0;
}

実行結果

現在から1日後までの秒数: 86400秒

このプログラムでは、difftime() 関数を使って現在の時刻と1日後の時刻の差を秒単位で計算しています。

1日は86400秒なので、正しい結果が得られています。

以上の実践例を通じて、C言語で日時を扱う基本的な方法を理解できたでしょうか。

これらのプログラムを参考にして、さらに複雑な日時操作を行うプログラムを作成してみてください。

よくある質問とトラブルシューティング

C言語で日時を扱う際に、よくある問題とその解決方法について解説します。

これらのトラブルシューティングを参考にして、日時の取り扱いをスムーズに行いましょう。

日時が正しく表示されない場合

日時が正しく表示されない場合、以下の点を確認してください。

  1. フォーマット指定子の誤り:

strftime() 関数を使用する際に、フォーマット指定子が正しくないと、期待通りの日時が表示されません。

以下は正しいフォーマット指定子の例です。

char buffer[80]; 
time_t rawtime; 
struct tm * timeinfo; 
time(&rawtime); 
timeinfo = localtime(&rawtime); 
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo); 
printf("Formatted date & time: %s\n", buffer);
  1. struct tm の初期化ミス:

struct tm 構造体を使用する際に、初期化が正しく行われていないと、日時が正しく表示されないことがあります。

以下のように初期化を確認してください。

struct tm timeinfo = {0};
  1. タイムゾーンの設定:

localtime() 関数を使用する場合、システムのタイムゾーン設定が影響します。

タイムゾーンが正しく設定されているか確認してください。

タイムゾーンの扱い

C言語でタイムゾーンを扱う際には、以下の点に注意してください。

  1. localtime() と gmtime() の使い分け:

localtime() はシステムのローカルタイムゾーンを使用しますが、gmtime() はUTC(協定世界時)を使用します。

用途に応じて使い分けましょう。

time_t rawtime; 
struct tm * timeinfo; 
time(&rawtime);
// ローカルタイム 
timeinfo = localtime(&rawtime); 
printf("Local time: %s", asctime(timeinfo));
// UTC 
timeinfo = gmtime(&rawtime);
printf("UTC time: %s", asctime(timeinfo));
  1. 環境変数 TZの設定:

プログラム内でタイムゾーンを変更したい場合、環境変数 TZを設定することができます。

setenv("TZ", "Asia/Tokyo", 1);
tzset();

この設定を行うと、localtime() 関数が指定したタイムゾーンを使用します。

日時の精度に関する問題

日時の精度に関する問題は、特に高精度なタイムスタンプが必要な場合に重要です。

以下の点に注意してください。

  1. time() 関数の精度:

time() 関数は秒単位の精度しかありません。

ミリ秒やマイクロ秒単位の精度が必要な場合は、他の関数を使用する必要があります。

  1. gettimeofday() 関数の使用:

ミリ秒やマイクロ秒単位の精度が必要な場合、gettimeofday() 関数を使用します。

struct timeval tv;
gettimeofday(&tv, NULL);
printf("Seconds: %ld\nMicroseconds: %ld\n", tv.tv_sec, tv.tv_usec);
  1. クロックの精度:

システムのクロックの精度も考慮する必要があります。

特に、ネットワークを介して同期する場合、NTP(Network Time Protocol)などを使用してクロックの精度を保つことが重要です。

以上のトラブルシューティングを参考にして、C言語での日時の取り扱いをスムーズに行いましょう。

目次から探す