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
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() を使用するのが簡単です。