2010-03-10 113 views
7

Hola a todos. Continúo aprendiendo C++ y me he propuesto el 'desafío' de convertir segundos para formatear como Días, Minutos y Segundos.Convertir segundos a días, minutos y segundos

Por ejemplo: 31600000 = 365 días, 46 minutos, 40 segundos.

using namespace std; 
const int hours_in_day = 24; 
const int mins_in_hour = 60; 
const int secs_to_min = 60; 

long input_seconds; 
cin >> input_seconds; 

long seconds = input_seconds % secs_to_min; 
long minutes = input_seconds/secs_to_min % mins_in_hour; 
long days = input_seconds/secs_to_min/mins_in_hour/hours_in_day; 

cout << input_seconds << " seconds = " 
    << days << " days, " 
    << minutes << " minutes, " 
    << seconds << " seconds "; 

return 0; 

Funciona y se le ocurre la respuesta correcta, pero después de completarlo me miraba cómo otras personas habían abordado y el suyo era diferente. Me pregunto si me estoy perdiendo algo.

Gracias, Dan.

+1

¿Cómo fue diferente? – Mark

+0

días = tiempo/86400 hora = (tiempo/3600) - (día * 24) minutos = (tiempo/60) - (Días * 1440) - (hora * 60) segundos = tiempo MOD 60 Gracias. – Dan

Respuesta

5

Una de las cosas sobre la programación es que nunca hay una sola forma de hacer algo. De hecho, si tuviera que pensar en ello, podría encontrar una docena de formas completamente diferentes de lograr esto. No te falta nada si tu código cumple con los requisitos.

Para su diversión, aquí es una manera de dar formato a horas: minutos: segundos bajo Windows (elapsed es un doble & representa el número de segundos transcurridos desde algo ...)

sprintf_s<bufSize>(buf, "%01.0f:%02.0f:%02.2f", floor(elapsed/3600.0), floor(fmod(elapsed,3600.0)/60.0), fmod(elapsed,60.0)); 
1

Por ejemplo: 31600000 = 365 días, 46 minutos, 40 segundos.

¿Realmente?

$ bc 
365*24*60*60 + 46*60 + 40 
31538800 

365*24*60*60 + 1066*60 + 40 
31600000 

¿Se refiere a "convertir la entrada en días, horas, minutos y segundos, y luego desechar las horas" o "convertir la entrada en día, el total de minutos dentro de un día (es decir, puede ser más de 60) y segundos?

En el segundo caso, creo que se debe reemplazar la instrucción de minutos con

long minutes = input_seconds/secs_to_min % (mins_in_hour * hours_in_day); 
+0

Sí, quise descartar las horas, pero gracias por la respuesta. – Dan

8

esto me parece ser la forma más fácil de convertir segundos en DD/hh/mm/ss:

#include <time.h> 
#include <iostream> 
using namespace std;  

time_t seconds(1641); // you have to convert your input_seconds into time_t 
tm *p = gmtime(&seconds); // convert to broken down time 

cout << "days = " << p->tm_yday << endl; 
cout << "hours = " << p->tm_hour << endl; 
cout << "minutes = " << p->tm_min << endl; 
cout << "seconds = " << p->tm_sec << endl; 

¡Espero que ayude!

Saludos,

Stoycho

+0

¿estás seguro? Con su código, entiendo que 1641 segundos son iguales a days = 0 hours = 1 minutes = 27 seconds = 21, lo que me parece poco probable (una hora más) – Wim

+0

Sí, tiene razón Wim. Debe usar gmtime en lugar de localtime al convertir a tiempo descompuesto. Tal vez se encuentre en una zona horaria UTC +01: 00 (por ejemplo, CET), de donde proviene la diferencia de una hora. – stoycho

+0

ah, no pensé en eso, muchas gracias :-) pero actualmente estoy usando la respuesta de John Dibling (ver arriba): int hours = floor (totalseconds/3600.0); int minutes = floor (fmod (totalseconds, 3600.0) /60.0); int seconds = fmod (totalseconds, 60.0); human_readable.sprintf ("% 01du% 02dm% 02ds", horas, minutos, segundos); – Wim

3

creo que es el reto del libro de Stephen Prata. Lo hice de la siguiente manera:

#include <iostream> 

using namespace std; 

int main() 
{ 
    long input_seconds = 31600000; 

    const int cseconds_in_day = 86400; 
    const int cseconds_in_hour = 3600; 
    const int cseconds_in_minute = 60; 
    const int cseconds = 1; 

    long long days = input_seconds/cseconds_in_day; 
    long hours = (input_seconds % cseconds_in_day)/cseconds_in_hour; 
    long minutes = ((input_seconds % cseconds_in_day) % cseconds_in_hour)/cseconds_in_minute; 
    long seconds = (((input_seconds % cseconds_in_day) % cseconds_in_hour) % cseconds_in_minute)/cseconds; 
    cout << input_seconds << " seconds is " << days << " days, " << hours << " hours, " << minutes << " minutes, and " << seconds << " seconds."; 

    cin.get(); 
    return 0; 
} 
Cuestiones relacionadas