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

Содержание

Слайд 2

Стандартная библиотека C++ включает ряд функций, работающих с датой и временем,

Стандартная библиотека C++ включает ряд функций, работающих с датой и временем,

а также функции, обрабатывающие геополитическую информацию, связанную с программой.
В языке С++ использование типов данных и функций даты и времени требует включения заголовка

В заголовке определены три типа данных, связанных с исчислением времени:
clock_t
time_t
tm
Типы clock_t и time_t предназначены для представления системного времени и даты в виде некоторого целого значения, называемого календарным временем.

Типы данных для даты и времени

Слайд 3

Тип данных clock_t способен представлять временные тики и поддерживает арифметические операции.

Тип данных clock_t способен представлять временные тики и поддерживает арифметические операции. Этот тип

данных используется в качестве возвращаемого значения функцией clock()  и представляет число тиков времени с момента начала выполнения программы.
clock_t clock( void );
Функция возвращает количество временных тактов, прошедших с начала запуска программы. В случае ошибки, функция возвращает значение -1.
Макрос CLOCKS_PER_SEC позволяет получить количество пройденных тактов за 1 секунду. Таким образом, зная сколько выполняется тактов в секунду, зная время запуска программы можно посчитать время работы всей программы или отдельного её фрагмента, что и делает данная функция.
Пример:
clock_t t = clock();
cout << "Программа работает " << t << " тиков времени или " << ((float)t) / CLOCKS_PER_SEC << " секунд.";

Тип данных clock_t и функция clock()

Слайд 4

Тип данных time_t способен представлять время и поддерживает арифметические операции. Этот

Тип данных time_t способен представлять время и поддерживает арифметические операции.
Этот тип данных используется

в качестве возвращаемого значения функции time() .
Этот тип данных используется для представления целого числа — количества секунд, прошедших после полуночи 00:00 , 1 января 1970 года в формате GMT. Это обусловлено историческими причинами, связанными со становлением платформы  UNIX. Однако этот тип данных широко используется в библиотеках С++ на всех платформах.
time_t time (time_t *tp);
Функция возвращает текущее время календаря системы в количестве секунд, прошедших с 1 января 1970 года или −1, если это время не известно.
Если указатель tp не равен NULL, то возвращаемое значение записывается также и в *tp
Пример
time_t seconds; seconds = time(NULL);
cout << "Количество часов, прошедших с 1 января 1970 года";
cout<< seconds / 3600 <

Тип данных time_t и функция time()

Слайд 5

char * ctime(time_t *ptr ); Функция преобразует значение типа time_t в

char * ctime(time_t *ptr );
Функция преобразует значение типа time_t  в Си-строку, которая содержит дату

и время в человеко-понятном формате.
Возвращаемая строка имеет следующий формат:
Ннн Ммм дд чч: мм: сс гггг,
где: Ннн — это день недели, Ммм — месяц, дд — день,
чч: мм: сс — время, гггг — год.
В конце строки стоят символы новой строки \n и завершающий нулевой символ \0.
Параметры: указатель на time_t, который содержит календарное время.
Возвращаемое значение: Cи-строка, содержащая дату и время в человеко-понятном формате. Массив, который содержит эту строку — статический и является общим для обоих функций: ctime и asctime. Каждый раз, когда любая из этих функций вызывается, содержание этого массива будет перезаписываться.
cout << "Текущее локальное время и дата: ";
cout << ctime (&seconds);

Функция ctime()

Слайд 6

Тип структуры tm содержит дату и время в виде разбиения на

Тип структуры tm содержит дату и время в виде разбиения на

элементы. Структура tm содержит следующие элементы:
struct tm
{
int tm_sec; //секунды, 0-61
int tm_min; //минуты, 0-59
int tm_hour; //часы, 0-23
int tm_mday; //день месяца, 1-31
int tm_mon; //месяц, начиная с января, 0-11
int tm_year; //год после 1900
int tm_wday; //день, начиная с воскресенья, 0-6
int tm_yday; //день, начиная с 1-го января, 0-365
int tm_isdst //индикатор летнего времени
}
Значение tm_isdst положительно, если действует режим летнего времени(Daylight Saving Time), равно нулю, если не действует, и отрицательно, если информация об этом недоступна.

Структура tm{}

Слайд 7

tm * localtime(time_t * ptr ); Функция преобразовывает текущее значение времени,

tm * localtime(time_t * ptr );
Функция преобразовывает текущее значение времени, передаваемое как

аргумент, через указатель ptr в структуру tm. Время, указанное в ptr, используется для заполнения структуры tm значениями текущей даты и времени.
tm *timeinfo={0};
timeinfo = localtime (&seconds);
cout << "Year: " << 1900 + timeinfo->tm_year;
cout << "Month: "<< 1 + timeinfo->tm_mon;
cout << "Day: "<< timeinfo->tm_mday;
cout << "Time: "<< 1 + timeinfo->tm_hour << ":";
cout << 1 + timeinfo->tm_min << ":";
cout << 1 + timeinfo->tm_sec << endl;

Функция localtime()

Слайд 8

