如何使用MySQL C++ Connector 8.0以ISO 8601格式读取含微秒的DATETIME类型数据
如何使用MySQL C++ Connector 8.0以ISO 8601格式读取含微秒的DATETIME类型数据
我太懂你这种困扰了——找了一堆示例不是代码绕得离谱,就是跑起来各种问题,完全没必要这么折腾!针对用MySQL C++ Connector 8.0读取带微秒的DATETIME并转换成ISO 8601格式,这里有个简洁又靠谱的方案:
推荐方案:使用X DevAPI(Connector 8.0主推的现代接口)
X DevAPI直接提供了mysqlx::DateTime类型,能完整保留DATETIME中的微秒信息,我们只需要把它格式化成ISO 8601字符串就行,完全不用碰底层的原始字节解析。
步骤1:从查询结果中获取带微秒的DATETIME
假设你已经执行了查询并拿到了结果行(mysqlx::Row),直接提取字段并转换为mysqlx::DateTime:
// 假设行中索引为0的字段是目标DATETIME列,也可以用列名:row.get("your_col_name") mysqlx::DateTime dt = row.get(0).get<mysqlx::DateTime>();
步骤2:编写格式化函数转成ISO 8601格式
写一个轻量的格式化函数,把mysqlx::DateTime转换成标准的ISO 8601字符串(包含微秒):
#include <iomanip> #include <sstream> #include <string> std::string datetime_to_iso8601(const mysqlx::DateTime& dt) { std::ostringstream oss; // 处理日期部分:YYYY-MM-DD oss << std::setw(4) << std::setfill('0') << dt.getYear() << "-" << std::setw(2) << std::setfill('0') << dt.getMonth() << "-" << std::setw(2) << std::setfill('0') << dt.getDay(); // 处理时间部分(包含微秒) if (dt.isTimeValid()) { oss << "T" << std::setw(2) << std::setfill('0') << dt.getHour() << ":" << std::setw(2) << std::setfill('0') << dt.getMinute() << ":" << std::setw(2) << std::setfill('0') << dt.getSecond(); // 只有当微秒不为0时才输出,符合ISO 8601的可选规则 if (dt.getMicrosecond() > 0) { oss << "." << std::setw(6) << std::setfill('0') << dt.getMicrosecond(); } } // 加上UTC时区标识Z,如果你需要其他时区可以自行调整 oss << "Z"; return oss.str(); }
步骤3:调用函数获取结果
std::string iso_str = datetime_to_iso8601(dt); // 输出示例:2024-05-20T16:45:30.123456Z
如果你还在使用传统JDBC风格接口
如果项目还依赖旧的JDBC风格接口,同样可以用类似的思路,直接用sql::Timestamp来获取带微秒的时间,再格式化:
#include <iomanip> #include <sstream> #include <string> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> // 假设你已经建立连接并执行了查询 sql::ResultSet *res = stmt->executeQuery("SELECT your_datetime_col FROM your_table"); while (res->next()) { // 获取带微秒的时间戳 sql::Timestamp ts = res->getTimestamp("your_datetime_col"); // 格式化到ISO 8601 std::ostringstream oss; oss << std::setw(4) << std::setfill('0') << ts.getYear() << "-" << std::setw(2) << std::setfill('0') << ts.getMonth() << "-" << std::setw(2) << std::setfill('0') << ts.getDay() << "T" << std::setw(2) << std::setfill('0') << ts.getHour() << ":" << std::setw(2) << std::setfill('0') << ts.getMinute() << ":" << std::setw(2) << std::setfill('0') << ts.getSecond() << "." << std::setw(6) << std::setfill('0') << ts.getMicroSecond() << "Z"; std::string iso_str = oss.str(); // 使用iso_str... }
为什么这个方法更靠谱?
网上那些解析原始4字节的方法很容易踩坑——不同MySQL版本的底层存储格式可能有细微变化,而且手动解析代码冗余又容易出错。直接用Connector官方提供的类型来读取,不仅代码简洁,还能保证兼容性和稳定性,完全不用自己处理底层细节。
备注:内容来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

