Модуль 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(&current_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;
}