我正在寻找一个简洁的解决方案来输出精度为毫秒的boost::posix_time::time_duration
:应该有正好3个小数 - 秒的数字。默认格式产生6个小数位(如果全部为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);
// 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;
}
使用facet和一些解决方法,我可以得到所需的输出。但该解决方案仅禁用日期时间库的部分,我可以根据自己的需要进行配置,并用低级实现替换它们:
#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;
}
实现所需输出的推荐方法是什么?