_mkgmtime, _mkgmtime32, _mkgmtime64

将由 struct 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 日午夜起经过的秒数。 如果日期超出范围(参见“备注”部分)或输入不能解释为有效时间,则返回值为 -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 年 1 月 18 日之后,应用程序可能会无法正常工作,最大范围为 32 位 time_t。 在 64 位平台上完全无法使用。

传入的时间结构将按照与 _mktime 函数相同的方式进行更改:根据 tm_mdaytm_year 的值将 tm_wdaytm_yday 字段设置为新值。 由于时间假定为 UTC,因此将忽略该 tm_isdst 字段。

_mkgmtime32 函数的范围为从 UTC 时间 1970 年 1 月 1 日午夜到 UTC 时间 2038 年 1 月 18 日 23:59:59。 _mkgmtime64 的范围为从 1970 年 1 月 1 日 (UTC) 午夜到 3000 年 12 月 31 日 23:59:59 (UTC)。 日期超出范围会导致返回值为 -1。 _mkgmtime 的范围取决于是否定义了 _USE_32BIT_TIME_T。 未定义时(为默认值时),范围与 _mkgmtime64 相同。 否则,范围限制为 32 位 _mkgmtime32

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

以下示例演示了 _mkgmtime 对不完整结构的填充方式。 它计算一周和一年中某天的值。

// 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

另请参阅

工时管理
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