如何使用C++ Chrono库在UTC时区下比较指定时区当日时长时间点与UTC time_point
解决方案步骤
要完成UTC时间点与目标时区当日指定时长时间点的比较,核心是将两个时间统一到UTC时区后再对比,具体步骤如下:
1. 解析时长字符串
将输入的"HH:MM:SS"格式字符串解析为std::chrono::duration类型,可借助std::chrono::parse和hh_mm_ss工具类实现:
std::string duration_str = "13:00:00"; std::chrono::hh_mm_ss<std::chrono::seconds> hms; std::istringstream(duration_str) >> std::chrono::parse("%H:%M:%S", hms); auto target_duration = hms.to_duration();
2. 将UTC时间点转换为目标时区的本地时间
使用std::chrono::zoned_time关联目标时区与输入的UTC时间点,获取对应的本地时间:
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/New_York"); std::chrono::zoned_time zt(tz, input_utc_time); auto local_time_point = zt.get_local_time();
(注:input_utc_time为你已解析得到的std::chrono::utc_time类型对象)
3. 获取目标时区当日的起始时刻
通过std::chrono::floor截取本地时间的日期部分,得到当日00:00:00对应的系统时间:
std::chrono::sys_days local_today = std::chrono::floor<std::chrono::days>(local_time_point);
4. 计算目标时区当日指定时间的UTC表示
将当日起始时刻加上解析好的时长,得到目标时区当日指定时间的系统时间,再通过clock_cast转换为UTC时间点:
auto target_local_sys_time = local_today + target_duration; std::chrono::utc_time target_utc_time = std::chrono::clock_cast<std::chrono::utc_clock>(target_local_sys_time);
5. 比较两个UTC时间点
此时input_utc_time和target_utc_time均为UTC时区的时间点,可直接用</>/==等运算符比较:
if (input_utc_time < target_utc_time) { // 输入UTC时间早于目标时区当日指定时间的UTC时刻 } else if (input_utc_time > target_utc_time) { // 输入UTC时间晚于目标时区当日指定时间的UTC时刻 } else { // 两个时间点重合 }
完整代码示例
#include <chrono> #include <string> #include <sstream> #include <iostream> int main() { // 模拟已解析的UTC时间点(实际场景替换为你的parse结果) std::chrono::utc_time<std::chrono::seconds> input_utc_time = std::chrono::utc_clock::now(); // 解析时长字符串 std::string duration_str = "13:00:00"; std::chrono::hh_mm_ss<std::chrono::seconds> hms; std::istringstream(duration_str) >> std::chrono::parse("%H:%M:%S", hms); auto target_duration = hms.to_duration(); // 定位目标时区 const std::chrono::time_zone* ny_tz = std::chrono::locate_zone("America/New_York"); // 转目标时区本地时间 std::chrono::zoned_time ny_zt(ny_tz, input_utc_time); auto ny_local_tp = ny_zt.get_local_time(); // 获取纽约当日起始时刻 std::chrono::sys_days ny_today = std::chrono::floor<std::chrono::days>(ny_local_tp); // 计算纽约当日13:00对应的UTC时间 auto ny_1300_sys = ny_today + target_duration; std::chrono::utc_time<std::chrono::seconds> ny_1300_utc = std::chrono::clock_cast<std::chrono::utc_clock>(ny_1300_sys); // 比较逻辑 if (input_utc_time < ny_1300_utc) { std::cout << "当前UTC时间早于纽约当日13:00的UTC时刻\n"; } else if (input_utc_time > ny_1300_utc) { std::cout << "当前UTC时间晚于纽约当日13:00的UTC时刻\n"; } else { std::cout << "当前UTC时间恰好是纽约当日13:00的UTC时刻\n"; } return 0; }
注意事项
- 需使用C++20及以上标准,时区相关特性是C++20引入的。
- 编译时需链接时区数据库依赖:GCC需添加
-lstdc++fs或-ltz参数,MSVC无需额外链接。 - 确保系统存在时区数据库(Linux通常在
/usr/share/zoneinfo,Windows依赖注册表时区数据)。 - 若输入UTC时间点为其他精度(如毫秒),只需将代码中的
std::chrono::seconds替换为对应精度类型即可。
内容的提问来源于stack exchange,提问作者Roger World
相关产品推荐
相关产品推荐

