時間関数

プロセス実行時からの時間

clock.c

 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
37
38
/*
  time.h [clock]
  
  書式: clock_t clock(void)
  機能: プログラム実行時からの時間を取得
  引数: なし
  戻り値: プログラム実行時からの経過時間を返す.
*/

/*
  clock_t: clock() の戻り値に使われる経過時間を格納する,
           通常, long 型 を typedef している.
  CLOCKS_PER_SEC: clock() での戻り値の単位が time.h で定義されている.
                  1000 の場合は, ミリ秒となる.
  
*/

#include <stdio.h>
#include <time.h>

int main(void){
  clock_t start, end;
  int i;

  start = clock();
  printf("開始時間: %d\n", (int)start);

  /* 何かの処理 */
  for(i = 0; i < 10; i++);
    
  end = clock();

  printf("終了時間: %d\n", (int)end);

  printf( "処理時間: %d[ms]\n", (int)(end-start) );

  return 0;
}

clock.c の実行結果は:

[cactus:~/code_c/refer]% ./clock
開始時間: 1001
終了時間: 1077
処理時間: 76[ms]

システム時刻の取得

time.c

 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
/*
  time.h [clock]
  
  書式: time_t time(time_t *timer)
  機能: システム時刻の取得
  引数: time_t *timer: システム時刻 (秒) を格納
  戻り値: 成功すると, システム時刻を返し,
          失敗すると, -1 を返す.
	  また, 引数 (timer) に NULL を指定すると, システム時刻を返す.
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t sec;
  int yy, dd, hh, mm;

  time(&sec);
  printf("1970 年から %d[秒]経過...\n", (int)sec);

  mm = sec / 60;
  printf("1970 年から %d[分]経過...\n", mm);

  hh = mm / 60;
  printf("1970 年から %d[時間]経過...\n", hh);

  dd = hh / 24;
  printf("1970 年から %d[日]経過...\n", dd);

  yy = dd / 365;
  printf("1970 年から %d[年]経過...\n", yy);

  return 0;
}

time.c の実行結果は:

[cactus:~/code_c/refer]% ./time
1970 年から 1284175853[秒]経過...
1970 年から 21402930[分]経過...
1970 年から 356715[時間]経過...
1970 年から 14863[日]経過...
1970 年から 40[年]経過...

システム時刻の文字列変換

ctime.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
  time.h [ctime]
  
  書式: char *ctime(const time_t *timer)
  機能: システム時刻を日時の文字列に変換
  引数: const time_t *timer: time() で取得したシステム時刻
  戻り値: 日本時間の日時に変換した文字列を返す.
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t sec;
  char *str;

  time(&sec);
  str = ctime(&sec);
  printf("%s", str);

  return 0;
}

ctime.c の実行結果は:

[cactus:~/code_c/refer]% ./ctime
Sat Sep 11 12:35:07 2010

システム時刻の差を取得

difftime.c

 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
/*
  time.h [difftime]
  
  書式: double difftime(time_t t1, time_t t2)
  機能: システム時刻の差を取得
  引数: time_t t1: 差を求める時刻
        time_t t2: 差を求める時刻
  戻り値: t1 - t2 の時刻を double 型で返す.
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t start, end;
  int i;

  time(&start);
  printf("開始時間: %d\n", (int)start);

  /* 何かの処理 */
  for(i = 0; i < 1000000000; i++);

  time(&end);
  printf("終了時間: %d\n", (int)end);
  printf( "処理時間: %f[秒]\n", difftime(end, start) );

  return 0;
}

difftime.c の実行結果は:

[cactus:~/code_c/refer]% ./difftime
開始時間: 1284176546
終了時間: 1284176549
処理時間: 3.000000[秒]

システム時刻を日本時間の構造体に変換

localtime.c

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
  システム時刻とは, 一般的にグリニッジ標準時の
  1970 年 1 月 1 日 00:00:00 を基準とした, 現在
  までの経過時間 (秒) のことで, time() で取得.
