Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семинар 4.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
103.94 Кб
Скачать

Функции localtime и gmtime

Функции преобразования календарного времени в структурное.

localtime() возвращает текущее время (или переданное в параметре) с учётом временной зоны (т. е. смещения часового пояса);


gmtime() отдаёт текущее время (или переданное в параметре), без учёта смещения временной зоны — мировое время (UTC+0/GMT+0).

Функция localtime() преобразует время в секундах, истекшее с 0 часов 1 января 1970 года (показание системных часов CLOCK_REALTIME) в местное (с учетом часового пояса) время и дату.

Функция gmtime () преобразует системное время в секундах в дату и всемирное координированное время.

Результат работы обеих функций помещается в структуру типа tm и функция возвращает указатель на эту структуру.

#include <stdio.h>

#include <time.h>

int main()

{

time_t t1=time(NULL);

struct tm *tm1;

tm1 = gmtime (&t1);

printf("%s\n",asctime(tm1));

return 0;

}

// tm1 = localtime (&t1); // аналогичный результат, но с учетом часового пояса.

Имеются модификации функций localtime_r и gmtime_r позволяющие заносить результат работы в структуру.

Функция asctime / asctime_r

Функция asctime эквивалентна ctime, единственное их отличие – передаваемый параметр (в первом случае функции передается структура tm, во втором – переменная типа time_t).

Функция asctime() преобразует локальное время, представленное в виде структуры типа struct tm, в текстовую строку.

char * asctime(const struct tm *t1);

char * asctime_r(const struct tm *t1, char *pr1);

Функция mktime

Функция преобразования структурного времени в календарное.

Эта функция обратная функции localtime. Функция mktime на основе данных, содержащихся в структуре tm, рассчитывает время в секундах, истекшее с 0 часов 1 января 1970 года.

time_t mktime(struct tm * t);

Функция возвращает переменную типа time_t.

#include <stdio.h>

#include <time.h>

int main ()

{

struct tm t; // Структура с местным временем

// Заполняем структуру. Для заполнения используем дату: Sat May 18 14:12:09 2014

t.tm_sec = 9;

t.tm_min = 12;

t.tm_hour = 14;

t.tm_mday = 18;

t.tm_mon = 4;

t.tm_year = 114;

t.tm_wday = 6;

t.tm_yday = 137;

t.tm_isdst = 0;

printf ("Time %ld sec\n", mktime(&t));

return 0;

}

Кроме того, функция mktime по некоторым исходным значениям времени восстанавливает значения остальных членов t.

Исходные значения членов  структуры tm_wday и tm_yday из t игнорируются. Диапазоны значений для остальных  членов структуры ограничиваются их нормальными значениями. Например, если задать значение даты 33.01.2000 в структуре tm, то функция mktime скорректирует их до значений полей 02.02.2000.

Пример:

#include <time.h>

#include <stdio.h>

int main(int argc, char* argv[])

{

struct tm t;

t.tm_mday = 6;

t.tm_mon = 10;

t.tm_year = 115;

//t.tm_sec = t.tm_min = t.tm_hour = t.tm_isdst = 0;

mktime(&t);

printf("%s",asctime(&t));

return 0;

}

Написанная выше программа выдаст некорректный результат, например Tue Jan 1 12:05:45 2494! Для корректной работы программы необходимо ввести значение времени и установить флаг перехода на летнее время. В противном случае функция mktime преобразует случайным образом определенные часы, минуты и секунды, увеличивая значения даты.

Для правильной работы программы необходимо добавить строку

t.tm_sec = t.tm_min = t.tm_hour = t.tm_isdst = 0;

В этом случае результат работы программы будет

Fri Nov 6 00:00:00 2015