Поделиться через


_mkgmtime, _mkgmtime32, _mkgmtime64

Преобразует время в формате UTC, представленное tm struct ко времени в формате UTC, представленное типом time_t.

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, представляющее количество секунд, истекших после полуночи, 1-го января 1970, в формате UTC. Если дата выходит за пределы допустимого диапазона (см. раздел Комментарии) или входные данные не могут восприниматься как допустимое время, возвращаемое значение равно -1.

Заметки

Функции _mkgmtime32 и _mkgmtime64 преобразовывают время в формате UTC в тип __time32_t или __time64_t, представляющий время в формате UTC. Для преобразования местного времени ко времени в формате UTC вместо них используйте mktime, _mktime32 и _mktime64.

_mkgmtime — встроенная функция, которая принимает значение _mkgmtime64, и time_t эквивалентна __time64_t. Если необходимо обеспечить интерпретацию компилятором time_tкак старого 32-битного time_t, можно определить _USE_32BIT_TIME_T. Это не рекомендуется, поскольку приложение может завершиться ошибкой после 19-ого января 2038 (максимальный диапазон 32 разрядного time_t), и это совсем не поддерживается на 64 разрядных платформах.

Переданная структура времени будет изменена следующим образом, точно так же, как они изменяются с функциями _mktime: поля tm_wday и tm_yday принимают новые значения, основанные на значениях tm_mday и tm_year. При указании структуры времени tm следует установить значение поля tm_isdst в:

  • Ноль (0), чтобы показать, что стандартное время в силе.

  • Значение больше 0, чтобы указать, что летнее время в силе.

  • Значение меньше нуля, чтобы иметь код библиотеки времени выполнения языка C вычислял, действует ли стандартное время или летнее время.

Библиотека времени выполнения языка C использует переменную среды TZ для определения правильного летнего времени. Если TZ не задана, то для получения корректного регионального поведения по летнему времени запрашивается операционная система. tm_isdst является обязательным полем. Если оно не задано, его значение не определено, и возвращаемое значение в mktime непредсказуемо.

Диапазон функции _mkgmtime32 от полуночи, 1-го января 1970, время в формате UTC до 3:14:07 19-го января 2038, время в формате UTC. Диапазон _mkgmtime64 от полуночи, 1-го января 1970, время в формате UTC до 23:59:59, 31-го декабря 3000, время в формате UTC. Результаты даты вне допустимого диапазона приводят к тому, что возвращаемое значение равно -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 );

}

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