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

C++23中如何用std::chrono::parse解析带时区时间戳为zoned_time

解决带时区时间戳解析的编译错误

问题原因

你尝试直接将带时区偏移(%z)的时间字符串解析到std::chrono::system_clock::time_point,但std::chrono::parse没有匹配的重载支持这种组合。当格式字符串包含时区偏移指令时,需要使用能处理时区信息的目标类型,或者拆分解析本地时间与偏移后再转换为UTC时间。

解决方案1:直接解析到sys_time(推荐)

std::chrono::sys_time是system_clock::time_point的模板别名,C++23的parse原生支持将带%z的字符串直接解析为sys_time,自动应用时区偏移转换为UTC时间:

#include <chrono>
#include <string_view>

namespace MyTime {
    std::chrono::system_clock::time_point from_string(std::string_view s) {
        using namespace std::chrono;
        // 明确指定精度为秒,匹配格式字符串中的时间精度
        sys_time<seconds> tp;
        std::chrono::parse("%Y-%m-%dT%H:%M:%S%z", s, tp);
        // 隐式转换为system_clock::time_point(兼容更高精度)
        return tp;
    }
}

int main() {
    auto tp = MyTime::from_string("2024-05-20T12:34:56+0200");
}

解决方案2:拆分解析本地时间与时区偏移

如果需要更明确的控制逻辑,可以分别解析本地时间和时区偏移,再手动计算得到UTC时间:

#include <chrono>
#include <string_view>

namespace MyTime {
    std::chrono::system_clock::time_point from_string(std::string_view s) {
        using namespace std::chrono;
        local_time<seconds> local_tp;
        minutes utc_offset;
        // 同时解析本地时间和时区偏移
        std::chrono::parse("%Y-%m-%dT%H:%M:%S%z", s, local_tp, utc_offset);
        // 本地时间减去偏移得到UTC时间(公式:local_time = UTC + offset → UTC = local_time - offset)
        return sys_time<seconds>{local_tp - utc_offset};
    }
}

int main() {
    auto tp = MyTime::from_string("2024-05-20T12:34:56+0200");
}

额外说明

  • GCC 14.1对C++23的std::chrono::parse支持完整,上述两种方案均可正常编译运行。
  • 若你的时间戳时区偏移是±HH:MM格式(如+02:00),需将格式字符串改为%Y-%m-%dT%H:%M:%S%Ez以匹配格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:11:21