Как изменить разрешение C++ boost posix_time::ptime на миллисекунды?

Я пытаюсь напечатать boost::posix_time::ptime в формате "ГГГГ-ММ-ДД чч:мм:сс.fff", где MM — это двухзначный месяц, а fff — трехзначный. миллисекунды. Пример: 2011-07-14 22:38:40.123.

Я использую Boost 1.33.1.

Я пытался вызвать API "ptime::to_simple_string()", но это не соответствует моей потребности: этот метод печатает ptime в формате "ГГГГ-МММ-ДД чч:мм:сс". .ffffff», где «МММ» — это название месяца из 3 символов, например «Ян», а «ffffff» — это 6-значная микросекунда. Это НЕ то, чего я хочу.

Затем я попытался использовать функцию time_facet:

ptime my_time(second_clock::local_time());
time_facet<ptime, char> * my_time_facet = new time_facet<ptime, char>();
std::cout.imbue(std::locale(std::locale::classic(), my_time_facet));
std::cout << my_time;

Но я получил вывод типа «2011-07-14 22:38:40.123000». Я тоже НЕ этого хочу.

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

1). Каким-то образом я могу изменить разрешение времени ptime, чтобы использовать миллисекунды. Я нашел несколько классов перечисления и шаблонов, связанных с временным разрешением, но я не знаю, как их использовать.

2). Каким-то образом я могу изменить формат фасета времени, чтобы распечатать только миллисекунды. Но в официальной документации, похоже, говорится, что "%F" и "%f" используют разрешение в микросекундах.

Я предпочитаю первое решение, но мне нужна помощь! Как я могу получить строку ptime в желаемом формате?

PS:

1). Хотя я пытался найти аналогичный вопрос на этом сайте, но не нашел. Если вы знаете это, пожалуйста, скажите мне.

2). Документация Boost 1.33.1 Date Time (http://www.boost.org/doc/libs/1_33_1/doc/html/date_time.html) — единственная ссылка, которую я читал.


Обновление от 15.07.2011:

После некоторых дополнительных исследований мой вывод таков:

1). Можно изменить разрешение времени на миллисекунды, поэтому использование «%f» в time_facet будет печатать только миллисекунды вместо микросекунд по умолчанию. Однако вам, похоже, нужно определить целый набор собственных классов, включая your_time_res_traits, your_time_duration, your_time_system_config, your_time_system и your_time. Это определенно слишком сложно для моей проблемы.

2). Таким образом, я бы воспользовался предложением Марка (см. Ниже) просто удалить последние 3 символа после преобразования ptime с микросекундным разрешением в строку.


person yaobin    schedule 14.07.2011    source источник
comment
Из любопытства, почему вы используете почти 6-летнюю версию Boost?   -  person ildjarn    schedule 14.07.2011
comment
@ildjarn: О, потому что версия 1.33.1 уже у меня в руках, поэтому я не хочу сейчас обновляться до последней версии. Это напоминает мне: есть ли хорошее решение в последней версии Boost для решения моей проблемы? Хм.. Пойду посмотрю документ..   -  person yaobin    schedule 15.07.2011
comment
Текущие версии Boost.DateTime по умолчанию имеют разрешение в микросекундах, что более чем соответствует вашим потребностям. Но на самом деле, 6 лет — это древний срок службы C++ — обновление.   -  person ildjarn    schedule 15.07.2011


Ответы (3)


Простым и прагматичным решением было бы использовать %f и всегда удалять последние 3 символа из результата.

person Mark Ransom    schedule 14.07.2011
comment
Да, я думал об этом раньше :) Но я думаю, что должен быть лучший способ напрямую выводить ptime в нужном мне формате. Я подожду здесь и продолжу поиск в документации. - person yaobin; 15.07.2011
comment
@rob, определи лучше. Кажется, есть способ написать собственную функцию преобразования вывода, но это кажется излишним для такой простой задачи. - person Mark Ransom; 15.07.2011
comment
Соглашаться. После некоторых дальнейших исследований я думаю, что раздевание должно быть самым простым :) - person yaobin; 15.07.2011

Это урежет доли секунды.

#include <iostream>
#include <iomanip>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
  boost::gregorian::date dayte(boost::gregorian::day_clock::local_day());
  boost::posix_time::ptime midnight(dayte);
  boost::posix_time::ptime
     now(boost::posix_time::microsec_clock::local_time());
  // boost::posix_time::time_duration td = now - midnight;
  boost::posix_time::time_duration td(1,2,3,4567899);

  std::stringstream sstream;
  sstream << td.fractional_seconds();

  std::string trunc = std::string(sstream.str()).substr(0,3);

  std::cout << dayte.year() << "-" << dayte.month().as_number()
    << "-" << dayte.day() << " ";
  std::cout << td.hours() << ":" << td.minutes() << ":" << td.seconds()
   << ":" << td.fractional_seconds() << std::endl;

  std::cout << std::endl;
  std::cout << std::setfill('0') << std::setw(2)  << td.hours() << ":";
  std::cout << std::setfill('0') << std::setw(2) << td.minutes() << ":";
  std::cout << std::setfill('0') << std::setw(2) << td.seconds() << ":";
  std::cout << trunc << std::endl;
}

Результаты

2015-10-27 1:2:7:567899

01:02:07:567
person sfanjoy    schedule 27.10.2015

person    schedule
comment
Soory, этот ответ не дает никакого решения.... будет выводить микросекунды.... не миллисекунды. - person Gabor; 10.06.2016