*/

/*
  time.h [localtime]
  
  書式: struct tm* localtime(const time_t *timer)
  機能: システム時刻を地域時間用の構造体に変換
  引数: const time_t *timer: time() で取得したシステム時刻
  戻り値: 日本時間に変換された, struct tm 型の構造体で返す.
*/

/*
  struct tm 型の構造体
  int tm_sec  : 秒[0~61] (最大 2 秒のうるう秒を含むため)
  int tm_min  : 分[0~59]
  int tm_hour : 時[0~23]
  int tm_mday : 日[1~31]
  int tm_mon  : 月[0~11] (-1 された月数)
  int tm_year : 年 (1900 からの経過年数)
  int tm_wday : 曜日[0~6](日:0 月:1 火:2 水:3 木:4 金:5 土:6)
  int tm_yday : 1 月 1 日からの経過日数[0~365]
  int tm_isdst: 夏時間の有無 (0:なし 正の値:夏時間)
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t now;
  struct tm *ltm;

  time(&now);
  ltm = localtime(&now);

  printf("%5d: [年]\n", ltm->tm_year + 1900);
  printf("%5d: [月]\n", ltm->tm_mon + 1);
  printf("%5d: [日]\n", ltm->tm_mday);
  printf("%5d: [時]\n", ltm->tm_hour);
  printf("%5d: [分]\n", ltm->tm_min);
  printf("%5d: [秒]\n", ltm->tm_sec);
  printf("%5d: [曜日]\n", ltm->tm_wday);
  printf("%5d: [経過日数]\n", ltm->tm_yday);
  printf("%5d: [夏時間の有無]\n", ltm->tm_isdst);

  return 0;
}

localtime.c の実行結果は:

[cactus:~/code_c/refer]% ./localtime
 2010: [年]
    9: [月]
   11: [日]
   12: [時]
   57: [分]
    4: [秒]
    6: [曜日]
  253: [経過日数]
    0: [夏時間の有無]

システム時刻をグリニッジ標準時の構造体に変換

gmtime.c

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
  システム時刻とは, 一般的にグリニッジ標準時の
  1970 年 1 月 1 日 00:00:00 を基準とした, 現在
  までの経過時間 (秒) のことで, time() で取得.
*/

/*
  time.h [gmtime]
  
  書式: struct tm* gmtime(const time_t *timer)
  機能: システム時刻をグリニッジ標準用の構造体に変換
  引数: const time_t *timer: time() で取得したシステム時刻
  戻り値: グリニッジ標準時に変換された, struct tm 型の構造体で返す.
*/

