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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:49:36