こんにちは、もがちゃんです。
今回は、C言語で任意の日時情報を作成する際に利用するmktimeの使い方を簡単なサンプルプログラムとともに説明します。
目次
mktimeの構文
#include <time.h>
time_t mktime(struct tm *timeptr);
mktimeの説明
mktimeは、timeptrポインタが指す日付時間の情報を作成します。
mktime関数は、timeptrが指す構造体の中の地方時を表現している要素別の時刻を、time関数が返す値と同じ表現形式をもった暦時刻の値に変換する。
JISX3010 プログラム言語C
timeptr
作成したいローカル時間の日付時間情報へのポインタを指定します。
tm_year(1900年からの年数)、tm_wday(日曜日からの日数)は、無視されます。その他の項目は、範囲外の値でも良い。
timeptrポインタが指す情報は、作成した日付情報に更新されます。
返却値
timeptrが指す日付情報の作成に
成功した場合は、time_t型の日付時間情報を返します。
失敗した場合は、-1を返します。
mktimeの使い方サンプル
mktimeを使って任意の日付時間情報を作成し、その結果を出力する簡単なサンプルプログラムとその実行結果を紹介します。
サンプルプログラムとその実行結果
#include <stdio.h>
#include <time.h>
int main(void) {
/* struct tmの各項目
* 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; 夏時間フラグ
*/
struct tm tm;
time_t t = (time_t)(-1);
/* 例1 範囲内で設定) 2020/11/07 07:12:13 */
tm.tm_year = 2020 - 1900;
tm.tm_mon = 11 - 1;
tm.tm_mday = 7;
tm.tm_hour = 7;
tm.tm_min = 12;
tm.tm_sec = 13;
t = mktime(&tm);
fprintf(stdout, "t = %s", ctime(&t));
fprintf(stdout, "======= struct tm =======\n");
fprintf(stdout, "tm.tm_sec=%d\n", tm.tm_sec);
fprintf(stdout, "tm.tm_min=%d\n", tm.tm_min);
fprintf(stdout, "tm.tm_hour=%d\n", tm.tm_hour);
fprintf(stdout, "tm.tm_mday=%d\n", tm.tm_mday);
fprintf(stdout, "tm.tm_mon=%d\n", tm.tm_mon);
fprintf(stdout, "tm.tm_year=%d\n", tm.tm_year);
fprintf(stdout, "tm.tm_wday=%d\n", tm.tm_wday);
fprintf(stdout, "tm.tm_yday=%d\n", tm.tm_yday);
fprintf(stdout, "tm.tm_isdst=%d\n", tm.tm_isdst);
fprintf(stdout, "==============\n");
/* 例2 範囲外で設定) 2020/12/07 07:12:13 */
tm.tm_year = 2019 - 1900;
tm.tm_mon = (12 + 12) - 1; /* 範囲外 */
tm.tm_mday = 6;
tm.tm_hour = (24 + 7); /* 範囲外 */
tm.tm_min = 11;
tm.tm_sec = (60 + 13); /* 範囲外 */
t = mktime(&tm);
fprintf(stdout, "t = %s", ctime(&t));
fprintf(stdout, "======= struct tm =======\n");
fprintf(stdout, "tm.tm_sec=%d\n", tm.tm_sec);
fprintf(stdout, "tm.tm_min=%d\n", tm.tm_min);
fprintf(stdout, "tm.tm_hour=%d\n", tm.tm_hour);
fprintf(stdout, "tm.tm_mday=%d\n", tm.tm_mday);
fprintf(stdout, "tm.tm_mon=%d\n", tm.tm_mon);
fprintf(stdout, "tm.tm_year=%d\n", tm.tm_year);
fprintf(stdout, "tm.tm_wday=%d\n", tm.tm_wday);
fprintf(stdout, "tm.tm_yday=%d\n", tm.tm_yday);
fprintf(stdout, "tm.tm_isdst=%d\n", tm.tm_isdst);
fprintf(stdout, "==============\n");
}
struct tmに範囲外の数値を指定してもmktimeで日付時間の作成に成功すれば範囲内の値で更新されます。
つまり、mktimeを使用する事で基準となる日時からn日後、n時間後、n日前などの日付時間情報を作成することが出来ます。
mktimeの使い方まとめ
- mktimeを使用することで、簡単に基準となる日時から以下のような計算結果を求めることが出来ます。
基準日時 + n(年/月/日/時/分/秒)
基準日時 – n(年/月/日/時/分/秒) - struct tmのtm_monの値は、1月の場合0で12月の場合は11を意味します。
- struct tmのtm_yearの値は、1900年からの年数を意味します。