2011-02-16 18 views

Respuesta

25

Por lo que vale, aquí es la función que escribí para hacer esto:

#include "boost/date_time/posix_time/posix_time.hpp" 
#include <iostream> 
#include <sstream> 

std::wstring FormatTime(boost::posix_time::ptime now) 
{ 
    using namespace boost::posix_time; 
    static std::locale loc(std::wcout.getloc(), 
         new wtime_facet(L"%Y%m%d_%H%M%S")); 

    std::basic_stringstream<wchar_t> wss; 
    wss.imbue(loc); 
    wss << now; 
    return wss.str(); 
} 

int main() { 
    using namespace boost::posix_time; 
    ptime now = second_clock::universal_time(); 

    std::wstring ws(FormatTime(now)); 
    std::wcout << ws << std::endl; 
    sleep(2); 
    now = second_clock::universal_time(); 
    ws = FormatTime(now); 
    std::wcout << ws << std::endl; 

} 

La salida de este programa era:

20111130_142732 
20111130_142734 

He encontrado estos enlaces útiles:

+0

Estoy probando esto ahora - podría ser el wstringstream necesita un wtime_facet y ahí es donde se fallando en silencio para mí. – mackenir

+1

Eso funcionaría, pero tenga en cuenta si va a utilizar el mismo formato para varias fechas, no cree la faceta cada vez, pero créela una vez y luego úsela varias veces. El imbue en sí no es costoso. – CashCow

+1

Tenga en cuenta que lo haría almacenando el objeto de configuración regional. – CashCow

2
// create your date 
boost::gregorian::date d(2009, 1, 7); 

// create your formatting 
boost::gregorian::date_facet *df = new boost::gregorian::date_facet("%Y%m%d_%H%M%S"); 

// set your formatting 
ostringstream is; 
is.imbue(std::locale(is.getloc(), df)); 
is << d << endl; 

// get string 
cout << "output :" << is.str() << endl; 
+2

Chicos, en serio. En C# puedo escribir DateTime.Now.ToString ("aaaa-MM-dd HH: mm: ss") ¡y eso es todo! ¿Qué diablos está mal con C++ en estos días? – romanz

+0

Parecías mi sobrino en la escuela secundaria :) Estoy seguro de que la función que mencionaste hace algo muy similar a lo que he codificado anteriormente. Si quieres una mejor interfaz de usuario, entonces tienes que construir una capa de abstracción sobre el impulso. El impulso está diseñado para ser flexible. Eche un vistazo a las bibliotecas Poco C++. Tienen una interfaz de estilo Java muy agradable que hace que sea muy fácil de codificar. Entonces el problema no es sobre C++ :) –

Cuestiones relacionadas