如何将date::year_month_day转换为std::chrono::system_clock::time_point?
将date::year_month_day转为UTC时区的std::chrono::system_clock::time_point
需求是把Howard Hinnant date库中的date::year_month_day转换为std::chrono::system_clock::time_point,并基于UTC时区获取time_since_epoch().count()的正确值。你当前的代码要么结果错误,要么返回的是本地时区的时间戳,以下是问题分析和正确解法:
现有代码问题分析
现代C++写法的错误
你手动构造time_point时,错误地将sys_days包装成了以std::chrono::days为周期的time_point,但system_clock::time_point的默认周期通常是微秒或纳秒(取决于编译器实现),类型不匹配导致结果完全错误。
经典C++写法的错误
tm_mon赋值错误:tm结构体中tm_mon的取值范围是0-11(对应1-12月),你直接传入月份的原始值(比如11月传11),导致月份多算了1个月。mktime基于本地时区:该函数会将传入的tm结构解析为本地时区的时间,最终得到的时间戳并非UTC时区的。
基于date库的正确实现
date库本身提供了直接的转换方式,sys_days是date库中表示UTC时区下从epoch(1970-01-01)开始的天数类型,它可以直接隐式转换为system_clock::time_point,因为两者的epoch是一致的。
#include "date/date.h" #include <chrono> #include <iostream> int main() { date::year_month_day ymd = date::year{2023}/11/9; // 2023年11月9日 // 直接将UTC下的日期转换为system_clock的时间点 std::chrono::system_clock::time_point tp = date::sys_days{ymd}; // 获取UTC时区下的原始计数值(单位取决于system_clock周期,如纳秒/微秒) auto raw_count = tp.time_since_epoch().count(); std::cout << "UTC 原始时间戳计数值: " << raw_count << "\n"; // 若需要秒级的UTC时间戳,可做时长转换 auto seconds_count = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count(); std::cout << "UTC 秒级时间戳: " << seconds_count << "\n"; }
运行这段代码会得到2023年11月9日00:00:00 UTC对应的正确时间戳,比如秒级数值应为1699488000。
内容的提问来源于stack exchange,提问作者shashashamti2008
相关产品推荐
相关产品推荐

