如何以毫秒级精度格式化输出的 boost::d ate_time duration?

How to format boost::date_time duration for output with millisecond precision?

提问人:Carsten Scholtes 提问时间:7/1/2014 最后编辑:Carsten Scholtes 更新时间:7/2/2014 访问量:1531

问:

我正在寻找一个简洁的解决方案来输出精度为毫秒的 a:应该正好有 3 个小数秒数字。默认格式生成 6 个小数位(如果它们都为 0,则不生成):boost::posix_time::time_duration

#include <boost/date_time.hpp>
#include <iostream>

int main()
{
    // Define some duration in milliseconds:
    int64_t start_msecs((((40 * 60) + 3) * 60 + 2) * 1000 + 1);

    // The same as time_duration:
    boost::posix_time::time_duration start_time =
        boost::posix_time::milliseconds(start_msecs);

    // No suitable format (for MP4Box chapter starts): ////////////////////
    std::cout << "Wrong format: "
        << std::setprecision(3) // <-- No effect!?
        << start_time << std::endl;
    // Output: "Wrong format: 40:03:02.001000"
    // Required format      : 40:03:02.001

    return 0;
}

使用分面和一些解决方法,我可以获得所需的输出。但是该解决方案仅禁用我无法根据需要配置的日期时间库部分,并用低级实现替换它们:

#include <boost/date_time.hpp>
#include <iostream>

int main()
{
    // Define some duration in milliseconds:
    int64_t start_msecs((((40 * 60) + 3) * 60 + 2) * 1000 + 1);

    // The same as time_duration:
    boost::posix_time::time_duration start_time =
            boost::posix_time::milliseconds(start_msecs);

    // Define output format without fractional seconds:
    boost::posix_time::time_facet *output_facet =
        new boost::posix_time::time_facet();
    output_facet->time_duration_format("%O:%M:%S");

    // Imbue cout with format for duration output:
    std::cout.imbue(std::locale(std::locale::classic(), output_facet));

    // Only the milliseconds:
    int64_t msecs_only = start_msecs % 1000;

    // Render duration with exactly 3 fractional-second digits: ///////////
    std::cout << "Working: "
        << start_time << "."
        << std::setw(3) << std::right << std::setfill('0')
        << msecs_only << std::endl;
    // Output: "Working: 40:03:02.001"

    return 0;
}

实现所需输出的推荐方法是什么?

C++ Boost 格式化 iostream boost-date-time

评论

1赞 Konrad Kleine 7/1/2014
你看过这个问题和答案吗?stackoverflow.com/questions/7589170/......
0赞 Carsten Scholtes 7/2/2014
谢谢你向我指出这个问题。不幸的是,它不能直接解决小数秒数字的格式。(在某一时刻,它使用某种格式来提供这些数字,但提供的位数似乎被硬编码为 6。%f%f
0赞 Carsten Scholtes 7/2/2014
我在原始问题中发现了一个错误:分面的类型和设置其格式的函数是错误的。我已经解决了这个问题,但问题仍然存在。

答: 暂无答案