時刻を扱う
time.hには時間に関わる関数やマクロが定義されています。
しかしこれらの関数は、呼び出せばすぐに使えるというものではなく、いくつかの手順を踏んで使用する必要があります。
ここでは現在時刻を取得し、画面に表示するまでを例に見ていきます。
現在時刻を取得する
現在時刻を取得するのに用いる関数はtime()関数です。
time()関数は引数のポインタか戻り値に取得した現在時刻を格納します。
取得した時刻はtime_t型という型です。
これはtypedefによって定義された型でint型がもとになっています。
そのため、整数値として扱うことができますが、Visual Studioでは警告が出ます。
サンプルコードを見ていきましょう。
time_sample1.c
#include <stdio.h> #include <time.h> void main(void) { time_t t = time(NULL); printf("%lld\n", t); return 0; }
実行してみるとわかりますが、よくわからない数が表示されます。
これは実行するたびに変わります。
これは何かと言うと、グリニッジ標準時である1970/1/1 00:00:00からの経過秒数を表しています。
このままではわからないのでこれを人が見てわかる形に変換しなければなりません。
時刻を変換する
グリニッジ標準時からの経過時間を何月何日何時何分という形に変換します。
時間の単位がわかっているので自作できないこともないですが、簡単に変換してくれる関数があるのでそれを使いましょう。
localtime()はtime_t型の時刻を構造体tm型に変換します。
構造体tm型の定義を見てみましょう。
struct tm date;
などと記述し、tmにカーソルを合わせF12キーを押します。
そうすると以下のように、構造体tm型の定義が参照できます。
time_sample2.c
struct tm { int tm_sec; // seconds after the minute - [0, 60] including leap second int tm_min; // minutes after the hour - [0, 59] int tm_hour; // hours since midnight - [0, 23] int tm_mday; // day of the month - [1, 31] int tm_mon; // months since January - [0, 11] int tm_year; // years since 1900 int tm_wday; // days since Sunday - [0, 6] int tm_yday; // days since January 1 - [0, 365] int tm_isdst; // daylight savings time flag };
これを見れば使い方がわかるでしょう。
わかりにくいものだけ解説すると、mdayは1~31の日付、wdayは曜日、ydayは1~365の年間通しての日付です。
すなわち、構造体tmは変換元のtime_tの値を、何年何月何日何時何分何秒かを表します。
構造体については以下を参照してください。
時刻を表示する
これで時刻の取得ができました。
この時刻を表示したいのですが、構造体のメンバを一つずつ表示していくのも面倒です。
そこでつかうのがasctime()関数とstrftime()関数です。
これらの関数は構造体型の時刻を文字列に変換してくれます。
asctime()は書式が固定されています。
Sat Oct 7 09:31:38 2017
曜日と月は3文字の略称です。続いて日付、時刻、年となります。
strftime()は自分で書式を設定することができます。
strftime(【格納する変数】,【変数の大きさ】,【書式】,【時刻】)
以下が書式に使用できる書式指定子の例です。
指定子 | 意味 |
%a | 曜日(省略) |
%A | 曜日 |
%b | 月(省略) |
%B | 月 |
%m | 月(1~12) |
%c | 日付 |
%H | 時間(12時間) |
%I | 時間(24時間) |
サンプルコード
time_sample3.c
#include <stdio.h> #include <time.h> void main(void) { time_t t = time(NULL); struct tm *date; char strTime[128]; t = time(NULL); date = localtime(&t); printf("%s", asctime(date)); return 0; }