You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何枚举某一天的所有小时数?含夏令时场景的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;
}

优化说明

  1. 去掉UTC中转冗余:原代码通过UTC时区来回转换时间,优化后直接操作目标时区的zoned_time,减少不必要的时间转换步骤
  2. 更直观的循环逻辑:使用do-while循环先打印当前时间再推进小时,避免原代码中需要提前初始化循环变量的繁琐
  3. 依赖chrono自动处理夏令时:zoned_time会自动处理夏令时切换时的时间歧义(如结束时2:00重复)或缺失(如开始时2:00不存在),无需手动处理边界情况
  4. 简化变量结构:减少中间变量,代码逻辑更清晰易读

内容的提问来源于stack exchange,提问作者Daniel Anderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:56:24