C++20stladvanced
Time Zone Support: local_time, zoned_time, time_zone, sys_time, utc_clock, tai_clock, gps_clock, file_clock, local_days, local_seconds (C++20 Addition)
C++20 · The Big Four · Compiler flag: -std=c++20
Explanation
Full time zone support with IANA time zone database integration. `zoned_time` pairs a time point with a time zone for automatic conversions. Multiple clock types (`utc_clock`, `tai_clock`, `gps_clock`) model different time scales.
Real-World Scenario
Convert meeting times across global offices' time zones in a scheduling application, correctly handling DST transitions.
Quick Snippet
snippet.cpp
#include <chrono>
using namespace std::chrono;
auto now = system_clock::now();
auto tokyo = zoned_time{"Asia/Tokyo", now};
auto nyc = zoned_time{"America/New_York", now};
// Display local times
auto tokyo_local = tokyo.get_local_time();
auto nyc_local = nyc.get_local_time();Full Example
chrono_timezones.cpp
// CodeNebula - C++20 Example: Chrono Time Zones
// Compile: g++ -std=c++20 -Wall -Wextra -o example chrono_timezones.cpp
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
std::cout << "=== sys_time (system clock) ===\n";
auto now = system_clock::now();
auto now_s = floor<seconds>(now);
std::cout << "System time (UTC): " << now_s << "\n";
// Convert to year_month_day
auto today = floor<days>(now);
year_month_day ymd{today};
std::cout << "Today's date: " << ymd << "\n";
std::cout << "\n=== Time zones ===\n";
// Get the local time zone
const auto* local_tz = current_zone();
std::cout << "Local timezone: " << local_tz->name() << "\n";
// Look up specific time zones
const auto* ny_tz = locate_zone("America/New_York");
const auto* tokyo_tz = locate_zone("Asia/Tokyo");
const auto* london_tz = locate_zone("Europe/London");
std::cout << "Found zones: " << ny_tz->name() << ", "
<< tokyo_tz->name() << ", " << london_tz->name() << "\n";
std::cout << "\n=== zoned_time ===\n";
// Create zoned times from system time
zoned_time zt_local{current_zone(), now_s};
zoned_time zt_ny{"America/New_York", now_s};
zoned_time zt_tokyo{"Asia/Tokyo", now_s};
zoned_time zt_london{"Europe/London", now_s};
std::cout << "Local: " << zt_local << "\n";
std::cout << "NYC: " << zt_ny << "\n";
std::cout << "Tokyo: " << zt_tokyo << "\n";
std::cout << "London: " << zt_london << "\n";
std::cout << "\n=== Converting between zones ===\n";
// Create a specific local time in New York
auto ny_local = local_days{2024y / July / 4d} + 12h + 0min;
zoned_time ny_noon{"America/New_York", ny_local};
std::cout << "NY noon: " << ny_noon << "\n";
// Convert to Tokyo time
zoned_time tokyo_time{"Asia/Tokyo", ny_noon.get_sys_time()};
std::cout << "In Tokyo: " << tokyo_time << "\n";
std::cout << "\n=== UTC offset info ===\n";
auto info = ny_tz->get_info(now_s);
std::cout << "NY offset: " << info.offset << "\n";
std::cout << "NY abbrev: " << info.abbrev << "\n";
std::cout << "NY DST: " << (info.save != 0min ? "yes" : "no") << "\n";
std::cout << "\n=== utc_clock ===\n";
auto utc_now = utc_clock::now();
auto utc_s = floor<seconds>(utc_now);
std::cout << "UTC clock: " << utc_s << "\n";
// Convert between clocks
auto sys_from_utc = utc_clock::to_sys(utc_s);
std::cout << "As sys_time: " << floor<seconds>(sys_from_utc) << "\n";
return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example chrono_timezones.cpp