Как отформатировать boost :: date_time duration для вывода с точностью до миллисекунды?

Я ищу краткое решение для вывода 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;
}

Используя аспекты и некоторые обходные пути, я могу получить требуемый результат. Но это решение отключает только те части библиотеки даты и времени, которые я не могу настроить для своих нужд, и заменяет их реализацией низкого уровня:

#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;
}

Каков будет рекомендуемый способ достижения требуемого результата?

3

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector