2012-06-26 11 views
23

Tengo una variable de cadena que contiene el tiempo en hh: mm: formato ss. ¿Cómo convertirlo en time_t type? por ejemplo: string time_details = "16:35:12"Cómo convertir una variable de cadena que contiene time to time_t escriba C++?

Además, ¿cómo comparar dos variables que contienen tiempo para decidir cuál es la más temprana? por ejemplo: curr_time cadena = "18:35:21" cadena user_time = "22:45:31"

+2

Tenga en cuenta que time_t codifica el número de segundos desde la medianoche del 1 de enero de 1970, tenga cuidado al usarlo para codificar jus el tiempo sin la fecha. –

Respuesta

37

Puede utilizar strptime(3) para analizar el tiempo, y luego mktime(3) para convertirlo en un time_t:

const char *time_details = "16:35:12"; 
struct tm tm; 
strptime(time_details, "%H:%M:%S", &tm); 
time_t t = mktime(&tm); // t is now your desired time_t 
+0

'strptime' es específico de Linux, creo. –

+3

@KyleStrand: es parte de POSIX.1-2001 (y también SUSv2). Tienes razón en que no es C o C++ estándar, pero es más que solo Linux. –

+0

Gracias. Debería haber pensado en verificar eso. –

11

Esto debería funcionar:

int hh, mm, ss; 
struct tm when = {0}; 

sscanf_s(date, "%d:%d:%d", &hh, &mm, &ss); 


when.tm_hour = hh; 
when.tm_min = mm; 
when.tm_sec = ss; 

time_t converted; 
converted = mktime(&when); 

Modificar según sea necesario.

+0

Tenga en cuenta que 'sscanf_s' no es la forma de C++ para manejar esto, es la forma C (aunque en este caso funcionará y es razonablemente seguro, por lo que no hay voto negativo). Usar 'std :: stringstream' y' >> 'sería más idiomático C++. – ssube

+0

@peachykeen sí, eso es correcto. Si publica la versión en C++, votaré de vuelta :) –

+3

Este código puede obtener tiempo, pero ¿qué tal ** fecha ** (aaaa-MM-dd)? –

34

con C++ 11 ahora se puede hacer

struct std::tm tm; 
std::istringstream ss("16:35:12"); 
ss >> std::get_time(&tm, "%H:%M:%S"); // or just %T in this case 
std::time_t time = mktime(&tm); 

ver std::get_time y strftime para referencia

+1

Creo que vale la pena mencionar que std :: get_time ** está disponible en GCC desde la versión 5 **, necesita entonces '#include ' – MBI

+1

¿no debería tomar mktime & tm? – bkarj

+0

'std :: get_time' también tiene algunos errores en VS2013, p. aquí http://stackoverflow.com/questions/32019209/is-this-a-bug-in-stdget-time y aquí http://stackoverflow.com/questions/35041344/trying-to-use-stdget-time- parse-yymmdd-and-failing –

Cuestiones relacionadas