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

Часовые пояса – особенно неприятная проблема при работе со временем. Расширение 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
*/
