如何将C ++提升posix_time :: ptime的分辨率更改为毫秒?

时间:2011-07-14 14:57:52

标签: c++ boost resolution datetime-format

我正在尝试以“YYYY-MM-DD hh:mm:ss.fff”的格式打印boost :: posix_time :: ptime,其中 MM是2位数的月份和fff a 3位毫秒。例如:2011- 07 -14 22:38:40。 123

我正在使用 Boost 1.33.1

我尝试来调用API“ptime :: to_simple_string()”,但它不符合我的需要:此方法以“YYYY-MMM-DD hh”格式打印ptime: mm:ss.ffffff“其中”MMM“是3个字的月份名称,例如”Jan“,”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的时间分辨率来使用毫秒。我发现了一些与时间分辨率相关的enumation和模板类,但我不知道如何使用它们。

2)。不知何故,我可以改变我的时间面格式打印出毫秒。但官方文档似乎说“%F”和“%f”都使用微秒分辨率。

我倾向于选择第一个解决方案,但我需要帮助!如何以我想要的格式获得ptime字符串?

PS:

1)。虽然我试图在这个网站上搜索一个类似的问题,但我找不到。如果你知道的话请告诉我。

2)。 Boost 1。33。1日期时间文档(http://www.boost.org/doc/libs/1_33_1/doc/html/date_time.html)是我一直在阅读的唯一参考。


2011年7月15日更新:

经过深入研究后,我的结论如下:

1)。可以将时间分辨率更改为毫秒,因此在time_facet中使用“%f”将打印出毫秒,而不是默认的微秒。但是,您似乎需要定义一整套自己的类,包括your_time_res_traits,your_time_duration,your_time_system_config,your_time_system和your_time。这对我的问题来说太复杂了。

2)。因此,我将Mark的建议(见下文)在将微秒分辨率ptime转换为字符串后删除最后3个字符。

3 个答案:

答案 0 :(得分:5)

简单实用的解决方案是使用%f并始终从结果中删除最后3个字符。

答案 1 :(得分:1)

//
// microsec_clock
//


  #include "boost/date_time/posix_time/posix_time.hpp"
  #include "boost/date_time/local_time_adjustor.hpp"
  #include "boost/date_time/c_local_time_adjustor.hpp"
  #include <iostream>
////////////////////////////////////////////////////////////////////////////////
void main ()
{
boost::posix_time::ptime my_time(boost::posix_time::microsec_clock::local_time());
boost::date_time::time_facet<boost::posix_time::ptime, char> * my_time_facet = new boost::date_time::time_facet<boost::posix_time::ptime, char>();
std::cout.imbue(std::locale(std::locale::classic(), my_time_facet));
std::cout << my_time;

getchar();
}

答案 2 :(得分:0)

这将截断小数秒。

#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