2009-06-15 20 views
22
time_t seconds; 
time(&seconds); 

cout << seconds << endl; 

Esto me da una marca de tiempo. ¿Cómo puedo poner esa fecha de época en una cadena?Representación de cadena de time_t?

std::string s = seconds; 

no funciona

Respuesta

33

Trate std::stringstream.

#include <string> 
#include <sstream> 

std::stringstream ss; 
ss << seconds; 
std::string ts = ss.str(); 

Una buena envoltura alrededor de la técnica anterior es de lexical_cast Boost:

#include <boost/lexical_cast.hpp> 
#include <string> 

std::string ts = boost::lexical_cast<std::string>(seconds); 

Y para este tipo de preguntas, soy aficionado a la vinculación de The String Formatters of Manor Farm por Herb Sutter.

UPDATE:

Con C++ 11, utilice to_string().

1

El estándar C++ no tiene ninguna función de fecha/hora. Necesita usar el C localtime y funciones relacionadas.

+6

Su pregunta original preguntó cómo para obtener una cita, pero resulta que lo que realmente quería era la cantidad de segundos como una cadena. Ayuda a ser preciso. –

20

Pruebe esto si usted quiere tener el tiempo en una cadena legible:

#include <ctime> 

std::time_t now = std::time(NULL); 
std::tm * ptm = std::localtime(&now); 
char buffer[32]; 
// Format: Mo, 15.06.2009 20:20:00 
std::strftime(buffer, 32, "%a, %d.%m.%Y %H:%M:%S", ptm); 

Para mayor referencia de strftime() Salida cppreference.com

+0

nulldevice, no estaba claro anteriormente, pero quería una representación de cadena de la fecha de época (indicación de fecha y hora). – g33kz0r

1

la "ctime()" función convertirá una vez a una cadena. Si desea controlar la forma en que está impreso, use "strftime". Sin embargo, strftime() toma un argumento de "struct tm". Utilice "localtime()" para convertir el entero time_t de 32 bits en una struct tm.

0

Hay muchas formas en que puede querer formatear el tiempo (dependiendo de la zona horaria, cómo quiere mostrarlo, etc.), por lo que no puede convertir implícitamente un time_t en una cadena.

La manera C es usar ctime o usar strftime más localtime o gmtime.

Si desea una forma más similar a C++ de realizar la conversión, puede investigar la biblioteca Boost.DateTime.

+0

Actualizado. Gracias. –

2

La manera de C++ es usar stringstream.

El C manera es utilizar snprintf() para formatear el número:

char buf[16]; 
snprintf(buf, 16, "%lu", time(NULL)); 
+1

time_t no es necesariamente sin signo o del mismo tamaño que un largo. De hecho, generalmente está firmado: http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to – nitzanms

3

La respuesta aquí arriba no funciona para mí.

Ver los siguientes ejemplos que demuestran tanto la stringstream y respuestas lexical_cast como se sugiere:

#include <iostream> 
#include <sstream> 

int main(int argc, char** argv){ 
const char *time_details = "2017-01-27 06:35:12"; 
    struct tm tm; 
    strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm); 
    time_t t = mktime(&tm); 
    std::stringstream stream; 
    stream << t; 
    std::cout << t << "/" << stream.str() << std::endl; 
} 

de salida: 1485498912/1485498912 Encontrado here


#include <boost/lexical_cast.hpp> 
#include <string> 

int main(){ 
    const char *time_details = "2017-01-27 06:35:12"; 
    struct tm tm; 
    strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm); 
    time_t t = mktime(&tm); 
    std::string ts = boost::lexical_cast<std::string>(t); 
    std::cout << t << "/" << ts << std::endl; 
    return 0; 
} 

de salida: 1485498912/1485498912 Encontrado : here


La segunda solución de más alto rating funciona localmente:

#include <iostream> 
#include <string> 
#include <ctime> 

int main(){ 
    const char *time_details = "2017-01-27 06:35:12"; 
    struct tm tm; 
    strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm); 
    time_t t = mktime(&tm); 

    std::tm * ptm = std::localtime(&t); 
    char buffer[32]; 
    std::strftime(buffer, 32, "%Y-%m-%d %H:%M:%S", ptm); 
    std::cout << t << "/" << buffer; 
} 

Salida: 1485498912/27/01/2017 06:35:12 Encontrado: here


Cuestiones relacionadas