C++ Дата і час
Дата і час (Date та Time)
Бібліотека <ctime>
дозволяє нам працювати з датами та часом.
Щоб використовувати його, потрібно імпортувати файл заголовка <ctime>
:
Приклад
#include <ctime> // Імпорт ctime бібліотеки
Відображення поточної дати та часу
Бібліотека <ctime>
має різноманітні функції для вимірювання дат і часу.
Функція time()
дає нам мітку часу (timestamp), що представляє поточну дату й час. Ми можемо використати функцію ctime()
, щоб показати дату й час, які представляє мітка часу (timestamp):
Приклад
Відображення поточної дати:
// Отримайте позначку часу для поточної дати та часу
time_t timestamp;
time(×tamp);
// Відображати дату й час, представлені міткою часу
cout << ctime(×tamp);
Спробуйте самі »
Два способи використання функції time()
Функція time()
записує мітку часу в місце пам’яті, задане параметром, але також повертає значення мітки часу.
Альтернативним способом використання функції time()
є передача вказівника NULL і використання замість нього значення, що повертається.
time_t timestamp = time(NULL);
Типи даних
Для зберігання дати та часу використовуються два типи даних: time_t
для міток часу і struct tm
для структур дати й часу.
Мітки часу представляють момент часу одним числом, що полегшує обчислення комп’ютера.
Структури дати й часу — це структури, які представляють різні компоненти дати й часу як члени. Це полегшує нам визначення дат. Структури Datetime мають такі члени:
tm_sec
– секунди протягом хвилиниtm_min
– хвилини протягом годиниtm_hour
– година протягом доби (від 0 до 23)tm_mday
– день місяцяtm_mon
– місяць (від 0 до 11, починаючи з січня)tm_year
– кількість років з 1900 рокуtm_wday
– день тижня (з 0 до 6, починаючи з неділі)tm_yday
– день року (від 0 до 365, де 0 означає 1 січня)tm_isdst
– позитивний, коли діє літній час, нульовий, коли не діє, і негативний, коли невідомий
Завжди пам’ятайте про спосіб представлення компонентів дати:
- Години представлено у 24-годинному форматі. 23:00 буде представлено як 23.
- Місяці йдуть від 0 до 11. Наприклад, грудень буде представлено як 11, а не як 12.
- Роки представлено відносно 1900 року. 2024 рік буде представлено як 124, оскільки з 1900 року минуло 124 роки.
Створення міток (позначок) часу
Функція time()
може створити мітку часу лише для поточної дати, але ми можемо створити мітку часу для будь-якої дати за допомогою функції mktime()
.
Функція mktime()
перетворює структуру datetime на позначку часу.
Приклад
Створіть позначку часу за допомогою функції mktime()
:
struct tm datetime;
time_t timestamp;
datetime.tm_year = 2023 - 1900; // Кількість років з 1900 року
datetime.tm_mon = 12 - 1; // Кількість місяців з січня
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Потрібно вказати літній час
// -1 використовує налаштування часового поясу комп’ютера
datetime.tm_isdst = -1;
timestamp = mktime(&datetime);
cout << ctime(×tamp);
Спробуйте самі »
Примітка: Для функції mktime()
ці члени повинні мати значення: tm_year
, tm_mon
, tm_mday
, tm_hour
, tm_min
, tm_sec
та tm_isdst
.
Створення структур Datetime
Функція mktime()
також заповнює tm_wday
і tm_yday
члени структури datetime із правильними значеннями, що завершує структуру та дає дійсну дату й час. Його можна використовувати, наприклад, щоб знайти день тижня певної дати:
Приклад
Знайдіть день тижня вказаної дати:
// Create the datetime structure and use mktime to fill in the missing members
struct tm datetime;
datetime.tm_year = 2023 - 1900; // Кількість років з 1900 року
datetime.tm_mon = 12 - 1; // Кількість місяців з січня
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
cout << "Дата вказана на " << weekdays[datetime.tm_wday];
Спробуйте самі »
Функції localtime()
і gmtime()
можуть перетворювати мітки часу на структури дати й часу.
Функція localtime()
повертає покажчик на структуру, яка представляє час у часовому поясі комп’ютера.
Функція gmtime()
повертає покажчик на структуру, яка представляє час у часовому поясі GMT.
Ці функції повертають покажчик на структуру дати й часу. Якщо ми хочемо переконатися, що його значення не зміниться неочікувано, ми повинні зробити його копію, розіменувавши покажчик. Щоб дізнатися про розіменування, перегляньте розділ C++ Розіменування.
Приклад
Отримайте структуру дати й часу та виведіть поточну годину:
time_t timestamp = time(×tamp);
struct tm datetime = *localtime(×tamp);
cout << datetime.tm_hour;
Спробуйте самі »
Відобразити дати
Поки що ми використовували функцію ctime()
для відображення дати, що міститься в мітці часу. Щоб відобразити дати зі структури datetime, ми можемо використати функцію asctime()
.
Приклад
Відобразити дату, представлену структурою datetime:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << asctime(&datetime);
Спробуйте самі »
Примітка: Функція asctime()
не виправляє недійсні дати. Наприклад, якщо ви встановите день місяця на 32, він відображатиме 32. Функція mktime()
може виправити такі помилки:
Приклад
Виправте дату перед її відображенням:
// Створіть структуру datetime і використовуйте mktime для виправлення помилок
struct tm datetime;
datetime.tm_year = 2022 - 1900; // Кількість років з 1900 року
datetime.tm_mon = 0; // 0 є січень
datetime.tm_mday = 32;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
cout << asctime(&datetime);
Спробуйте самі »
Функції ctime()
і asctime()
дозволяють відображати дату, але не дозволяють вибрати спосіб її відображення.
Щоб вибрати спосіб відображення дати, можна скористатися функцією strftime()
.
Приклад
Представляйте поточну дату різними способами:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
char output[50];
strftime(output, 50, "%B %e, %Y", &datetime);
cout << output << "\n";
strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "\n";
strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "\n";
strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "\n";
Спробуйте самі »
Функція strftime()
форматує дату та записує її як рядок у стилі C у масив char
. Він має чотири параметри:
- Перший параметр вказує на масив символів, де буде записана відформатована дата.
- Другий параметр визначає доступний простір у масиві.
- Третій параметр дозволяє нам вибрати спосіб форматування дати за допомогою специфікаторів формату.
- Останній параметр — це покажчик на структуру datetime, яка містить дату, яку ми хочемо відобразити.
У наступній таблиці є деякі корисні специфікатори формату. Щоб отримати повний список, подивіться на сторінку Довідник strftime().
Специфікатор формату | Опис | Приклад |
---|---|---|
%a |
Коротке зображення дня тижня | Fri |
%b |
Коротке представлення назви місяця | Dec |
%B |
Повне представлення назви місяця | December |
%d |
День місяця з нулем на початку | 09 |
%e |
День місяця з пробілами на початку | 9 |
%H |
24-годинний формат годин | 14 |
%I |
12-годинний формат годин | 02 |
%M |
Хвилин протягом години | 30 |
%p |
AM або PM | PM |
%S |
Секунди протягом хвилини | 01 |
%y |
2-значне представлення року | 23 |
%Y |
4-значне представлення року | 2023 |
Вимірювання часу
Існує дві різні функції, які можна використовувати для вимірювання різниць у часі.
Функція difftime()
вимірює кількість секунд, що пройшли між двома різними мітками часу. Це корисно під час вимірювання різниці в часі між датами.
Приклад
Виміряйте різницю в часі між двома часовими мітками
time_t now;
time_t nextyear;
struct tm datetime;
now = time(NULL);
datetime = *localtime(&now);
datetime.tm_year = datetime.tm_year + 1;
datetime.tm_mon = 0;
datetime.tm_mday = 1;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.is_dst = -1;
nextyear = mktime(&datetime);
int diff = difftime(nextyear, now);
cout << diff << " секунд до наступного року";
Спробуйте самі »
Функція clock()
корисна для вимірювання коротких інтервалів часу під час роботи програми. Це точніше, ніж функція difftime()
.
Кожен виклик функції годинника повертає особливий вид позначки часу, виміряної в годинниках (одиниця часу, що залежить від того, як реалізовано бібліотеку), яка має тип даних clock_t
. Щоб виміряти різницю в часі, збережіть мітку часу в два різні моменти часу, а потім відніміть їх. Різниця в часі вимірюється годинниками, але ви можете перетворити її в секунди, поділивши її на константу CLOCKS_PER_SEC
.
Приклад
Виміряйте, скільки часу потрібно для виконання програми:
clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
k += i;
}
clock_t duration = clock() - before;
cout << "Duration: " << (float)duration / CLOCKS_PER_SEC << " seconds";
Спробуйте самі »
Примітка. Переконайтеся, що перед поділом значення приведено до типу float
або double
, інакше це може призвести до цілочисельного ділення, яке призведе до відсікання десяткової частини.
Повний довідник <ctime>
Повну довідку про функції <ctime> дивіться в розділі C++ Довідник ctime.