C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

日時情報を経過秒数に変換する

2012.08.10

mktime関数は、tm構造体と呼ぶ構造体に格納されている日時情報を、紀元(1970年1月1日00:00:00 UTC)からの経過秒数に変換します。なお、現在の経過秒数はtime関数で直接取得することができますし、日時情報はgmtime関数とlocaltime関数で取得することができます。

#include <time.h>
time_t mktime(struct tm *tm);

*tmは日時情報が格納されているtm構造体を指定します。

戻り値として、紀元からの経過秒数を返します。エラーの場合は、-1を返します。

tm構造体は<time.h>で定義されており、次のようなメンバーで構成されています。

メンバー名 内容
tm_sec 秒数で、0から59までの値です。(但し、閏秒のため60までの値は許されます。)
tm_min 分数で、0から59までの値です。
tm_hour 真夜中からの通算時間で、0から23までの値です。
tm_mday 月はじめからの日数で、1から31までの値です。
tm_mon 1月からの通算月数で、0から11までの値です。
tm_year 1900年からの通算年数です。
tm_wday 日曜日からの通算日数(曜日)で、0から6までの値です。(0が日曜日です。)
tm_yday 1月1日からの通算日数で、0から365までの値です。
tm_isdst 夏時間が有効かどうかのフラグです。正の値ならば夏時間は有効になり、0ならば無効、負の値ならばこの情報には意味がないことを表します。

mktime関数は、tm構造体のメンバーのm_wday(月はじめからの日数)とtm_yday(1月1日からの通算日数)は無視します。また、メンバーの値が正しい範囲にない場合は正規化されます。(例えば、10月40日は11月9日に変更されます。)

プログラム 例

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

int main()
{
  time_t      timep;
  struct tm   time_inf;
  struct tm   *time_ptr;
  int         year;
  int         mon;
  int         day;
  char        *week_jp[] = {'日', '月', '火', '水', '木', '金', '土', };

  printf('年/月/日を入力してください ==> ');
  scanf('%d/%d/%d', &year, &mon, &day);
  /* tm構造体の設定 */
  time_inf.tm_sec = 1;            /* 秒 */
  time_inf.tm_min = 0;            /* 分 */
  time_inf.tm_hour = 0;           /* 時間 */
  time_inf.tm_mday = day;         /* 日 */
  time_inf.tm_mon = mon - 1;      /* 月 */
  time_inf.tm_year = year - 1900; /* 年 */
  time_inf.tm_wday = 0;           /* 曜日 */
  time_inf.tm_yday = 0;           /* 年内通算日 */
  time_inf.tm_isdst = 0;          /* 夏時間 */

  /* 紀元からの経過秒数に変換 */
  if ((timep = mktime(&time_inf)) != (time_t)-1) {
    /* 経過秒数からtm構造体に変換 */
    time_ptr = localtime(&timep);
    printf('%4d/%02d/%02dは%s曜日です\n',
             time_ptr->tm_year + 1900,
             time_ptr->tm_mon + 1,
             time_ptr->tm_mday,
             week_jp[time_ptr->tm_wday]);
  }
  else {
    printf('年/月/日が不当です\n');
  }

  return 0;
}

例の実行結果

$ ./mktime.exe
年/月/日を入力してください ==> 2008/7/30
2008/07/30は水曜日です
$
$ ./mktime.exe
年/月/日を入力してください ==> 2008/7/32
2008/08/01は金曜日です
$
$ ./mktime.exe
年/月/日を入力してください ==> 2008/12/31
2008/12/31は水曜日です
$

関連記事