Daily bit(e) C++. std::chrono – часовые пояса

Добавлено 15 августа 2026 в 07:05

Daily bit(e) C++ 76, работа с часовыми поясами и временем, привязанным к часовому поясу, с помощью std::chrono из C++20.

Daily bit(e) C++

Часовые пояса – особенно неприятная проблема при работе со временем. Расширение C++20 для std::chrono также добавило поддержку и для них.

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

Хотя std::chrono::sys_time всегда представляет UTC, данная библиотека теперь также поддерживает время без привязки к часовому поясу в виде std::chrono::local_time. Время без привязки к часовому поясу можно объединить с конкретным часовым поясом, чтобы получить std::chrono::zoned_time, который затем можно преобразовать в другие часовые пояса.

#include <chrono>
#include <ranges>

using namespace std::chrono;

// Версия с базой данных часовых поясов
std::string tzdb_version = std::chrono::remote_version();

// Пройтись по всем допустимым часовым поясам
for (auto& zone : get_tzdb().zones) 
{
 // zone.name()
}

// США переходит на летнее время
std::chrono::year_month_day usa_summer{2025y/March/Sunday[2]};
// 2025-03-09

// Европа переходит на летнее время
std::chrono::year_month_day eu_summer{2025y/March/Sunday[last]};
// 2025-03-30

// Найти две часовые зоны в базе данных,
// с которыми мы будем работать
auto prague = std::chrono::locate_zone("Europe/Prague");
auto newyork = std::chrono::locate_zone("America/New_York");

// Давайте смоделируем еженедельную встречу в среду в 15:00
// по пражскому времени

// Местное время не привязано к часовому поясу
std::chrono::local_time meeting{local_days{2025y/March/Wednesday[1]}};

// Пройтись по всем встречам до перехода на летнее время
while (meeting < local_days{2025y/April/Sunday[1]}) 
{
    // создать время, привязанное к часовому поясу Праги
    zoned_time<seconds> local{prague, local_days{meeting} + 15h};
    // создать время, привязанное к часовому поясу Нью-Йорка, из
    // времени, привязанного к часовому поясу Праги
    zoned_time<seconds> remote{newyork, local};

    std::println("{}: {}", prague->name(), local);
    std::println("{}: {}\n", newyork->name(), remote);

    meeting += weeks{1};
}
/* Напечатает:
Europe/Prague: 2025-03-05 15:00:00
America/New_York: 2025-03-05 09:00:00

Europe/Prague: 2025-03-12 15:00:00
America/New_York: 2025-03-12 10:00:00

Europe/Prague: 2025-03-19 15:00:00
America/New_York: 2025-03-19 10:00:00

Europe/Prague: 2025-03-26 15:00:00
America/New_York: 2025-03-26 10:00:00

Europe/Prague: 2025-04-02 15:00:00
America/New_York: 2025-04-02 09:00:00
*/

Пример на Compiler Explorer

Теги

C++ / CppchronoDaily bit(e) C++Программирование