2014-04-09 20 views
13

Non riesco a convertire un oggetto ptime da boost in una stringa da passare a una funzione. Ho trovato molti altri thread simili per quanto riguarda l'output di un oggetto boost time su una stringa (principalmente per cout) ma nessuno di quello che ho trovato su di essi funziona.Come convertire un boost :: ptime in stringa

Sembra che il modo più semplice sia inserire l'oggetto ptime in un stringstream e quindi utilizzare la stringa di stringstream. Ho anche tentato di incorporare lo stringstream con un time_facet, come suggeriscono alcune risposte su altri thread. Tuttavia, non riesco a creare un oggetto time_facet. Mi dà l'errore che manca l'elenco degli argomenti per il modello di classe. Ciò che confonde è il nulla su Internet ho trovato alcuna menzione di un elenco di argomenti per time_facet, e anche la pagina di documentazione di boost mostra che il costruttore predefinito per un time_facet è semplicemente time_facet().

Qui di seguito è una versione semplice di quello che ho provato:

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/posix_time/posix_time_io.hpp> 

boost::posix_time::ptime time = boost::posix_time::time_from_string("1981-08-20 08:05:00"); 
std::stringstream sstream; 
sstream << time; 
_updateStatement->setString(1, (sql::SQLString)sstream.str()); 

L'inserimento del tempo in stringstream mi dà un sacco di errori di compilazione in vena di

error C2220: warning treated as error - no 'object' file generated C:\code\trunk\Development\External\boost\include\boost/date_time/time_facet.hpp(247) :while compiling class template member function 'boost::date_time::time_facet<time_type,CharT>::time_facet(size_t)' 
      with 
      [ 
       time_type=boost::posix_time::ptime, 
       CharT=char 
      ] 

nonostante il fatto che non ho usato alcun oggetto time_facet.

Quando cerco di fare questo con un oggetto time_facet, aggiungo in

sstream.imbue(std::locale(sstream.getloc(), new boost::date_time::time_facet("%Y-%m-%d %H:%M:%S"))); 

prima di inserire l'ora nel stringstream. Gli errori per questo sono che vuole un elenco di argomenti come menzionato all'inizio di questo post.

C'è forse una funzione in boost che è il contrario di boost :: posix_time :: time_from_string()? In caso contrario, qualsiasi altro aiuto sarebbe apprezzato. Grazie.

risposta

18

La biblioteca Boost.Date_Time fornisce le seguenti ptime to std::string conversions all'interno del namespace boost::posix_time:

  • std::string to_simple_string(ptime) restituisce una stringa in forma di formato YYYY-mmm-DD HH:MM:SS.fffffffff dove mmm è il nome di tre caratteri mese.
  • std::string to_iso_string(ptime) restituisce una stringa sotto forma di YYYYMMDDTHHMMSS,fffffffff dove T è il separatore di data e ora.
  • std::string to_iso_extended_string(ptime) restituisce una stringa nel formato YYYY-MM-DDTHH:MM:SS,fffffffff dove T è il separatore di data e ora.

Inoltre, l'inserimento e l'estrazione flusso operators sono forniti, permettendo ptime da inserire o estratta da un flusso. I formati di input e output possono essere personalizzati costruendo sfaccettature con vari format flags e quindi impregnando il flusso con il facet.

In base all'errore di compilazione (C2220), il compilatore è impostato per considerare tutti gli avvisi come errori. In alcuni casi, le librerie Boost si compilano con gli avvisi. Valutare la gravità dell'avviso effettivo e gestirlo appropriatamente da lì. Ad esempio, se l'avviso è banale, potrebbe essere accettabile utilizzare warning pragma per disabilitare o eliminare l'avviso specifico.


Qui è un complete example dimostrando conversione ptime una stringa tramite le sue funzioni di conversione forniti e operatori streaming.

#include <iostream> 
#include <locale> 
#include <string> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/posix_time/posix_time_io.hpp> 

int main() 
{ 
    const boost::posix_time::ptime time = 
     boost::posix_time::time_from_string("1981-08-20 08:05:00"); 

    // ptime to string. 
    const std::string str_time = to_simple_string(time); 
    std::cout << str_time << std::endl; 

    // ptime to stringstream to string. 
    std::stringstream stream; 
    stream << time; 
    std::cout << stream.str() << std::endl; 
    stream.str(""); 

    // Use a facet to display time in a custom format (only hour and minutes). 
    boost::posix_time::time_facet* facet = new boost::posix_time::time_facet(); 
    facet->format("%H:%M"); 
    stream.imbue(std::locale(std::locale::classic(), facet)); 
    stream << time; 
    std::cout << stream.str() << std::endl; 
} 

che produce il seguente output:

1981-Aug-20 08:05:00  
1981-Aug-20 08:05:00  
08:05 
+0

Sì, il nostro progetto è impostato a considerare tutte le avvertenze come errori. Mentre non sono ancora sicuro del motivo per cui inserire il tempo in uno stream e perché la creazione di time_facets non funziona nel mio progetto (a meno che questi non diano sempre degli avvertimenti), le funzioni di conversione del tempo in stringa sembrano fare il trucco per me. Grazie mille! – user3517209

+0

C'è un modo per aggiungere una "Z" alla fine del tempo? Ho provato "% Y-% m-% dT% H% M% SZ", ma sto ottenendo solo "AAAA-mm-ggTHH: MM: SS" e nessuna Z alla fine – sop

6

mio utilizzo utilizzando rilasciare 1,55

#include <iostream> 
#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; 

    std::stringstream sstream; 

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

    sstream << dayte << std::endl; 
    sstream << dayte.year() << "/" << dayte.month().as_number() 
    << "/" << dayte.day() << std::endl; 
    sstream << now << std::endl; 
    sstream << td << std::endl; 
    sstream << td.hours() << "/" << td.minutes() << "/" << td.seconds() 
    << "/" << td.fractional_seconds() << std::endl; 

    std::cout << sstream.str(); 
} 

Risultati:

2015-Oct-27 
2015/10/27 
2015-Oct-27 14:25:18.614684 
14:25:18.614684 
14/25/18/614684 
2015-Oct-27 
2015/10/27 
2015-Oct-27 14:25:18.614684 
14:25:18.614684 
Problemi correlati