如何从年月日时分秒获取std::chrono::time_point<system_clock, seconds>
修复代码的方法
原代码主要存在几个问题:
- 误用
years/months/days这些时长类型构造日期,它们代表的是一段时间长度,而非具体的年月日数值; - 普通数值(
hour/minute/second)无法直接和chrono时间点/时长相加,必须转换为对应的chrono时长类型; - 目标时间点
tp的精度为秒级,传入的小数秒会被自动截断。
修复后的代码
#include <chrono> int main() { int year = 2023; int month = 1; int day = 1; int hour = 1; int minute = 1; double second = 0.000005; // 1. 构造具体年月日,转换为系统时间的天数 std::chrono::sys_days base_date = std::chrono::year_month_day{ std::chrono::year{year}, std::chrono::month{month}, std::chrono::day{day} }; // 2. 将时分秒转为chrono时长类型,叠加到基准日期 auto total_duration = std::chrono::hours{hour} + std::chrono::minutes{minute} + std::chrono::seconds{static_cast<long long>(second)}; // 3. 赋值给目标时间点 std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> tp; tp = base_date + total_duration; return 0; }
额外说明
- 如果需要保留小数秒精度,需将
tp的精度改为更高类型(比如std::chrono::microseconds或std::chrono::nanoseconds),同时把second转换为对应精度的时长(例如std::chrono::duration<double, std::micro>{second*1e6})。 year_month_day需要C++20及以上版本支持,若使用旧版本,可通过tm结构体转换构造日期。
内容的提问来源于stack exchange,提问作者Guo Jia
相关产品推荐
相关产品推荐

