日付時刻(1)

asctime()、ctime()、gmtime()、localtime()、mktime()、timegm()

標準のCで使える関数ですが、知らない人が多いと思うので紹介しておきます。

#include <time.h>
struct tm {
  int tm_sec;     /* 秒 */
  int tm_min;    /* 分 */
  int tm_hour;  /* 時間 */
  int tm_mday; /* 日 */
  int tm_mon;   /* 月 */
  int tm_year;    /* 年 */
  int tm_wday;  /* 曜日 */
  int tm_yday;   /* 年内通算日 */
  int tm_isdst;   /* 夏時間 */
};
char *asctime(const struct tm *tm);
char *ctime(const time_t *timep);
struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);
time_t mktime(struct tm *tm);
time_t timegm(struct tm *tm);
char *asctime(const struct tm *tm);
char *ctime(const time_t *timep);

日時を表す文字列を「Fri Feb 26 21:37:39 2010」という形式で返します。ctime()が受け取るのは、協定世界時(UTC)1970年1月1日00:00:00からの経過秒数(time()で得られます)です。
この文字列は静的に割り当てられた文字列なのでfree()で解放する必要はありません。しかし、日時を扱う関数を呼ぶと上書きされる可能性があるので注意してください。

struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);

協定世界時(UTC)1970年1月1日00:00:00からの経過秒数(time()で得られます)を受け取り、struct tmの形式に変換します。localtime()はローカルのタイムゾーンに合わせて変換し、gmtime()はUTCのまま変換します。
ここで得られるstruct tmは静的に割り当てられているのでfree()で解放する必要はありません。しかし、日時を扱う関数を呼ぶと上書きされる可能性があるので注意してください。

time_t mktime(struct tm *tm);
time_t timegm(struct tm *tm);

協定世界時(UTC)1970年1月1日00:00:00からの経過秒数(time()で得られます)を返します。
mktime()はtmがローカルタイムゾーンであると解釈し、timegmはUTCであると解釈します。

使い方

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

int main() {
  time_t clock;
  struct tm *time_ptr;

  time(&clock);

  printf("time: %lu\n",clock);

  // ctime()の使用例
  printf("ctime: %s",ctime(&clock));

  // asctime()、localtime()、mktime()の使用例
  time_ptr=localtime(&clock);
  printf("asctime(localtime): %s",asctime(time_ptr));
  printf("mktime(localtime): %lu\n",mktime(time_ptr));

  // gmtime()、timegm()の使用例
  time_ptr=gmtime(&clock);
  printf("asctime(gmtime): %s",asctime(time_ptr)); // 9時間前
  printf("timegm(gmtime): %lu\n",timegm(time_ptr));

  return 0;
}

コンパイル

プログラムが書かれたファイル名をtest.cとします。

gcc test.c

実行結果

time: 1267190498
ctime: Fri Feb 26 22:21:38 2010
asctime(localtime): Fri Feb 26 22:21:38 2010
mktime(localtime): 1267190498
asctime(gmtime): Fri Feb 26 13:21:38 2010    <- UTCなので9時間前
timegm(gmtime): 1267190498