如何枚举某一天的所有小时数?含夏令时场景的C++ chrono优化问询
简化获取含夏令时地区单日所有小时的C++实现
要获取某一天当地时间的所有小时数,无夏令时的地区实现起来很直接,但在夏令时切换当天,当地时间会出现23或25小时的特殊情况。你基于C++ chrono库的代码已经能解决问题,但可以通过减少冗余转换、优化逻辑让代码更简洁:
优化后的代码
#include <iostream> #include <chrono> using namespace std::chrono; constexpr const char* zoneName = "Europe/Berlin"; void PrintHours(local_days date) { // 直接初始化目标时区的当日起始时间 zoned_time zt{zoneName, date}; auto target_day = year_month_day{floor<days>(zt.get_local_time())}; do { // 打印当地时间与对应UTC时间 std::cout << zoneName << ": " << zt.get_local_time() << " UTC: " << zoned_time{"UTC", zt} << '\n'; // 推进1小时,chrono自动处理夏令时切换的特殊情况 zt = zoned_time{zoneName, zt.get_local_time() + hours{1}}; } // 循环直到日期变更,确保覆盖当日所有小时 while (year_month_day{floor<days>(zt.get_local_time())} == target_day); } int main() { year_month_day ymd{year{2023}, month{10}, day{29}}; PrintHours(local_days{ymd}); return 0; }
优化说明
- 去掉UTC中转冗余:原代码通过UTC时区来回转换时间,优化后直接操作目标时区的
zoned_time,减少不必要的时间转换步骤 - 更直观的循环逻辑:使用do-while循环先打印当前时间再推进小时,避免原代码中需要提前初始化循环变量的繁琐
- 依赖chrono自动处理夏令时:
zoned_time会自动处理夏令时切换时的时间歧义(如结束时2:00重复)或缺失(如开始时2:00不存在),无需手动处理边界情况 - 简化变量结构:减少中间变量,代码逻辑更清晰易读
内容的提问来源于stack exchange,提问作者Daniel Anderson
相关产品推荐
相关产品推荐

