C++中Epoch时间与GMT格式化字符串互转问题及解决
C++ Epoch与GMT字符串互转:反向转换时分秒错误的解决
问题场景
我在C++中实现了Epoch时间到GMT格式化字符串的正向转换,以及GMT字符串转回Epoch时间的反向转换功能。正向转换结果验证正确,但反向转换时,得到的分钟和秒数值始终错误。
排查过程
- 初步排查确认
get_time()函数解析GMT字符串到tm结构体的结果正常 - 一度怀疑
timegm()函数转换逻辑有问题,测试后排除该可能 - 最终定位问题出在
cvt_formatGmt2epoch()函数的返回类型上
代码示例
错误版本(返回float)
float cvt_formatGmt2epoch(const std::string& gmt_str) { std::tm tm = {}; std::istringstream ss(gmt_str); ss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S"); time_t t = timegm(&tm); return static_cast<float>(t); }
修正版本(返回double)
double cvt_formatGmt2epoch(const std::string& gmt_str) { std::tm tm = {}; std::istringstream ss(gmt_str); ss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S"); time_t t = timegm(&tm); return static_cast<double>(t); }
问题原因
float类型仅具备6-7位有效数字精度,而当前Epoch时间(以秒为单位)已达10^9量级(十几亿秒),用float存储会丢失低位精度,导致转换回时分秒时出现偏差。double类型的有效数字精度约为15-17位,可完全准确存储当前Epoch秒数,因此转换结果恢复正常。
内容的提问来源于stack exchange,提问作者Odirection
相关产品推荐
相关产品推荐

