Работа с датами и временем

Последнее обновление: 13.01.2023

Заголовочный файл 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

Функция 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);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850