Календарь и часовые пояса
Используйте календарные типы C++20
«Календарь и часовые пояса» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Типы календаря C++20
В C++20 в <chrono> появилась полноценная поддержка календаря. Теперь можно представлять годы, месяцы и дни непосредственно в виде типов, а не выполнять операции с целыми числами.
year,month,dayyear_month_dayдля представления полной даты
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year y{2026};
std::cout << "Year value: " << static_cast<int>(y) << '\n';
return 0;
}Литералы календаря
Литералы календаря, такие как 2026y и 15d, а также именованные месяцы, например std::chrono::May, делают запись дат естественной.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto y = 2026y;
auto d = 15d;
std::cout << static_cast<int>(y) << " / " << static_cast<unsigned>(d) << '\n';
return 0;
}Создание даты
Объедините три компонента с помощью оператора /, чтобы получить year_month_day. Порядок соответствует году, месяцу и дню.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day ymd = 2026y/May/30;
std::cout << static_cast<int>(ymd.year()) << "-"
<< static_cast<unsigned>(ymd.month()) << "-"
<< static_cast<unsigned>(ymd.day()) << '\n';
return 0;
}Проверка дат
Тип year_month_day умеет определять, является ли дата настоящей календарной датой. Используйте ok(), чтобы отклонять невозможные значения, например 30 февраля.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day good = 2026y/February/28;
year_month_day bad = 2026y/February/30;
std::cout << std::boolalpha << good.ok() << " " << bad.ok() << '\n';
return 0;
}sys_days
Преобразуйте дату в sys_days — количество дней, прошедших с начала эпохи. Это позволяет выполнять арифметические операции с днями и вычислять разницу между датами.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
sys_days a = sys_days{2026y/May/30};
sys_days b = sys_days{2026y/May/20};
std::cout << "Days apart: " << (a - b).count() << '\n';
return 0;
}Арифметика с днями
Добавление days{n} к значению sys_days перемещает дату на n дней вперёд, после чего её можно снова преобразовать в календарную дату.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
sys_days start = sys_days{2026y/May/30};
sys_days later = start + days{10};
year_month_day ymd = later;
std::cout << static_cast<unsigned>(ymd.day()) << "/"
<< static_cast<unsigned>(ymd.month()) << '\n';
return 0;
}День недели
Преобразуйте sys_days в weekday, чтобы определить, на какой день недели приходится дата.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
weekday wd{sys_days{2026y/May/30}};
std::cout << "Weekday index (Sun=0): " << wd.c_encoding() << '\n';
return 0;
}Последний день месяца
Специальный тег last вычисляет последний день любого месяца и автоматически учитывает високосные годы.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day_last eom = 2024y/February/last;
year_month_day ymd = eom;
std::cout << "Feb 2024 ends on day " << static_cast<unsigned>(ymd.day()) << '\n';
return 0;
}Проверка високосного года
Тип year предоставляет is_leap(), поэтому Вам не нужно самостоятельно помнить правила делимости.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
std::cout << std::boolalpha;
std::cout << "2024 leap: " << year{2024}.is_leap() << '\n';
std::cout << "2026 leap: " << year{2026}.is_leap() << '\n';
return 0;
}От момента времени к дате
Округлите момент времени system_clock вниз до days и преобразуйте его в year_month_day, чтобы получить сегодняшнюю календарную дату.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto today = floor<days>(system_clock::now());
year_month_day ymd = sys_days{today};
std::cout << "Year is in range: " << (static_cast<int>(ymd.year()) > 2000) << '\n';
return 0;
}Часовые пояса
В C++20 также появились часовые пояса, доступные через std::chrono::zoned_time и базу данных IANA. Доступность зависит от стандартной библиотеки, но эта модель связывает момент времени с именованным часовым поясом для корректного отображения местного времени.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto now = system_clock::now();
auto days_part = floor<days>(now);
std::cout << "Have a UTC time point: " << (days_part.time_since_epoch().count() > 0) << '\n';
return 0;
}Быстрая проверка
Проверьте своё понимание типов календаря C++20.
Итоги
Вы узнали о поддержке календаря в C++20:
year,month,dayиyear_month_dayс построением с помощью оператора/- проверка с помощью
ok()и определение високосного года с помощьюis_leap() sys_daysдля арифметики с днями и определения дня неделиlastдля получения последнего дня месяца, а также знакомство сzoned_time
На этом завершается курс «Время и библиотека Chrono».
Часто задаваемые вопросы
Урок «Календарь и часовые пояса» бесплатный?
Да — полный текст урока «Календарь и часовые пояса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Календарь и часовые пояса»?
Используйте календарные типы C++20 Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Календарь и часовые пояса»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Длительности и часы
- Моменты времени
- Измерение производительности кода
- Календарь и часовые пояса