2012-04-23 31 views
11

Digamos que tengo estructura time_t y tm. No puedo usar Boost, pero MFC. ¿Cómo puedo hacer que sea una cadena como la siguiente?Cómo formatear la cadena de fecha y hora en C++

Mon Apr 23 17:48:14 2012 

¿Está usando sprintf de la única manera?

+2

[Boost.DateTime] (http://www.boost.org/libs/date_time) ha formateado las instalaciones de E/S. – ildjarn

+0

Con una o dos frases más, podría ser una (¿?) Respuesta, @ildjarn – Jasper

+2

@Jasper: mientras uso la biblioteca, encuentro que recomendarla a otras personas es difícil porque la documentación es tan horrible. Acabo de dejar un comentario para que OP pueda buscarlo por sí mismo si así lo desean (por ejemplo, hay muchas respuestas de SO que demuestran exactamente esto, como [este]] (http://stackoverflow.com/a/5697577/636019)) – ildjarn

Respuesta

27

La biblioteca C incluye strftime específicamente para formatear fechas/horas. El formato que está pidiendo parece corresponder a algo como esto:

char buffer[256]; 

strftime(buffer, sizeof(buffer), "%a %b %d %H:%M:%S %Y", &your_tm); 

creo std::put_time utiliza una cadena de formato similar, aunque se le exime de tener que tratar explícitamente con una memoria intermedia. Si desea escribir el resultado en una corriente, es muy conveniente, pero conseguirlo en una cadena que no es de mucha ayuda - que tendría que hacer algo como:

std::stringstream buffer; 

buffer << std::put_time(&your_tm, "%a %b %d %H:%M:%S %Y"); 

// now the result is in `buffer.str()`. 

std::put_time es una novedad de C++ 11, pero C++ 03 tiene una faceta time_put en una configuración regional que puede hacer lo mismo. Si la memoria sirve, logré que funcionara una vez, pero después de eso decidí que no valía la pena, y no lo he hecho desde entonces.

+0

Solo quería señalar que gcc aún carece de soporte para put_time:/ –

7

Lo intentaría std::put_time. Consulte el link here para obtener información sobre cómo usarlo. Es compatible con cadenas de formato completo y tal.

+5

Vale la pena señalar que esta solución es solo C++ 11. – ildjarn

+2

Todavía no implementado (gcc 4.8.1). – Avio

1

MFC tiene COleDateTime que tiene un contructor que toma time_t (o __time64_t) y tiene un método Format.

1

ctime() produce cadenas en ese formato. Toma un puntero a time_t.
También hay asctime() que toma un puntero a struct tm y hace lo mismo.

+0

'ctime (& curtime)', donde time_t curtime; referencia: http://www.tutorialspoint.com/c_standard_library/c_function_ctime.htm – parasrish

2
CTime obj1(time_tObj); 

CString s = obj1.Format("%a %b %d %H:%M:%S %Y"); 
1

Si tiene que preocuparse por formatear en diferentes lugares, no olvide inicializar el CRT con la configuración regional actual. Esto también afecta a COleDateTime.

setlocale(LC_COLLATE,“.OCP”); // sets the sort order 

setlocale(LC_MONETARY, “.OCP”); // sets the currency formatting rules 

setlocale(LC_NUMERIC, “.OCP”); // sets the formatting of numerals 

setlocale(LC_TIME, “.OCP”); // defines the date/time formatting 

Consulte la publicación de mi blog que relaciona los artículos de MSDN y otras fuentes. http://gilesey.wordpress.com/2012/12/30/initailizing-mfccrt-for-consumption-of-regional-settings-internationalizationc

Cuestiones relacionadas