この記事では、基本的なtime()関数
の使い方から、localtime()
やstrftime()
を使って時刻をフォーマットする方法、さらには特定のタイムゾーンでの時刻表示やファイルへの書き込み方法まで、初心者にもわかりやすく解説します。
現在時刻を取得する方法
C言語で現在時刻を取得するためには、標準ライブラリのtime.h
を使用します。
このライブラリには、現在時刻を取得するための関数がいくつか用意されています。
その中でも、time()関数
は最も基本的な関数です。
以下では、time()関数
の使い方とその戻り値について詳しく説明します。
time()関数の使い方
time()関数の基本的な使い方
time()関数
は、現在のカレンダー時刻を取得するために使用されます。
この関数は、引数としてtime_t型
のポインタを受け取りますが、引数をNULL
にすることもできます。
以下に、time()関数
の基本的な使い方を示します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
// 現在時刻を取得
current_time = time(NULL);
// 取得した時刻を表示
printf("現在時刻(エポックタイム):%ld\n", current_time);
return 0;
}
このコードでは、time()関数
を使用して現在時刻を取得し、その結果をcurrent_time変数
に格納しています。
time(NULL)
とすることで、現在時刻をエポックタイム(1970年1月1日00:00:00 UTCからの経過秒数)として取得できます。
time()関数の戻り値とその意味
time()関数
の戻り値は、time_t型
の値です。
この値は、エポックタイム(1970年1月1日00:00:00 UTCからの経過秒数)を表します。
エポックタイムは、UNIXシステムや多くのプログラミング言語で標準的に使用される時刻の表現方法です。
例えば、time()関数
が返す値が1672531199
であれば、これは1970年1月1日00:00:00 UTCから1672531199秒経過した時刻を意味します。
この値を人間が読める形式に変換するためには、後述するlocaltime()関数
やstrftime()関数
を使用します。
以下に、time()関数
の戻り値を表示する例を示します。
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
// 現在時刻を取得
current_time = time(NULL);
// 取得した時刻を表示
printf("現在時刻(エポックタイム):%ld\n", current_time);
return 0;
}
このコードを実行すると、現在時刻がエポックタイムとして表示されます。
エポックタイムは、他の時刻形式に変換するための基礎となる値です。
次のセクションでは、このエポックタイムを人間が読める形式に変換する方法について説明します。
現在時刻を人間が読める形式に変換する方法
C言語で現在時刻を取得するだけでは、得られるのはエポックタイム(1970年1月1日からの経過秒数)です。
このままでは人間が読める形式ではないため、これを変換する必要があります。
ここでは、localtime()関数
とstrftime()関数
を使って、エポックタイムを人間が読める形式に変換する方法を解説します。
localtime()関数の使い方
localtime()関数の基本的な使い方
localtime()関数
は、エポックタイムを人間が読める形式に変換するための関数です。
この関数は、time_t型
の値を受け取り、struct tm型
のポインタを返します。
struct tm
は、年、月、日、時、分、秒などの情報を含む構造体です。
以下に、localtime()関数
の基本的な使い方を示します。
#include <stdio.h>
#include <time.h>
int main() {
time_t now;
struct tm *local;
// 現在時刻を取得
time(&now);
// 現在時刻を人間が読める形式に変換
local = localtime(&now);
// 結果を表示
printf("現在時刻: %d-%02d-%02d %02d:%02d:%02d\n",
local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec);
return 0;
}
struct tm型のメンバーの説明
struct tm
は、以下のメンバーを持つ構造体です。
メンバー名 | 型 | 説明 |
---|---|---|
tm_sec | int | 秒(0-60) |
tm_min | int | 分(0-59) |
tm_hour | int | 時(0-23) |
tm_mday | int | 日(1-31) |
tm_mon | int | 月(0-11、0が1月) |
tm_year | int | 年(1900年からの経過年数) |
tm_wday | int | 曜日(0-6、0が日曜日) |
tm_yday | int | 年内の通算日(0-365) |
tm_isdst | int | 夏時間(サマータイム)のフラグ(正の値なら夏時間) |
strftime()関数の使い方
strftime()関数の基本的な使い方
strftime()関数
は、struct tm型
のデータを指定したフォーマットで文字列に変換するための関数です。
この関数を使うことで、日付や時刻を自由な形式で表示することができます。
以下に、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;
}
フォーマット指定子の一覧と使用例
strftime()関数
で使用できるフォーマット指定子は以下の通りです。
指定子 | 説明 | 例 |
---|---|---|
%Y | 年(4桁) | 2023 |
%m | 月(2桁) | 01 |
%d | 日(2桁) | 01 |
%H | 時(2桁、24時間表記) | 14 |
%M | 分(2桁) | 30 |
%S | 秒(2桁) | 45 |
%A | 曜日(フルスペル) | Monday |
%a | 曜日(省略形) | Mon |
%B | 月名(フルスペル) | January |
%b | 月名(省略形) | Jan |
%p | AM/PM | PM |
以下に、いくつかの使用例を示します。
#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), "%A, %B %d, %Y %I:%M:%S %p", local);
// 結果を表示
printf("現在時刻: %s\n", buffer);
return 0;
}
このコードでは、現在時刻が Monday, January 01, 2023 02:30:45 PM
のように表示されます。
フォーマット指定子を組み合わせることで、自由な形式で日付や時刻を表示することができます。
実際のコード例
ここでは、実際にC言語を使って現在時刻を取得し、画面に表示するコード例を紹介します。
まずは基本的なコードから始め、その後にフォーマットを指定して表示する方法を説明します。
現在時刻を取得して表示する基本的なコード
まず、現在時刻を取得して表示する基本的なコードを見てみましょう。
このコードでは、time()関数
とlocaltime()関数
を使用して現在時刻を取得し、asctime()関数
を使って人間が読める形式に変換して表示します。
#include <stdio.h>
#include <time.h>
int main() {
time_t now; // 現在時刻を格納する変数
struct tm *local; // 現在時刻を人間が読める形式に変換するための構造体
// 現在時刻を取得
time(&now);
// 現在時刻を人間が読める形式に変換
local = localtime(&now);
// 現在時刻を表示
printf("現在時刻: %s", asctime(local));
return 0;
}
このコードを実行すると、以下のような出力が得られます。
現在時刻: Wed Oct 4 14:55:02 2023
フォーマットを指定して表示するコード
次に、strftime()関数
を使って現在時刻をフォーマット指定して表示する方法を紹介します。
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-04 14:55:02
このように、strftime()関数
を使うことで、日付や時刻の表示形式を自由にカスタマイズすることができます。
以下に、strftime()関数
で使用できる主なフォーマット指定子を示します。
フォーマット指定子 | 説明 |
---|---|
%Y | 西暦(4桁) |
%m | 月(01-12) |
%d | 日(01-31) |
%H | 時(00-23) |
%M | 分(00-59) |
%S | 秒(00-59) |
%A | 曜日(完全な名前) |
%a | 曜日(短縮形) |
%B | 月(完全な名前) |
%b | 月(短縮形) |
これらの指定子を組み合わせることで、様々な形式で現在時刻を表示することができます。
応用例
現在時刻を特定のタイムゾーンで表示する方法
C言語で現在時刻を特定のタイムゾーンで表示するには、環境変数を利用する方法があります。
環境変数TZを設定することで、localtime()関数
が異なるタイムゾーンの時刻を返すようになります。
以下に、特定のタイムゾーン(例:ニューヨーク時間)で現在時刻を表示するコード例を示します。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
// 環境変数TZを設定(ニューヨーク時間)
setenv("TZ", "America/New_York", 1);
tzset(); // タイムゾーン情報を更新
time_t now = time(NULL);
struct tm *local = localtime(&now);
// 時刻を表示
printf("ニューヨークの現在時刻: %d-%02d-%02d %02d:%02d:%02d\n",
local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec);
return 0;
}
このコードでは、setenv()関数
を使って環境変数TZを設定し、tzset()関数
でタイムゾーン情報を更新しています。
その後、localtime()関数
を使ってニューヨーク時間の現在時刻を取得し、表示しています。
現在時刻をファイルに書き込む方法
現在時刻をファイルに書き込む方法も非常に簡単です。
fopen()関数
でファイルを開き、fprintf()関数
で時刻をファイルに書き込みます。
以下に、現在時刻をファイルに書き込むコード例を示します。
#include <stdio.h>
#include <time.h>
int main() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
// ファイルを開く(書き込みモード)
FILE *file = fopen("current_time.txt", "w");
if (file == NULL) {
perror("ファイルを開けませんでした");
return 1;
}
// 時刻をファイルに書き込む
fprintf(file, "現在時刻: %d-%02d-%02d %02d:%02d:%02d\n",
local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec);
// ファイルを閉じる
fclose(file);
printf("現在時刻をファイルに書き込みました。\n");
return 0;
}
このコードでは、fopen()関数
でcurrent_time.txt
というファイルを開き、fprintf()関数
で現在時刻をファイルに書き込んでいます。
最後に、fclose()関数
でファイルを閉じています。
これらの応用例を使うことで、C言語での時刻操作がさらに便利になります。
特定のタイムゾーンでの時刻表示や、時刻のログをファイルに保存するなど、実際のアプリケーションで役立つ機能を簡単に実装できます。