_mkgmtime、_mkgmtime32、_mkgmtime64
更新 : 2007 年 11 月
tm 構造体によって表現される UTC 時刻を time_t 型によって表現される UTC 時刻に変換します。
time_t _mkgmtime(
struct tm* timeptr
);
__time32_t _mkgmtime32(
struct tm* timeptr
);
__time64_t _mkgmtime64(
struct tm* timeptr
);
パラメータ
- timeptr
変換する UTC 時刻 struct tm へのポインタ。
戻り値
__time32_t 型または __time64_t 型による世界協定時刻 (UTC) 1970 年 1 月 1 日午前 0 時以降の経過秒数。日付が範囲外の場合 (「解説」を参照)、または入力内容が有効な時刻として解釈できない場合、戻り値は –1 になります。
解説
_mkgmtime32 と _mkgmtime64 関数は、UTC 時刻を UTC の __time32_t 型または __time64_t 型に変換します。現地時刻を UTC 時刻に変換するには、mktime、 _mktime32、および _mktime64 を使用します。
Visual C++ 2005 では、_mkgmtime は _mkgmtime64 になるインライン関数で、time_t は __time64_t と同じです。コンパイラが time_t を従来の 32 ビット time_t として解釈するようにするには、_USE_32BIT_TIME_T を定義します。この方法では、2038 年 1 月 19 日 (32 ビット time_t の範囲の限界) 以降にアプリケーションに障害が発生する可能性があるため推奨できません。また、64 ビットのプラットフォームでは使用しないでください。
渡される時刻の構造体は、_mktime 関数の場合と同様に次のように変更されます。tm_wday フィールドと tm_yday フィールドは、tm_mday と tm_year に基づいて新しい値に設定されます。tm 構造体の時刻を指定するときには、tm_isdst フィールドを次のように設定します。
ゼロ (0) は、標準時間であることを示します。
0 より大きい値は、夏時間であることを示します。
0 より小さい値に設定すると、C ランタイム ライブラリ コードは標準時間または夏時間のどちらが有効であるかを判定します。
C ランタイム ライブラリは、TZ 環境変数を使用して正しい夏時間を特定します。TZ が設定されていない場合は、オペレーティング システムに正しい夏時間を照会します。tm_isdst は必須のフィールドです。設定しないと、値は未定義になり、mktime 関数からの戻り値は予測できません。
_mkgmtime32 関数の範囲は、世界協定時刻 (UTC) 1970 年 1 月 1 日午前 0 時から 2038 年 1 月 19 日 3 時 14 分 7 秒までです。_mkgmtime64 関数の範囲は、1970 年 1 月 1 日午前 0 時から 3000 年 12 月 31 日 23 時 59 分 59 秒までです。範囲外の日付の場合、-1 が返されます。_mkgmtime の範囲は、_USE_32BIT_TIME_T が定義されているかどうかによって変わります。定義されていない場合 (既定) の範囲は _mkgmtime64 と同じです。定義されている場合は、32 ビットの _mkgmtime32 の範囲になります。
gmtime 関数と localtime 関数は、静的に割り当てられた共通のバッファを使用して変換を行います。mkgmtime 関数でこのバッファを使用すると、以前の内容は破棄されます。
使用例
// crt_mkgmtime.c
#include <stdio.h>
#include <time.h>
int main()
{
struct tm t1, t2;
time_t now, mytime, gmtime;
char buff[30];
time( & now );
_localtime64_s( &t1, &now );
_gmtime64_s( &t2, &now );
mytime = mktime(&t1);
gmtime = _mkgmtime(&t2);
printf("Seconds since midnight, January 1, 1970\n");
printf("My time: %I64d\nGM time (UTC): %I64d\n\n", mytime, gmtime);
/* Use asctime_s to display these times. */
_localtime64_s( &t1, &mytime );
asctime_s( buff, sizeof(buff), &t1 );
printf( "Local Time: %s\n", buff );
_gmtime64_s( &t2, &gmtime );
asctime_s( buff, sizeof(buff), &t2 );
printf( "Greenwich Mean Time: %s\n", buff );
}
出力例
Seconds since midnight, January 1, 1970
My time: 1171588492
GM time (UTC): 1171588492
Local Time: Thu Feb 15 17:14:52 2007
Greenwich Mean Time: Fri Feb 16 01:14:52 2007
未完成の構造体に曜日と年通算日の計算値を入力する例を次に示します。
// crt_mkgmtime2.c
#include <stdio.h>
#include <time.h>
#include <memory.h>
int main()
{
struct tm t1, t2;
time_t gmtime;
char buff[30];
memset(&t1, 0, sizeof(struct tm));
memset(&t2, 0, sizeof(struct tm));
t1.tm_mon = 1;
t1.tm_isdst = 0;
t1.tm_year = 103;
t1.tm_mday = 12;
// The day of the week and year will be incorrect in the output here.
asctime_s( buff, sizeof(buff), &t1);
printf("Before calling _mkgmtime, t1 = %s t.tm_yday = %d\n",
buff, t1.tm_yday );
gmtime = _mkgmtime(&t1);
// The correct day of the week and year were determined.
asctime_s( buff, sizeof(buff), &t1);
printf("After calling _mkgmtime, t1 = %s t.tm_yday = %d\n",
buff, t1.tm_yday );
}
出力
Before calling _mkgmtime, t1 = Sun Feb 12 00:00:00 2003
t.tm_yday = 0
After calling _mkgmtime, t1 = Wed Feb 12 00:00:00 2003
t.tm_yday = 42
参照
参照
_gmtime_s、_gmtime32_s、_gmtime64_s