2011-07-14 11 views
6

Estoy intentando imprimir un impulso :: posix_time :: ptime en el formato "AAAA-MM-DD hh: mm: ss.fff" donde el MM es un mes de 2 dígitos y tiene un dígito de 3 dígitos milisegundo. Un ejemplo es: 2011- -14 22:38:40. .¿Cómo cambiar el aumento de C++ posix_time :: la resolución de ptime a milisegundos?

Estoy usando Boost 1.33.1.

me trataron a llamar a la API "ptime :: to_simple_string()", pero no cumple con mis necesidades: este método imprime el ptime en un formato de "HH-MMM-AAAA DD: MM: SS. ffffff "donde el" MMM "es un nombre de mes de 3 caracteres, como" Jan ", y" ffffff "es un microsegundo de 6 dígitos. Esto no es lo que quiero.

Luego probé utilizar lo 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; 

pero me dio una salida como "2011-07-14 22: 38: 40.123000". Esto NO es lo que quiero, tampoco.

Parece que el ptime utiliza el microsegundo como resolución de tiempo de forma predeterminada. Pero solo necesito una resolución de milisegundos. Después de estudiar Creo que podría haber dos métodos para resolver este problema:

1). De alguna manera puedo cambiar la resolución de tiempo de la ptime para usar milisegundos. He encontrado algunas clases de enumeración y plantillas relacionadas con la resolución temporal, pero no sé cómo usarlas.

2). De alguna manera puedo cambiar el formato de mi faceta del tiempo para imprimir solo milisegundos. Pero la documentación oficial parece decir "% F" y "% f" usan una resolución de microsegundos.

¡Tiendo a preferir la primera solución pero necesito ayuda! ¿Cómo puedo obtener una cadena de tiempo en el formato que deseo?

PS:

1). Aunque intenté buscar una pregunta similar en este sitio web, no encontré ninguna. Si lo sabes, por favor dime.

2). La documentación de Boost 1.33.1 Fecha y hora (http://www.boost.org/doc/libs/1_33_1/doc/html/date_time.html) es la única referencia que he estado leyendo.


Actualización sobre 07/15/2011:

Después de un estudio adicional, mi conclusión es la siguiente:

1). Es posible cambiar la resolución de tiempo a milisegundos, por lo que el uso de "% f" en un time_facet se imprimirá solo en milisegundos, en lugar de los microsegundos predeterminados. Sin embargo, parece que necesita definir un conjunto completo de sus propias clases, incluidas sus_time_res_traits, your_time_duration, your_time_system_config, your_time_system y your_time. Esto es definitivamente demasiado complicado para mi problema.

2). Por lo tanto, tomaría la sugerencia de Mark (ver más abajo) para simplemente eliminar los últimos 3 caracteres después de convertir un tiempo de resolución de microsegundos en una cadena.

+0

Por curiosidad, ¿por qué estás utilizando una versión casi 6 años de Boost? – ildjarn

+0

@ildjarn: Ah, porque la versión 1.33.1 ya está en mi mano, así que no quiero molestarme en actualizar a la última versión ahora mismo. Eso me recuerda: ¿Hay alguna buena solución en el último Boost para resolver mi problema? Hm ... Iré y echaré un vistazo al documento ... – yaobin

+0

Las versiones actuales de Boost.DateTime tienen una resolución de microsegundos por defecto, que debería más que satisfacer tus necesidades. Pero en realidad, 6 años es ** antiguo ** en términos de C++ - actualización. – ildjarn

Respuesta

5

La solución simple y pragmática sería usar %f y siempre quitar los últimos 3 caracteres del resultado.

+0

Sí, pensé en esto antes :) Pero creo que debería haber una mejor manera de generar directamente un ptime en el formato que necesito. Esperaré aquí y continuaré buscando en la documentación. – yaobin

+1

@rob, definir "mejor". Parece que hay una manera de escribir su propia función de conversión de salida, pero parece exagerado para un problema tan simple. –

+0

De acuerdo. Después de algunas investigaciones adicionales, creo que la forma de "strip" debería ser la más fácil :) – 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, Esta respuesta no da ninguna solución .... dará salida microsegundos .... no milisegundos. – Gabor

0

Esto truncará los segundos fraccionarios.

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

Resultados

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

01:02:07:567 
Cuestiones relacionadas