2011-07-14 136 views
6

我试图在“YYYY-MM-DD hh:mm:ss.fff”格式中打印一个boost :: posix_time :: ptime,其中MM是一个2位数的月份,并且是一个3位数毫秒。一个例子是:2011- -14 22:38:40。 。我正在使用Boost 1.33.1如何将C++ boost posix_time :: ptime的分辨率更改为毫秒?

我试图调用API “的ptime :: to_simple_string()”,但它不符合我的需要:这种方法打印的p​​time在“YYYY-MMM-DD HH的格式: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 Date Time文档(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)。因此,我将马克的建议(见下文)在将微秒级分辨率ptime转换为字符串之后去掉最后3个字符。

+0

出于好奇,你为什么用了近6岁的版本的Boost? – ildjarn

+0

@ildjarn:哦,因为1.33.1版本已经在我手中,所以我现在不想打扰升级到最新版本。这提醒了我:在最新的Boost中有没有一个很好的解决方案来解决我的问题?嗯..我会去看看文档.. – yaobin

+0

当前版本的Boost.DateTime默认情况下的微秒分辨率,这应该超过您的需求。但是真的,在C++术语中,6年是**古代** - 升级。 – ildjarn

回答

5

简单而实用的解决方案是使用%f,并且总是从结果中去掉最后3个字符。

+0

是的,我之前想过这个:)但我认为应该有更好的方式来直接输出我需要的格式的ptime。我会在这里等待并继续在文档中进行搜索。 – yaobin

+1

@rob,定义“更好”。似乎有一种方法可以编写自己的输出转换函数,但对于这样一个简单的问题看起来似乎过度。 –

+0

同意。经过一些进一步的研究,我认为“带”的方式应该是最简单:) – yaobin

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(); 
} 
+0

Soory,这个答案不给任何解决方案.... 将输出微秒....不是毫秒。 – Gabor

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 
相关问题