ページの作成:「== == <br><br> __FORCETOC__ カテゴリ:C
 
編集の要約なし
1行目: 1行目:
==  ==
== 現在の日付や時刻を取得する ==
C言語で、現在の日付や時刻を取得するには、以下の2ステップの処理が必要になる。<br>
# time関数を使用して、現在の暦時刻(Calendar Time)を取得する。
# localtime関数またはgmtime関数を使用して、取得した暦時刻を変換する。
<br>
<source lang="c">
#include <time.h>
time_t time(time_t *timer);
</source>
<br>
<u>'''time関数'''</u><br>
time関数は、現在の暦時刻を処理系の最良の近似で返す関数である。<br>
time関数は、引数timerがNULLではない場合、timerが指すオブジェクトにも戻り値を格納する。<br>
time関数の呼び出しに失敗した場合は、(time_t) - 1を返す。<br>
<br>
time関数の返す暦時刻は、time_t型の値である。<br>
time_t型は時刻を表すことができる算術型の型であるが、そのままでは読めないので、以下に示すgmtime関数またはlocaltime関数を使用して変換する。<br>
<br>
<u>'''localtime関数とgmtime関数'''</u><br>
localtime関数は、timerが指す暦時刻を地方時(local time)に変換し、tm構造体に格納して、そのポインタを返す関数である。<br>
gmtime関数は、timerが指す暦時刻を協定世界時(UTC)に変換し、tm構造体に格納して、そのポインタを返す関数である。<br>
<br>
localtime関数とgmtime関数は、暦時刻の変換に失敗した場合は、NULLを返す。<br>
<source lang="c">
  #include <time.h>
struct tm *localtime(const time_t *timer);
struct tm *gmtime(const time_t *timer);
</source>
<br>
<u>'''tm構造体'''</u><br>
localtime関数やgmtime関数が返すtm構造体は、以下のような構造になっている。<br>
{| class="wikitable"
|-
! データ型 !! メンバ !! 説明
|-
| int || tm_sec || 秒 (0 ~ 60)
|-
| int || tm_min || 分 (0 ~ 59)
|-
| int || tm_hour || 時 (0 ~ 23)
|-
| int || tm_mday || 日 (1 ~ 31)
|-
| int || tm_mon || 1月からの月数 (0 ~ 11)
|-
| int || tm_year || 1900年からの年数
|-
| int || tm_wday || 日曜日からの日数 (0 ~ 6)
|-
| int || tm_yday || 1月1日からの日数 (0 ~ 365)
|-
| int || tm_isdst || <u>夏時間フラグ</u><br>夏時間を採用している場合 : 正<br>夏時間を採用していない場合 : 0<br>この情報が得られない場合 : 負
|}
<br>
以下の例では、time関数を使用して日付・時刻を取得し、localtime関数およびgmtime関数をそれぞれ使用して表示している。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    time_t timer;
    struct tm *local;
    struct tm *utc;
    /* 現在時刻を取得 */
    timer = time(NULL);
    local = localtime(&timer); /* 地方時に変換 */
    /* 地方時 変換後表示 */
    printf("地方時: ");
    printf("%4d/", local->tm_year + 1900);
    printf("%2d/", local->tm_mon + 1);
    printf("%2d ", local->tm_mday);
    printf("%2d:", local->tm_hour);
    printf("%2d:", local->tm_min);
    printf("%2d", local->tm_sec);
    printf(" %d\n", local->tm_isdst);
    utc = gmtime(&timer); /* 協定世界時(UTC)に変換 */
    /* 協定世界時 変換後表示 */
    printf("協定世界時: ");
    printf("%4d/", utc->tm_year + 1900);
    printf("%2d/", utc->tm_mon + 1);
    printf("%2d ", utc->tm_mday);
    printf("%2d:", utc->tm_hour);
    printf("%2d:", utc->tm_min);
    printf("%2d", utc->tm_sec);
    printf(" %d\n", utc->tm_isdst);
    return EXIT_SUCCESS;
}
</source>
<br>
<u>'''実行例'''</u><br>
上記の実行結果は以下のようになる。<br>
地方時: 2008/12/29 19: 4:11 0
協定世界時: 2008/12/29 10: 4:11 0
<br><br>


== 2つの時刻の差を求める ==
C言語で、2つの時刻の差を求めるには、以下の2種類の方法がある。<br>
* difftime関数を使用する方法。
* clock 関数でプロセッサ時間を 2 回取得して差分を求める方法。
<br>
<u>'''difftime 関数を使用して、2つの時刻の差を求める方法'''</u><br>
difftime関数は、2つの暦時刻の差(time1 - time0)を求め、その差を秒単位で返す関数である。<br>
なお、一般的に、time1とtime2はtime関数を使用して取得する。<br>
<source lang="c">
#include <time.h>
double difftime(time_t time1, time_t time0);
</source>
<br>
具体的には、以下のように記述する。<br>
<source lang="c">
double diff;
clock_t time1, time0;
/* 暦時刻を取得 */
time0 = time(NULL);
/* 何らかの処理 */
/* 処理後の暦時刻を取得 */
time1 = time(NULL);
/* 差分を求める */
diff = difftime(time1, time0);
</source>
<br>
<u>'''clock関数を使用して、2つの時刻の差を求める方法'''</u><br>
clock関数は、そのプログラムの実行にだけ関連した処理系定義の時点から、そのプログラムで使用したプロセッサ時間を処理系の最良の近似で返す関数である。<br>
clock関数の呼び出しに失敗した場合は、(clock_t) - 1を返す。<br>
2つの時刻の差を求めるには、clock関数を2回呼び出し、差分を求める。<br>
<source lang="c">
#include <time.h>
clock_t clock(void);
</source>
<br>
具体的には以下のように記述する。<br>
<source lang="c">
double diff;
clock_t start, stop;
/* プロセッサ時間を取得 */
start = clock();
/* 何らかの処理 */
/* 処理後のプロセッサ時間を取得 */
stop = clock();
/* 差分を求める */
diff = (double)(stop - start) / CLOCKS_PER_SEC;
</source>
<br>
以下の例では、difftime関数およびclock関数を使用して、2つの時刻の差を求めている。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void gain_time(void);
int main(void)
{
    clock_t start, stop;
    double diff;
    /* -------- difftime を使う -------- */
    /* 暦時刻を取得 */
    start = time(NULL);
    /* 時間稼ぎ */
    gain_time();
    /* 時間稼ぎ後の暦時刻を取得 */
    stop = time(NULL);
    /* 差分を求める */
    diff = difftime(stop, start);
    /* 差分を表示 */
    printf("difftime 関数 で計測: %.3f[sec]\n", diff);
    /* -------- clock を使う -------- */
    /* プロセス時間を取得 */
    start = clock();
    /* 時間稼ぎ */
    gain_time();
    /* 時間稼ぎ後のプロセス時間を取得 */
    stop = clock();
    /* 差分を求める */
    diff = (double)(stop - start) / CLOCKS_PER_SEC;
    /* 差分を表示 */
    printf("clock 関数 で計測: %.3f[sec]\n", diff);
    return EXIT_SUCCESS;
}
/* 時間稼ぎ */
void gain_time(void)
{
    for (int i = 0; i <= 100000; i++ )
    {
      for (int j = 0; j <= 10000; j++ )
      {
          if ( i % 10000 == 0 )
          {
            putchar('-');
          }
      }
    }
    printf("\n");
}
</source>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C]]
[[カテゴリ:C]]