Модуль time.h
Работа со временем и датой
Модуль time.h предоставляет стандартные функции языка C (компилятор GCC) для работы с временем и датой. Эти функции позволяют получать текущее время, вычислять разницу между временными метками, преобразовывать время в различные форматы и форматировать строки с датой и временем.
Для работы с модулем time.h реализованы следующие функции:
// Типы
typedef uint32_t clock_t; // Процессорное время (32 бита для Cortex-M4)
typedef uint32_t time_t; // Календарное время (32 бита, достаточен для большинства bare-metal систем)
struct tm {
int tm_sec; // секунды: 0-59
int tm_min; // минуты: 0-59
int tm_hour; // часы: 0-23
int tm_mday; // день месяца:
int tm_mon; // месяц: 0-11
int tm_year; // год минус 1900
int tm_wday; // день недели: 0-6 (воскресенье = 0)
int tm_yday; // день в году: 0-365
int tm_isdst; // флаг летнего времени: 0 (нет), >0 (да), <0 (неизвестно)
};
// Макросы
#define CLOCKS_PER_SEC 168000000
#define CLOCKS_PER_MS 168000
#define CLOCKS_PER_MKS 168
// Получение процессорного времени
#define clock() (*(volatile clock_t *)0xE0001004)
// Получение текущего времени
time_t time(time_t *timer);
// Вычисление разницы во времени
double difftime(time_t time1, time_t time0);
// Преобразование структуры времени в time_t
time_t mktime(struct tm *tm);
// Преобразование времени в UTC
struct tm *gmtime(const time_t *timer);
// Преобразование времени в локальное
struct tm *localtime(const time_t *timer);
// Форматирование времени в строку
char *asctime(const struct tm *tm);
char *ctime(const time_t *timer);
size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *tm);
Типы данных
clock_t— тип для представления процессорного времени (типuint32_t).time_t— тип для представления календарного времени (типuint32_t, количество секунд с 1 января 1970 года, 00:00:00 UTC).struct tm— структура для представления времени в виде компонентов:
Спецификаторы формата для strftime
Функция strftime использует строку формата, которая может содержать следующие спецификаторы:
%Y— год с веком (например, 2025).%m— месяц (01–12).%d— день месяца (01–31).%H— часы в 24-часовом формате (00–23).%M— минуты (00–59).%S— секунды (00–59).%a— сокращённое название дня недели (например, “Sat”).%b— сокращённое название месяца (например, “Oct”).%c— стандартное представление даты и времени.%%— символ процента.
clock
Макрос clock возвращает процессорное время, использованное программой.
Возвращаемые значения:
- Количество тактов процессора. Для получения секунд разделите результат на
CLOCKS_PER_SEC.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
uint32_t start = clock();
for (int i = 0; i < 100; i++) {
printf("+");
}
uint32_t end = clock();
if (end < start) {
printf("error");
}
uint32_t mks = (end - start) / CLOCKS_PER_MKS;
printf("\nВремя выполнения: %u мкс\n", mks);
return 0;
}
time
Функция time_t time(time_t *timer) возвращает текущее календарное время в формате Unix (секунды с 1 января 1970 года, 00:00:00 UTC).
Параметры:
timer— указатель для записи времени илиNULL, если результат нужен только как возвращаемое значение.
Возвращаемые значения:
- Текущее время.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
printf("Текущее время (Unix): %u\n", time(NULL));
return 0;
}
difftime
Функция double difftime(time_t time1, time_t time0) вычисляет разницу между двумя временными метками в секундах.
Параметры:
time1— конечное время.time0— начальное время.
Возвращаемые значения:
- Разница в секундах (тип
double).
Пример использования:
#include <stdio.h>
#include <time.h>
#include <dev.h>
int main(void) {
time_t start, end;
time(&start);
sleepMs(1000);
time(&end);
double diff = difftime(end, start);
printf("Разница времени: %.1f секунд\n", diff);
return 0;
}
mktime
Функция time_t mktime(struct tm *tm) преобразует структуру tm в значение типа time_t, учитывая локальный часовой пояс.
Параметры:
tm— указатель на структуруtmс компонентами времени.
Возвращаемые значения:
- Значение времени в формате Unix или
(time_t)-1при ошибке.
Примечание: Функция может модифицировать поля структуры tm для нормализации значений.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
struct tm tm = {0};
tm.tm_year = 2025 - 1900; // 2025 год
tm.tm_mon = 9; // Октябрь (0–11)
tm.tm_mday = 11; // 11 число
tm.tm_hour = 12;
tm.tm_min = 48;
tm.tm_sec = 0;
time_t t = mktime(&tm);
printf("Время в формате Unix: %ld\n", t);
return 0;
}
gmtime
Функция struct tm *gmtime(const time_t *timer) преобразует значение time_t в структуру tm в формате UTC.
Параметры:
timer— указатель на значение времени.
Возвращаемые значения:
- Указатель на структуру
tmилиNULLпри ошибке.
Примечание: Возвращаемый указатель указывает на статическую память, которая может быть перезаписана последующими вызовами.
Пример использования:
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
struct tm *time_info;
// Получить текущее время в секундах с начала эпохи
current_time = time(NULL);
// Преобразовать его в структуру struct tm (UTC)
time_info = gmtime(¤t_time);
if (time_info != NULL) {
// Вывести компоненты времени
printf("Время UTC: %02d:%02d:%02d, Дата: %02d.%02d.%d\n",
time_info->tm_hour,
time_info->tm_min,
time_info->tm_sec,
time_info->tm_mday,
time_info->tm_mon + 1, // tm_mon начинается с 0 (январь)
time_info->tm_year + 1900); // tm_year - годы с 1900
}
return 0;
}
localtime
Функция struct tm *localtime(const time_t *timer) преобразует значение time_t в структуру tm с учётом локального часового пояса.
Параметры:
timer— указатель на значение времени.
Возвращаемые значения:
- Указатель на структуру
tmилиNULLпри ошибке.
Примечание: Аналогично gmtime, возвращает указатель на статическую память.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
time_t now;
time(&now);
struct tm *local = localtime(&now);
if (local) {
printf("Локальное время: %d-%02d-%02d %02d:%02d:%02d\n",
local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec);
}
return 0;
}
asctime
Функция char *asctime(const struct tm *tm) преобразует структуру tm в строку вида "Sun Sep 16 01:03:52 1970\n".
Параметры:
tm— указатель на структуруtm.
Возвращаемые значения:
- Указатель на строку или
NULLпри ошибке.
Примечание: Возвращает указатель на статическую память, которая может быть перезаписана.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
time_t now;
time(&now);
struct tm *local = localtime(&now);
if (local) {
char *str = asctime(local);
if (str) {
printf("Время: %s", str); // Ожидается: формат "Sun Sep 16 01:03:52 2025\n"
}
}
return 0;
}
ctime
Функция char *ctime(const time_t *timer) преобразует значение time_t в строку, эквивалентную asctime(localtime(timer)).
Параметры:
timer— указатель на значение времени.
Возвращаемые значения:
- Указатель на строку или
NULLпри ошибке.
Примечание: Возвращает указатель на статическую память.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
time_t now;
time(&now);
char *str = ctime(&now);
if (str) {
printf("Время: %s", str); // Ожидается: формат "Sun Sep 16 01:03:52 2025\n"
}
return 0;
}
strftime
Функция size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *tm) форматирует время из структуры tm в строку согласно заданному формату.
Параметры:
s— указатель на буфер для результата.maxsize— максимальный размер буфера (включая нуль-символ).format— строка формата с спецификаторами.tm— указатель на структуруtm.
Возвращаемые значения:
- Количество записанных символов (без нуль-символа) или 0, если буфер слишком мал или произошла ошибка.
Пример использования:
#include <stdio.h>
#include <time.h>
int main(void) {
char buf[100];
time_t now;
time(&now);
struct tm *local = localtime(&now);
if (local) {
size_t len = strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", local);
if (len > 0) {
printf("Форматированное время: %s\n", buf); // Ожидается: 2025-10-11 12:48:00
}
}
return 0;
}