Menu

Category

Archive

logo


time.h 関数 [C]

2014-06-01 16:30:00 +0900
  • このエントリーをはてなブックマークに追加

時間に関する 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 struct tm *localtime(const time_t *);
2 struct tm *gmtime(const time_t *);
3 char *asctime(const struct tm *);
4 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 #include <stdio.h>
 2 #include <time.h>
 3 
 4 int main (void)
 5 {
 6     struct tm *timeptr;
 7     time_t timeval;
 8     char *chtime;
 9     
10     time(&timeval);
11     
12     timeptr = localtime(&timeval);
13     printf("Local time: %d hours %d minutes\n", timeptr->tm_hour, timeptr->tm_min);
14     
15     timeptr = gmtime(&timeval);
16     printf("GMT time: %d hours %d minutes\n", timeptr->tm_hour, timeptr->tm_min);
17     
18     chtime = asctime(timeptr);
19     printf("GMT ASCII time from asctime: %s", chtime);
20     
21     timeptr = localtime(&timeval);
22     chtime = asctime(timeptr);
23     printf("Local ASCII time from asctime: %s", chtime);
24     
25     chtime = ctime(&timeval);
26     printf("Local ASCII time from ctime: %s", chtime);
27 }
28 
29 /* Output:
30     Local time: 16 hours 35 minutes
31     GMT time: 23 hours 35 minutes
32     GMT ASCII time from asctime: Sun Jun  1 23:35:26 2014
33     Local ASCII time from asctime: Sun Jun  1 16:35:26 2014
34     Local ASCII time from ctime: Sun Jun  1 16:35:26 2014
35     Program ended with exit code: 0
36 */

tm 構造体

tm 構造体は、time.h にて、このように定義されています。

 1 struct tm {
 2  int tm_sec;       /* seconds after the minute [0-60] */
 3  int tm_min;       /* minutes after the hour [0-59] */
 4  int tm_hour;  /* hours since midnight [0-23] */
 5  int tm_mday;  /* day of the month [1-31] */
 6  int tm_mon;       /* months since January [0-11] */
 7  int tm_year;  /* years since 1900 */
 8  int tm_wday;  /* days since Sunday [0-6] */
 9  int tm_yday;  /* days since January 1 [0-365] */
10  int tm_isdst; /* Daylight Savings Time flag */
11  long    tm_gmtoff;    /* offset from CUT in seconds */
12  char    *tm_zone;  /* timezone abbreviation */
13 };

localtime() や gmtime() を使用してこれらの値を全て出力するのは面倒なので、ただ時刻を表示したい場合には、ctime() を使用するのが簡単です。