Функции 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
