0Pricing
C++ Academy · Урок

Календарь и часовые пояса

Используйте календарные типы C++20

«Календарь и часовые пояса» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Типы календаря C++20

В C++20 в <chrono> появилась полноценная поддержка календаря. Теперь можно представлять годы, месяцы и дни непосредственно в виде типов, а не выполнять операции с целыми числами.

  • year, month, day
  • year_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 — локальная установка не требуется.

Все уроки этого курса

  1. Длительности и часы
  2. Моменты времени
  3. Измерение производительности кода
  4. Календарь и часовые пояса
← Назад к C++ Academy