2011-07-14 12 views
6

Próbuję wydrukować wzmiankę :: posix_time :: ptime w formacie "RRRR-MM-DD hh: mm: ss.fff" gdzie MM to 2-cyfrowy miesiąc, a fff - 3-cyfrowy millisecond. Przykład: 2011- -14 22:38:40. .Jak zmienić wzmocnienie C++ posix_time :: rozdzielczość ptime na milisekundę?

Używam Zwiększ 1.33.1.

Próbowałem do wywołania API "ptime :: to_simple_string()", ale nie spełnia moje potrzeby: metoda ta drukuje ptime w formacie „RRRR-MMM-DD GG: MM: SS. ffffff "gdzie" MMM "to nazwa miesiąca składająca się z 3 znaków, np." Jan ", a" ffffff "to 6-cyfrowy mikrosekund. NIE tego chcę.

Następnie próbowałem do korzystania z rzeczy 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; 

Ale mam wyjścia jak "2011-07-14 22: 38: 40.123000". To też NIE jest tym, czego chcę.

Wygląda jak ptime domyślnie używa mikrosekundy jako rozdzielczości czasu. Ale Po prostu potrzebuję rozdzielczości milisekund. Po pewnym badaniu myślę, że mogą istnieć dwie metody rozwiązania tego problemu::

1). W jakiś sposób mogę zmienić rozdzielczość czasu ptime, aby użyć milisekundy. Znalazłem niektóre klasy enumacji i szablonów związane z rozdzielczością czasu, ale nie wiem, jak z nich korzystać.

2). W jakiś sposób mogę zmienić format aspektu czasu, aby wydrukować tylko milisekundę. Ale oficjalna dokumentacja zdaje się mówić "% F" i "% f", obydwa używają rozdzielczości mikrosekundy.

Preferuję pierwsze rozwiązanie, ale potrzebuję pomocy! Jak mogę uzyskać ciąg ptime w żądanym formacie?

PS:

1). Chociaż próbowałem wyszukać podobne pytanie na tej stronie, ale go nie znajduję. Jeśli znasz to proszę powiedz mi.

2). Dokumentacja "Zwiększenie 1.33.1 Data Godzin" (http://www.boost.org/doc/libs/1_33_1/doc/html/date_time.html) to jedyne odniesienie, które czytałem.


Aktualizacja 07/15/2011:

Po kilku dalszych badań, moja konkluzja jest następująca:

1). Można zmienić rozdzielczość czasu na milisekundę, więc użycie "% f" w time_facet spowoduje wydrukowanie tylko milisekund, zamiast domyślnych mikrosekund. Wydaje się jednak, że musisz zdefiniować cały zestaw własnych klas, w tym your_time_res_traits, your_time_duration, your_time_system_config, your_time_system i your_time. Jest to zdecydowanie zbyt skomplikowane dla mojego problemu.

2). W związku z tym wziąłem pod uwagę sugestię Marka (patrz poniżej), aby usunąć 3 ostatnie znaki po przekształceniu ptime o długości mikrosekundy w ciąg znaków.

+0

Z ciekawości, dlaczego używasz prawie 6 lat starą wersję Boost? – ildjarn

+0

@ildjarn: Oh, ponieważ wersja 1.33.1 jest już w mojej dłoni, więc nie chcę teraz aktualizować do najnowszej wersji. To mi przypomina: Czy w najnowszym Boost jest dobre rozwiązanie, aby rozwiązać mój problem? Hm ... Pójdę i przejrzę do dokumentu .. – yaobin

+0

Obecne wersje Boost.DateTime mają domyślnie rozdzielczość mikrosekundy, która powinna bardziej odpowiadać twoim potrzebom. Ale tak naprawdę, 6 lat to ** starożytny ** w kategoriach C++ - aktualizacja. – ildjarn

Odpowiedz

5

Proste, pragmatyczne rozwiązanie polegałoby na użyciu %f i zawsze usuń ostatnie 3 znaki z wyniku.

+0

Tak, myślałem o tym wcześniej :) Ale myślę, że powinien być lepszy sposób bezpośredniego wyprowadzenia ptime w formacie, którego potrzebuję. Zaczekam tutaj i dalej będę szukać w dokumentacji. – yaobin

+1

@rob, Zdefiniuj "lepiej". Wydaje się, że istnieje sposób na napisanie własnej funkcji konwersji wyników, ale wydaje się to przesadą dla tak prostego problemu. –

+0

Zgadzam się. Po dalszych badaniach uważam, że "pasek" powinien być najłatwiejszy :) – 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, ta odpowiedź nie daje żadnego rozwiązania ... wyświetli mikrosekundy .... nie milisekundy. – Gabor

0

Spowoduje to obcięcie ułamków sekund.

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

Wyniki

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

01:02:07:567 
Powiązane problemy