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は水曜日です $