_mkgmtime, _mkgmtime32, _mkgmtime64
转换 tm表示 UTC 时间struct 为 time_t 类型表示的 UTC 时间。
time_t _mkgmtime(
struct tm* timeptr
);
__time32_t _mkgmtime32(
struct tm* timeptr
);
__time64_t _mkgmtime64(
struct tm* timeptr
);
参数
- timeptr
对于 UTC 时间的指针作为 structtm 转换。
返回值
类型表示秒数 __time32_t 或 __time64_t 的一个时间以午夜, 1970 年一月 1 日 elapsed,在世界 (UTC)时 (utc)。 如果日期超出范围 (请参见 " 备注 " 部分) 或输入不能被解释为一个有效期,返回值为 – 1。
备注
_mkgmtime32 和 _mkgmtime64 功能将 UTC 时间转换为表示 UTC 的 __time32_t 或 __time64_t 类型时。 若要将本地时间转换为 UTC 时间,请使用 mktime、 _mktime32和 _mktime64 。
_mkgmtime 是计算结果为 _mkgmtime64的内联函数,并且, time_t 与 __time64_t等效。 如果需要强制编译器解释 time_t为旧 32 位 time_t,可以定义 _USE_32BIT_TIME_T。 建议不要这样做,因为您的应用程序可能在 2038 年一月 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 功能的范围是从零开始, 1970 年一月 1 日,到 3:14 的一月 19 日, UTC: 07 日 2038 中, UTC。 _mkgmtime64 的范围是从零开始, 1970 年一月 1 日,到 23:59 的 UTC: 59, 3000 年十二月 31 日,, UTC。 一个超出范围的日期将导致返回值为 – 1。 _mkgmtime 的大小取决于 _USE_32BIT_TIME_T 是否定义。 如果未定义 (默认) 该范围是 _mkgmtime64;否则,该范围被限制为 _mkgmtime32的 32 位范围。
请注意 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 );
}
Output
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