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

C++20如何将std::string高精度转换为std::chrono::system_clock::time_point

解决方法

你出现精度丢失的核心原因是默认的%T格式符仅处理到整数秒,格式化和解析环节都没有明确指定小数秒的处理规则,按以下方式修改两处代码即可:

1. 标记(1)处格式化指定毫秒精度

C++20 std::format 对chrono类型支持小数秒精度说明,%.3f代表固定保留3位小数(毫秒精度),如果需要微秒可替换为%.6f:

string src = format("{:%F %T%.3f}", tp1);

2. 标记(2)处解析匹配格式规则

解析的格式串需要和格式化输出的结构完全对应,补充上小数秒的匹配规则即可:

ss >> parse("%F %T%.3f"s, tp2);

修改后完整代码

#include <chrono>
#include <format>
#include <iostream>
#include <string>
#include <sstream>

int main(int argc, char* argv[])
{
    using namespace std;
    using namespace std::chrono;

    auto tp1 = system_clock::now();
    string src = format("{:%F %T%.3f}", tp1);    // (1) 指定毫秒精度输出
    stringstream ss{ src };

    system_clock::time_point tp2;
    ss >> parse("%F %T%.3f"s, tp2);        // (2) 匹配毫秒精度解析
    bool fail = ss.fail();
    string dst = format("{:%F %T%.3f}", tp2);

    cout << "Source time:    " << src << endl;
    cout << "Converted time: " << dst << (fail ? " (FAILED)"s : " (no fails)"s) << endl;

    return 0;
}

输出效果

Source time:    2021-09-21 09:31:48.193
Converted time: 2021-09-21 09:31:48.193 (no fails)

如果需要保留微秒精度,仅需要将两处格式串中的.3f统一替换为.6f即可,VS2019的STL完全支持该语法。

内容的提问来源于stack exchange,提问作者Oleksandr N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:12:00