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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:48:03