時間情報の取得方法と扱い方

作成:

ここではC言語での時間情報の取得方法について説明していく、 時間情報には様々な種類があり、また環境により利用できる関数も変わってくる。 C言語の環境であればどこでも利用できる標準関数から始まり、POSIX環境、Windows環境で利用できるAPIも紹介する。

Windows環境

WindowsのAPIでの時刻取得方法について紹介する。

GetLocalTime() GetSystemTime()

WindowsのAPIには以下の様な関数が用意されている。

VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);

GetLocalTime()が、時差を含むローカル時間、 GetSystemTime()が、時差を含まないシステム時間を返す。

取得に利用する構造体は以下のようになっていて、 struct tmに似た構造になっている。 数値を表示する際に加算などは不要な値が設定されており、より素直に使えると思う。

typedef struct _SYSTEMTIME {
   WORD wYear;
   WORD wMonth;
   WORD wDayOfWeek;
   WORD wDay;
   WORD wHour;
   WORD wMinute;
   WORD wSecond;
   WORD wMilliseconds;
} SYSTEMTIME;

使用例は以下、

#include <stdio.h>
#include <windows.h>

int main(int argc, char **argv) {
  SYSTEMTIME st;
  char *dayofweek[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  GetLocalTime(&st);
  printf("%04d/%02d/%02d %s %02d:%02d:%02d.%03d\n",
         st.wYear, st.wMonth, st.wDay,
         dayofweek[st.wDayOfWeek],
         st.wHour, st.wMinute, st.wSecond,
         st.wMilliseconds);
  GetSystemTime(&st);
  printf("%04d/%02d/%02d %s %02d:%02d:%02d.%03d\n",
         st.wYear, st.wMonth, st.wDay,
         dayofweek[st.wDayOfWeek],
         st.wHour, st.wMinute, st.wSecond,
         st.wMilliseconds);
  return 0;
}

実行結果は以下のようになる。

2015/11/05 Thu 22:25:52.104
2015/11/05 Thu 13:25:52.104

構造体としてはミリ秒までを表現できるが、実際の分解能はミリ秒よりも荒く、 前項で紹介したclock_getres()の Cygwin 上での実行結果に出ているように、 分解能は15ミリ秒程度だ。