char * asctime(tm * tmptr ); Функция преобразует содержимое структуры tm

char * asctime(tm * tmptr );
Функция преобразует содержимое  структуры tm в Си-строку, которая содержит

дату и время в понятной для человека форме. Аналогична функции ctime(), но в ctime() аргументом является указатель на тип данных time_t
cout << "Текущая дата/время : "<< asctime (timeinfo);

Функция  asctime ()

Слайд 9

size_t strftime ( char * stringptr, size_t maxnum, char * strformat,

size_t strftime ( char * stringptr, size_t maxnum, 
char * strformat, tm * timeptr );
Из структуры timeptr извлекаются

необходимые значения даты и времени и форматируются с помощью строки strformat. Отформатированное содержимое копируется в строку stringptr, размер копируемой строки ограничивается по количеству символов в параметре maxnum.
Параметры:
stringptr Указатель на массив назначения, где в результате будет храниться скопированная Си-строка.
maxnum Максимальное количество символов для копирования в stringptr.
strformat Cи-строка, содержащая любую комбинацию из обычных символов и специальных спецификаторов формата. Все спецификаторы начинаются с процента %. Список спецификаторов формата показан на следующем слайде.
timeptr Указатель на структуру tm, которая содержит календарное время.

Функция strftime()

Слайд 10

Слайд 11

Слайд 12

Если размер копируемой Cи-строки меньше или равен значению в maxnum, включая

Если размер копируемой Cи-строки меньше или равен значению в maxnum, включая завершающий

нулевой символ, то функция вернет общее количество копируемых символов (не учитывая завершающий нуль-символ). В противном случае возвращается ноль и содержимое строки не определено.
char buffer [80];
strftime (buffer,80,"Сейчас %I:%M%p.",timeinfo);
cout << buffer << endl;

Функция strftime(). Продолжение

Слайд 13

time_t mktime( tm * ptrtime ); Интерпретирует содержимое структуры tm, передаваемой

time_t mktime( tm * ptrtime );
Интерпретирует содержимое структуры tm, передаваемой в функцию

в качестве аргумента через указатель на ptrtime в формат местного времени. Данная функция по некоторым исходным значениям времени восстанавливает значения остальных элементов ptrtime.
Исходные значения элементов  tm_wday и tm_yday из ptrtime игнорируются.
Объект, на который указывает ptrtime изменяется, а именно — инициализируются элементы tm_wday и tm_yday, и изменяются значения других элементов в пределах нормы, в соответствии с  указанным временем.

Функция mktime().

Слайд 14

int year, month ,day; char * weekday[] = { "Воскресенье", "Понедельник",

int year, month ,day;
char * weekday[] = { "Воскресенье", "Понедельник",

"Вторник",
"Среда", "Четверг", "Пятница", "Суббота"};
cout << "Введите год: "; cin >> year;
cout << "Введите месяц: "; cin >> month;
cout << "Введите день: "; cin >> day;
// получить текущую информацию о дате и изменить её относительно введенной
time( &seconds ); // текущая дата в секундах
tm *timeinfo1 = localtime( &seconds ); // преобразование текущей //даты из секунд к нормальному виду
timeinfo->tm_year = year - 1900; // корректируем год
timeinfo->tm_mon = month - 1; // корректируем месяц
timeinfo->tm_mday = day; // введённый день

Пример на функцию mktime().

Слайд 15

Продолжение примера на функцию mktime(). mktime( timeinfo ); // определить день недели cout tm_wday];

Продолжение примера на функцию mktime().

mktime( timeinfo ); // определить

день недели
cout << "День недели: " << weekday[timeinfo->tm_wday];
Слайд 16

double difftime ( time_t timeend, time_t timestart ); Вычисляет разность в

double difftime ( time_t timeend, time_t timestart );
Вычисляет разность в секундах между timestart и timeend.
time_t start,

end;
char name[80];
time (&start);
cout << "Пожалуйста, введите свое имя:";
gets(name);
time (&end);
cout << "Вам понадобилось "<< difftime(end, start)
<< " секун для ввода своего имени";

Функция difftime()

Слайд 17

struct My { tm ptr; int a; double b; char c[30];

struct My
{
tm ptr;
int a;
double b;
char c[30];
};
//Инициализация структуры tm
My my_test={{0},1,1.1,"Test"};
my_test.ptr.tm_year=2017-1900;
my_test.ptr.tm_mon=10-1;
my_test.ptr.tm_mday=15;
my_test.ptr.tm_hour=10;
my_test.ptr.tm_min=40;

Типы даты и

времени при использовании собственных структур
Слайд 18

char buffer_Date[80]; char buffer_Time[80]; strftime (buffer_Date,80,"%x",&my_test.ptr); strftime (buffer_Time,80,"%H:%M",&my_test.ptr); cout cout Продолжение

char buffer_Date[80];
char buffer_Time[80];
strftime (buffer_Date,80,"%x",&my_test.ptr);
strftime (buffer_Time,80,"%H:%M",&my_test.ptr);
cout<<"Дата: "<cout<<"Время: "<

Продолжение