_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_wdaytm_yday 字段设置为基于 tm_mdaytm_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 位范围。

请注意 gmtimelocaltime 为将使用一个静态分配的缓冲区。 如果您提供此缓冲区将 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

请参见

参考

时间线

asctime, _wasctime

asctime_s, _wasctime_s

gmtime, _gmtime32, _gmtime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime_s, _localtime32_s, _localtime64_s

mktime, _mktime32, _mktime64

time, _time32, _time64