如何将std::chrono::system_clock::now()转换为boost::mysql::datetime::time_point
如何将std::chrono::system_clock::now()转换为boost::mysql::datetime::time_point
嘿,我一眼就看出你遇到的问题了——这是因为两个time_point的精度不匹配导致的编译错误!
具体来说:
std::chrono::system_clock::now()返回的是纳秒精度的时间点(你的系统里system_clock的duration是nanoseconds)- 而
boost::mysql::datetime::time_point要求的是微秒精度的时间点(底层用的是microseconds,也就是1/1000000秒)
C++不允许隐式转换不同精度的chrono时间点,所以直接赋值肯定会报错。下面是两种简单的解决办法:
方法1:用time_point_cast直接转换时间点
这是最直接的方式,用std::chrono::time_point_cast把高精度的系统时间点转换为mysql要求的微秒精度:
#include <boost/asio.hpp> #include <boost/mysql.hpp> #include <chrono> #include <exception> #include <format> #include <iostream> #include <stdexcept> int main() { // 获取系统当前时间(纳秒精度) auto sys_now = std::chrono::system_clock::now(); // 转换为mysql datetime要求的微秒精度时间点 boost::mysql::datetime::time_point tp = std::chrono::time_point_cast<boost::mysql::datetime::duration>(sys_now); // 验证转换结果:转成time_t输出 const std::time_t t_c = std::chrono::system_clock::to_time_t( std::chrono::time_point_cast<std::chrono::system_clock::duration>(tp) ); std::cout << "The system clock is currently at " << std::ctime(&t_c); return EXIT_SUCCESS; }
time_point_cast会自动截断多余的精度(比如把纳秒部分除以1000,丢掉余数),这对于mysql的datetime存储来说完全够用。如果需要四舍五入,可以替换成std::chrono::floor或std::chrono::ceil,效果类似但会处理余数。
方法2:通过epoch时间间隔转换
你也可以先计算从epoch到现在的时间间隔,再构造mysql的time_point,效果和上面完全一样:
int main() { // 获取从epoch到现在的纳秒间隔 auto sys_epoch = std::chrono::system_clock::now().time_since_epoch(); // 转换为微秒间隔 auto mysql_epoch = std::chrono::duration_cast<boost::mysql::datetime::duration>(sys_epoch); // 构造mysql的time_point boost::mysql::datetime::time_point tp(mysql_epoch); // 验证输出 const std::time_t t_c = std::chrono::system_clock::to_time_t( std::chrono::time_point_cast<std::chrono::system_clock::duration>(tp) ); std::cout << "The system clock is currently at " << std::ctime(&t_c); return EXIT_SUCCESS; }
为什么原来的代码报错?
你的原代码里直接把std::chrono::system_clock::now()赋值给boost::mysql::datetime::time_point,这两种time_point的模板参数(duration)完全不同:
- 系统的是
duration<long long, ratio<1, 1000000000>>(纳秒) - mysql的是
duration<std::int64_t, ratio<1, 1000000>>(微秒)
C++严格禁止这种隐式类型转换,必须用显式的time_point_cast或duration_cast来告诉编译器你要怎么处理精度差异。
内容来源于stack exchange
相关产品推荐
相关产品推荐

