在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
相关产品推荐
相关产品推荐

