428.90K
Category: programmingprogramming

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

1.

Лекция № 2
Работа с датой и
временем в С++

2.

Типы данных для даты и времени
Стандартная библиотека C++ включает ряд функций,
работающих с датой и временем, а также функции,
обрабатывающие геополитическую информацию, связанную с
программой.
В языке С++ использование типов данных и функций даты и
времени требует включения заголовка
<ctime.h>
В заголовке <ctime.h> определены три типа данных, связанных с
исчислением времени:
clock_t
time_t
tm
Типы clock_t и time_t предназначены для представления
системного времени и даты в виде некоторого целого значения,
называемого календарным временем.

3.

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

4.

Тип данных time_t и функция time()
Тип данных 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 <<endl;

5.

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

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), равно нулю, если не действует, и отрицательно,
если информация об этом недоступна.

7.

Функция localtime()
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;

8.

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

9.

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

10.

Спецификатор
Описание
Пример
%A
Сокращённое
название
дня Thu
недели *
Полное название дня недели *
Thursday
%b
Сокращённое название месяца *
Aug
%B
Полное название месяца *
August
%c
Представление даты и времени * Thu Aug 30 14:08:30 2012
%d
День месяца (1 — 31)
30
%H
15
%j
Представление часов в
24-х часовом формате
Представление часов в
12-ти часовом формате
День в году (001-365)
%m
Номер месяца (01-12)
08
%M
Минуты (00-59)
14
%p
Обозначение AM
или PM
Секунды (00-61)
PM
%a
%I
%S
03
215
12

11.

Специфика
тор
%U
%w
%W
%x
%X
%y
%Y
%Z
%%
Описание
Пример
Номер недели, первый день недели — 15
воскресенье (0 — 53)
4
Номер дня недели, начиная с воскресенья
(0 — 6)
Номер недели, первый день недели — 20
понедельник (0 — 53)
Представление даты *
08/30/12
Представление времени *
14:35:08
Год, последние две цифры
12
Год, полная запись
2012
Название или аббревиатура временной зоны GMT
Символ процента
%

12.

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

13.

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

14.

Пример на функцию mktime().
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;
// введённый день

15.

Продолжение примера на функцию
mktime().
mktime( timeinfo );
// определить день недели
cout << "День недели: " << weekday[timeinfo->tm_wday];

16.

Функция difftime()
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)
<< " секун для ввода своего имени";

17.

Типы даты и времени при
использовании собственных структур
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<<"Дата: "<<buffer_Date<<endl;
cout<<"Время: "<<buffer_Time<<endl;

19.

Сравнение структур tm
(Данный код необходимо использовать для сортировки и
поиска в самостоятельной работе № 1)
My my_test2={{0},2,2.2,"Test2"};
my_test2.ptr.tm_year=2016-1900;
my_test2.ptr.tm_mon=11-1;
my_test2.ptr.tm_mday=10;
my_test2.ptr.tm_hour=9;
my_test2.ptr.tm_min=30;
time_t Time1, Time2;
Time1=mktime(&my_test.ptr);
Time2=mktime(&my_test2.ptr);
if (Time1<Time2) cout<<"Первое время более раннее"<<endl;
else cout<<"Второе время более раннее"<<endl;
English     Русский Rules