Для работы с системной датой и временем используется библиотека time.h.
Типы, определенные в библиотеке time.h
Тип | Описание |
size_t | Целочисленный тип, возвращаемый операцией sizeof. |
clock_t | Арифметический тип, подходящий для представления времени. |
time_t | Арифметический тип, подходящий для представления времени. |
struct tm | Структурный тип, содержащий компоненты календарного времени. |
Для определения текущего календарного времени используется функция
Данная функция возвращает время в секундах начиная с 1 января 1970 г.
Например,
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
char * settime(struct tm *u)
{
char s[40];
char *tmp;
for (int i = 0; i<40; i++) s[i] = 0;
int length = strftime(s, 40, "%d.%m.%Y %H:%M:%S, %A", u);
tmp = (char*)malloc(sizeof(s));
strcpy(tmp, s);
return(tmp);
}
int main()
{
struct tm *u;
char *f;
system("chcp 1251");
system("cls");
const time_t timer = time(NULL);
u = localtime(&timer);
f = settime(u);
printf("%ld соответствует ", timer);
puts(f);
getchar();
return 0;
}
Структура tm имеет вид
{
int tm_sec; // секунды после минут [0,59]
int tm_min; // минуты после часов [0,59]
int tm_hour; // часы после полуночи [0,23]
int tm_mday; // день месяца [1,31]
int tm_mon; // месяц года (январь = 0) [0,11]
int tm_year; // год (1900 год = 0)
int tm_wday; // день недели (вс = 0) [0,6]
int tm_yday; // день года (1 января = 0) [0,365]
int tm_isdst; // флаг перехода на летнее время (>0- вкл.)
};
Функция
преобразует календарное время, указанное ptm, сохраняет его в структуре tm и возвращает указатель на нее.
Функция
осуществляет обратное преобразование.
Функция
возвращает наилучшее приближение процессорного времени, прошедшего с момента запуска программы; для получения времени в секундах значение необходимо разделить на константу, определенную в библиотеке time.h:
Если время не доступно или не может быть представлено, возвращает (clock_t) (-1).
Функция
char *restrict s, // указатель на выходную строку
size_t max, // максимальный размер выходной строки
const char *restrict fmt, // указатель на строку формата
const struct tm *restrict tmpt); // указатель на структуру tm
копирует строку fmt в строку s, заменяя спецификаторы формата в fmt соответствующими данными, взятыми из содержимого структуры времени, на которое указывает tmpt; в строку s помещается не более max символов.
Функция возвращает количество символов (исключая нулевой) в результирующей строке. Если результирующая строка (включая нулевой символ) содержит больше, чем max символов, функция возвращает 0, а содержимое s не определено.
Спец. | назначение |
%a | Локальное сокращенное название дня недели |
%A | Локальное полное название дня недели |
%b | Локальное сокращенное название месяца |
%B | Локальное полное название месяца |
%c | Локальный разделитель даты и времени |
%d | День месяца в виде десятичного числа (01-31) |
%D | Эквивалент %m%d%y |
%e | День месяца (десятичное число): однозначные числа дополнены пробелом |
%F | Эквивалент %Y-%m-%d |
%g | Последние два разряда года (00-99) |
%G | Год в виде десятичного числа |
%H | Часы (по 24-часовой шкале) в виде десятичного числа (00-23) |
%I | Часы (по 12-часовой шкале) в виде десятичного числа (01-12) |
%j | День года в виде десятичного числа (001-366) |
%m | Месяц в виде десятичного числа (01-12) |
%n | Символ новой строки |
%M | Минуты в виде десятичного числа (00-59) |
%p | Локальный эквивалент a.m./p.m. для 12-часовой временной шкалы |
%r | Локальное 12-часовое время |
%R | Эквивалент %H:%M |
%S | Секунды в виде десятичного числа (00-61) |
%t | Символ горизонтальной табуляции |
%T | Эквивалент %H:%M:%S |
%u | Номер дня недели (1-7), где 1 соответствует понедельнику |
%U | Номер недели в году, считая воскресенье первым днем недели (00-53) |
%w | Номер дня недели в виде десятичного числа, начиная с воскресенья (0-6) |
%W | Номер недели в году, считая понедельник первым днем недели (00-53) |
%y | Год без века в виде десятичного числа (00-99) |
%Y | Год с веком в виде десятичного числа |
%z | Смещение от UTC ("-800" означает на 8 ч по Гринвичу западнее). |
%Z | Наименование часового пояса (если доступно) |
%% | % (то есть знак процента). |
Функция, позволяющая вывести день недели на русском языке
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
char * settime(struct tm *u)
{
char s[40];
char *tmp;
for (int i = 0; i<40; i++) s[i] = 0;
int length = strftime(s, 40, "%d.%m.%Y %H:%M:%S ", u);
switch (u->tm_wday)
{
case 0: strcpy(s + length, " воскресенье"); break;
case 1: strcpy(s + length, " понедельник"); break;
case 2: strcpy(s + length, " вторник"); break;
case 3: strcpy(s + length, " среда"); break;
case 4: strcpy(s + length, " четверг"); break;
case 5: strcpy(s + length, " пятница"); break;
case 6: strcpy(s + length, " суббота"); break;
}
tmp = (char*)malloc(sizeof(s));
strcpy(tmp, s);
return(tmp);
}
int main()
{
struct tm *u;
char *f;
system("chcp 1251");
system("cls");
const time_t timer = time(NULL);
u = localtime(&timer);
f = settime(u);
printf("%ld соответствует ", timer);
puts(f);
getchar();
return 0;
}
Результат выполнения
Добавление нескольких дней к текущему времени
Рассмотрим еще один пример. Допустим, требуется добавить несколько дней к текущей дате.
Реализация на Си
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#define ADD_DAYS 300
int main()
{
struct tm *u;
char s1[40] = { 0 }, s2[40] = { 0 };
const time_t timer = time(NULL);
u = localtime(&timer);
strftime(s1, 80, "%d.%m.%Y %H:%M:%S ", u);
printf("%s\n", s1);
u->tm_mday += ADD_DAYS;
time_t next = mktime(u);
u = localtime(&next);
strftime(s2, 80, "%d.%m.%Y %H:%M:%S ", u);
printf("%s\n", s2);
getchar();
return 0;
}
Результат выполнения
Реализация функции задержки
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <time.h>
void delay(int ms) // аргумент - требуемое время задержки в миллисекундах
{
int c = clock() + ms;
while (clock() < c);
}
int main()
{
printf("clock = %d\n", clock());
delay(1000);
printf("clock = %d\n", clock());
getchar();
return 0;
}
Результат выполнения