/*
  struct tm 型の構造体
  int tm_sec  : 秒[0~61] (最大 2 秒のうるう秒を含むため)
  int tm_min  : 分[0~59]
  int tm_hour : 時[0~23]
  int tm_mday : 日[1~31]
  int tm_mon  : 月[0~11] (-1 された月数)
  int tm_year : 年 (1900 からの経過年数)
  int tm_wday : 曜日[0~6](日:0 月:1 火:2 水:3 木:4 金:5 土:6)
  int tm_yday : 1 月 1 日からの経過日数[0~365]
  int tm_isdst: 夏時間の有無 (0:なし 正の値:夏時間)
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t now;
  struct tm *ltm;

  time(&now);
  ltm = gmtime(&now);

  printf("%5d: [年]\n", ltm->tm_year + 1900);
  printf("%5d: [月]\n", ltm->tm_mon + 1);
  printf("%5d: [日]\n", ltm->tm_mday);
  printf("%5d: [時]\n", ltm->tm_hour);
  printf("%5d: [分]\n", ltm->tm_min);
  printf("%5d: [秒]\n", ltm->tm_sec);
  printf("%5d: [曜日]\n", ltm->tm_wday);
  printf("%5d: [経過日数]\n", ltm->tm_yday);
  printf("%5d: [夏時間の有無]\n", ltm->tm_isdst);

  return 0;
}

gmtime.c の実行結果は:

[cactus:~/code_c/refer]% ./gmtime
 2010: [年]
    9: [月]
   11: [日]
    4: [時]
    2: [分]
   17: [秒]
    6: [曜日]
  253: [経過日数]
    0: [夏時間の有無]

tm 構造体を time_t に変換

mktime.c

 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
/*
  time.h [mktime]
  
  書式: time_t mktime(struct tm *stm)
  機能: struct tm 構造体 time_t 型に変換
  引数: struct tm *stm: 変換元となる struct tm 型の構造体
  戻り値: 成功すると, time_t 型に変換された値を返し,
          失敗すると, -1 を返す.
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t tim;
  struct tm stm1;
  struct tm *stm2;

  stm1.tm_year = 2008 - 1900;
  stm1.tm_mon  = 12 - 1;
  stm1.tm_mday = 3;
  stm1.tm_hour = 0;
  stm1.tm_min  = 0;
  stm1.tm_sec  = 0;

  tim = mktime(&stm1);
  printf("%d\n", (int)tim);

  stm2 = localtime(&tim);
  printf("%d\n", stm2->tm_wday);

  return 0;
}

mktime.c の実行結果は:

[cactus:~/code_c/refer]% ./mktime
1228230000
3

tm 構造体を文字列に変換

asctime.c

 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
/*
  time.h [asctime]
  
  書式: char* asctime(struct tm *stm)
  機能: struct tm 構造体 を文字列に変換
  引数: struct tm *stm: 変換元となる struct tm 型の構造体
  戻り値: 変換した文字列を返す.
*/

#include <stdio.h>
#include <time.h>

int main(void){
  time_t tim;
  struct tm *stm;
  char *str;

  time(&tim);
  stm = localtime(&tim);

  str = asctime(stm);
  /* 変換された文字列には, [\n] [\0] が追加される */
  printf("%s", str);

  return 0;
}

asctime.c の実行結果は:

[cactus:~/code_c/refer]% ./asctime
Sat Sep 11 13:14:34 2010

tm 構造体を書式付き文字列に変換

strftime.c

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
  time.h [strftime]
  
  書式: size_t strftime(
        char *s,
	size_t maxsize,
	const char *format,
	const struct tm *stm
	)
  機能: struct tm 構造体を書式付き文字列に変換
  引数: char *s: 変換した文字列の格納先
        size_t maxsize: 文字列の最大バイト数
	const char *format: 書式文字列
	cosnt struct tm *stm: 変換元の struct tm 構造体
  戻り値: 変換した文字のバイト数を返す.
*/

/*
  書式文字列:
  

  %Y : 西暦での年数
  %y : 西暦での下2桁の年数


  %m : 月数[01~12]
  %B : 月の名称
  %b : 月の略称


  %d : 日付[01~31]
  %x : 日付(年月日)
  %c : 日付(年月日)と時刻
  %j : 経過日数

  曜日
  %w : 曜日[0~6](0が日曜日)
  %W : 経過した週[00~53](最初が月曜日)
  %A : 曜日の名称
  %a : 曜日の略称


  %H : 時[00~23]
  %I : 時[00~12]
  %p : 午前/午後の文字列


  %M : 分[00~59]


  %S : 秒[00~61]
  %X : 時刻(00:00:00)

  その他
  %% : %(パーセント記号)を表示
*/

#include <stdio.h>
#include <time.h>
#include <locale.h>

int main(void){
  struct tm *stm;
  time_t tim;
  char s[100];

  setlocale(LC_ALL, "jpn");

  time(&tim);
  stm = localtime(&tim);

  strftime(s, 100, "%Y年%m月%d日(%A)%H時%M分%S秒", stm);

  puts(s);

  return 0;
}

strftime.c の実行結果は:

[cactus:~/code_c/refer]% ./strftime
2010年09月11日(Saturday)13時24分12秒