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

在C++20中如何将自定义Time结构体转为std::chrono::time_point?

C++20 自定义Time结构体转std::chrono::system_clock::time_point实现

问题描述

需要将自定义的Time结构体转换为std::chrono::system_clock::time_point类型,实现指定的convert函数:

struct Time {
    //! 年份
    unsigned int year;
    //! 月份
    unsigned int month;
    //! 日期
    unsigned int day;
    //! 小时
    unsigned int hours;
    //! 分钟
    unsigned int minutes;
    //! 秒数
    unsigned int seconds;
};

std::chrono::system_clock::time_point convert(Time& time) {
    // 此处填写实现代码
}

实现代码

#include <chrono>
#include <stdexcept>

struct Time {
    unsigned int year;
    unsigned int month;
    unsigned int day;
    unsigned int hours;
    unsigned int minutes;
    unsigned int seconds;
};

std::chrono::system_clock::time_point convert(Time& time) {
    // 构造C++20 chrono标准的年、月、日对象
    std::chrono::year y{static_cast<int>(time.year)};
    std::chrono::month m{static_cast<unsigned int>(time.month)};
    std::chrono::day d{static_cast<unsigned int>(time.day)};

    // 验证日期合法性,排除2月30日、13月这类无效输入
    std::chrono::year_month_day ymd{y, m, d};
    if (!ymd.ok()) {
        throw std::invalid_argument("Invalid date");
    }

    // 将日期转换为从Unix纪元开始的天数表示
    std::chrono::sys_days days_since_epoch{ymd};

    // 计算当天的时分秒偏移量
    auto time_of_day = std::chrono::hours{time.hours} +
                       std::chrono::minutes{time.minutes} +
                       std::chrono::seconds{time.seconds};

    // 组合日期与时间,得到最终的system_clock时间点
    return days_since_epoch + time_of_day;
}

关键说明

  • C++20新特性依赖:使用std::chrono库新增的日历类型(year/month/day)处理日期,这是C++20标准引入的专门用于日期时间转换的组件。
  • 合法性校验:通过year_month_day::ok()检查输入日期是否有效,避免无效日期触发未定义行为。
  • 时间点组合逻辑:先将日期转换为纪元以来的天数(sys_days),再叠加当天的时分秒偏移量,最终得到对应system_clock的时间点。
  • 异常处理:针对无效输入抛出标准异常,调用者可根据业务场景捕获并处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:37:13