時間に関する C の関数に関して。time.h は、時間に関連した関数が宣言されています。これらは、非常に重要です。ファイルは作成された日時を持っていますし、DB は、変更されたり、作成された際に時間を保持します。OS もユーザーのリクエストがいつ成されたかを確認します。今回は基本的な time.h の関数の使用方法の記事です。
time()
time() 関数は、その関数のリターン値を直接使われることはあまりありませんが、他の time.h に関連された関数で使用されます。time() が返す値は、 ANSI C で強制的に定められているわけではありませんが、1970年1月からの経過した秒数を返します。time() のプロトタイプは、このように定義されています。
1 | time_t time(time_t *timeval); |
time_t は、システム間の違いを吸収するためにありますが、long 型と考えて良いです。この後すぐに見る localtime()、gmttime()、asctime() 全てが、この time_t * を使用し、現在の時刻を違う形式で返します。
time.h の関数
いくつか time.h から抜粋して基本的な関数を見てみます。
1 2 3 4 | struct tm *localtime(const time_t *); struct tm *gmtime(const time_t *); char *asctime(const struct tm *); char *ctime(const time_t *); |
最初の2つの関数は、struct tm のポインターを返します。この2つの関数の内部には static struct tm が存在しています。そのため、これらの関数が値を返してきても、そのスペースは維持されています。同様に、asctime() も内部に static char * が存在します。下のコードで見られるように、私達は、メモリをこの struct tm と char * へ malloc() する必要がないことからも確認することができます。最後の ctime() は、asctime() と同じように char * を返しますが、より簡単に使用することができます。asctime() は、struct tm * を必要とします。struct tm *は、localtime() か、gmtime() を呼び作成するため、最低でも 2 つのステートメントが必要になってしまいます。それに対して、ctime() は time_t * のみ必要とするので、time() を呼び出した後、すぐに実行できます。
これらの使用例はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <stdio.h> #include <time.h> int main (void) { struct tm *timeptr; time_t timeval; char *chtime; time(&timeval); timeptr = localtime(&timeval); printf("Local time: %d hours %d minutes\n", timeptr->tm_hour, timeptr->tm_min); timeptr = gmtime(&timeval); printf("GMT time: %d hours %d minutes\n", timeptr->tm_hour, timeptr->tm_min); chtime = asctime(timeptr); printf("GMT ASCII time from asctime: %s", chtime); timeptr = localtime(&timeval); chtime = asctime(timeptr); printf("Local ASCII time from asctime: %s", chtime); chtime = ctime(&timeval); printf("Local ASCII time from ctime: %s", chtime); } /* Output: Local time: 16 hours 35 minutes GMT time: 23 hours 35 minutes GMT ASCII time from asctime: Sun Jun 1 23:35:26 2014 Local ASCII time from asctime: Sun Jun 1 16:35:26 2014 Local ASCII time from ctime: Sun Jun 1 16:35:26 2014 Program ended with exit code: 0 */ |
tm 構造体
tm 構造体は、time.h にて、このように定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 | struct tm { int tm_sec; /* seconds after the minute [0-60] */ 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 */ long tm_gmtoff; /* offset from CUT in seconds */ char *tm_zone; /* timezone abbreviation */ }; |
localtime() や gmtime() を使用してこれらの値を全て出力するのは面倒なので、ただ時刻を表示したい場合には、ctime() を使用するのが簡単です。