Заголовочный файл time.h определяет функции для работы с датой и временем. В частности, функция time возвращает текущие дату и время в виде объекта типа time_t и имеет следующий прототип:
time_t time(time_t *arg);
В качестве параметра передается указатель на объект типа time_t
, в который помещается текущие дата/время. То есть мы можем получить дату/время двумя способами:
Как результат функции time()
:
time_t mytime = time(NULL);
В этом случае в функцию в качестве аргумента передается значение NULL.
Через параметр-указатель:
time_t mytime; time(&mytime);
В обоих случаях в mytime
будет текущие дата/время.
Чтобы собственно получить дату/время и ее компоненты (часы, минуты и т.д.), нам надо получть из объекта time_t
структуру tm с помощью функции localtime():
time_t mytime = time(NULL); struct tm *now = localtime(&mytime);
В функцию localtime()
передается указатель на объект time_t
.
Структура tm хранит данные в ряде своих элементов, каждый из которых представляет тип int:
tm_sec: секунды от 0 до 60
tm_min: минуты от 0 до 59
tm_hour: часы от 0 до 23
tm_mday: день месяца от 1 до 31
tm_mon: месяц от 0 до 11
tm_year: год, начиная с 1900
tm_wday: день недели от 0 до 6 (воскресенье имеет номер 0)
tm_yday: количество дней года, прошедших с 1 января, от 0 до 365
tm_isdst: если больше 0, то установлен переход на летнее время. Если равно 0, то переход на летнее время не действует.
Выведем текущие дату и время на консоль:
#include <stdio.h> #include <time.h> int main(void) { time_t mytime = time(NULL); struct tm *now = localtime(&mytime); printf("Date: %d.%d.%d\n", now->tm_mday, now->tm_mon + 1, now->tm_year + 1900); printf("Time: %d:%d:%d\n", now->tm_hour, now->tm_min, now->tm_sec); return 0; }
Поскольку нумерация месяцев начинается с нуля, то к месяцу добавляем 1. Аналогично поскольку нулевым годом считается 1900 год, то к значению года добавляем 1900. В итоге консольный вывод будет типа следующего:
Date: 13.1.2023 Time: 13:13:24
Функция strftime() преобразует дату и время в строку в определенном формате:
#include <stdio.h> #include <time.h> int main(void) { time_t mytime = time(NULL); struct tm *now = localtime(&mytime); char str[20]; strftime(str, sizeof(str), "%T", now); printf("Time: %s\n", str); return 0; }
Функция strftime принимает четыре значения.
Первый аргумент представляет строку, в которую помещается данные. В данном случае это массив char str[20]
Второй аргумент представляет размер строки, которую помещаются данные. В данном случае это вся строка.
Третий аргумент представляет спецификатор форматирования. Здесь применяется спецификатор "%T", который представляет вывод времени в формате "часы:минуты:секунды".
И четвертый аргумент собственно представляет дату и время в виде структуры tm
То есть в данном случае мы получаем только время и помещаем отформатированную строку в массив str
.
Некоторые используемые спецификаторы форматирования дат и времени
%H
возвращает часы
%M
возвращает минуты
%S
возвращает секунды
%d
возвращает номер дня
%m
возвращает номер месяца
%h
возвращает сокращенное название месяца
%y
возвращает год в виде последних двух цифр
%Y
возвращает год в виде четырех цифр
%D
выводит дату, аналогичен набору спецификаторов %m/%d/%y
%T
выводит время, аналогичен набору спецификаторов %H:%M:%S
Например, получение даты выглядело бы следующим образом:
strftime(str, sizeof(str), "%D", now);