標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
ISO C |
両方 |
#include <time.h>
time_t mktime(struct tm *tmptr);
#define _LARGE_TIME_API
#include <time.h>
time64_t mktime64 (struct tm *tmptr);
mktime() 関数は、tmptr が指す tm 構造体 (表 1 で説明) で 現地時間として表されるブロークンダウン時間を、カレンダー時間に変換します。 カレンダー時間とは、エポック (協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00) から数えた秒数です。
mktime() 関数に渡される構造体メンバーの値 は、『time.h』に記載されている範囲の 制限を受けません。指定された範囲外の値の場合、mktime() 関数は、日付計算を使用して値を調整し、有効な日時を生成します (例を参照)。 tm_wday と tm_yday の値は 無視され、戻りでこれらの正しい値が割り当てられます。
この関数が正常終了すると、time がポイントしている構造体の すべてのメンバーは、エポックからの指定された時間を表すように設定され、その際、それらの値は、 time.h に記述されている範囲に入るようにされ ます。tm_wday の値は、 tm_mon の値と tm_year の値が決定された後で設定されます。tm_isdst の 出力値は、mktime() 関数への入力として示された値には関係なく、mktime() 関数によって決定され ます。
アプリケーションが現地時間を判別するのに localtime() 関数を 使用した場合、localtime() 関数は夏時間 (DST 情報が使用できること を想定) を適用するかどうかを判別し、tm_isdst フラグ を正しく設定します。アプリケーションで localtime() 関数が 戻す tm 構造体に対応するエポックからの秒数を判別する場合は、localtime() 関数が設定した tm_isdst フラグを 変更しないでください。
アプリケーションが tm_isdst を 0 に設定した後で mktime() 関数を呼び出す場合、 そのアプリケーションは、システム DST の開始日付および終了日付にかかわらず、夏時間調整が tm 構造体の入力値に 適用されないことを表明しています。同様に、アプリケーションが tm_isdst に 0 より大きい 値を設定している場合は、tm 構造体で表示されている時間が 夏時間用にシフトしたことを表明しています。そのため、mktime() 関数はエポックから数えた秒数で時間をシフトしません。
tm_isdst を -1 に設定すると、mktime() 関数により 夏時間 (DST) が適用されるかどうかの判別が行われます。その場合、mktime() 関数は 0 より大きい tm_isdst を戻します。そうでない場合は、DST 情報がシステムで使用できない場合を除いて、この関数は tm_isdst に 0 を戻します。DST 情報がシステムで使用できない 場合、tm_isdst に -1 を戻します。
TZ 環境変数が夏時間名を指定していない、あるいは DSTNAME が現行の LC_TOD ロケール・カテゴリー で指定されていないため、時間帯で DST が使用されていない可能性があります。このような場合、tm_isdst=1 を コード化して mktime() 関数を呼び出すと、エラーを示す (time-t)-1 が戻されます。
mktime64() 関数は、mktime() 関数とまったく同じように動作します。ただし、2038 年 1 月 1 日の 00:00:00 UTC を超え、9999 年 12 月 31 日の 23:59:59 UTC を限度として構成された日付をサポートする点を除きます。
mktime() 関数は、正常終了した場合、エポック以降の秒数を表す time_t を 戻します。この秒数は、tmptr でポイントされるユーザー指定の tm 構造体 に基づいて現地時間として表された、要素に分解された時刻に 対応します。
mktime() 関数がブロークンダウン時間をカレンダー時間に 変換できない場合、例えば 1970 年 1 月 1 日 (UTC) 以前の時間の場合、エラーを示す (time_t)-1 が戻されます。
⁄* CELEBM19
This example prints the day of the week that is 40 days and
16 hours from the current date.
*⁄
#include <stdio.h>
#include <time.h>
char *wday[] = { "Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday" };
int main(void)
{
time_t t1, t3;
struct tm *t2;
t1 = time(NULL);
t2 = localtime(&t1);
t2 -> tm_mday += 40;
t2 -> tm_hour += 16;
t3 = mktime(t2);
printf("40 days and 16 hours from now, it will be a %s ¥n",
wday[t2 -> tm_wday]);
}
40 days and 16 hours from now, it will be a Sunday