C++20 chrono解析为zoned_time后格式化去除末尾小数的实现方法
问题根因
MSVC 实现中std::chrono::system_clock::duration的默认精度为100纳秒,%T格式化符会自动匹配duration精度输出小数秒,因此会出现末尾的.0000000后缀。
最优实现方案
有两种不需要字符串截断的原生实现方案,按需选择即可:
方案1:将时间点截断到秒精度
如果后续业务逻辑不需要小数秒精度,直接从时间维度截断精度即可,格式化代码无需修改:
#include <iostream> #include <string> #include <chrono> #include <sstream> int main() { std::string timeString("2020-02-03 00:12:34"); std::string formatString("%Y-%m-%d %T"); bool successful = true; std::stringstream iss(timeString); std::chrono::local_time<std::chrono::system_clock::duration> localTimeStamp; if (not (iss >> std::chrono::parse(formatString, localTimeStamp))) { successful = false; } // 新增:将本地时间戳向下截断到秒精度 auto localTimeSec = std::chrono::floor<std::chrono::seconds>(localTimeStamp); auto result = std::chrono::zoned_time(std::chrono::current_zone(), localTimeSec); std::cout << std::format("{:%Y-%m-%d %T}", result) << std::endl; }
输出结果为:2020-02-03 00:12:34
方案2:仅格式化时指定输出精度
如果需要保留时间戳的高精度,仅输出时不展示小数秒,直接修改格式化字符串即可,不需要修改时间戳逻辑:
将原格式化语句:
std::cout << std::format("{:%Y-%m-%d %T}", result) << std::endl;
修改为:
// 直接指定输出到秒,不展示小数部分 std::cout << std::format("{:%Y-%m-%d %H:%M:%S}", result) << std::endl;
效果和方案1完全一致。
内容的提问来源于stack exchange,提问作者Patrick Poitras
相关产品推荐
相关产品推荐

