2010-03-10 6 views
7

Ciao a tutti. Ho continuato a imparare C++ e sono stato impostato come la "sfida" di convertire i secondi in formati come Giorni, minuti e secondi.Converti secondi in giorni, minuti e secondi

Ad esempio: 31600000 = 365 giorni, 46 minuti, 40 secondi.

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; 

Funziona e si presenta con la risposta corretta, ma dopo averlo completato ho guardato come altre persone avevano affrontato e loro era diverso. Mi chiedo se mi manchi qualcosa.

Grazie, Dan.

+1

Com'è stato? – Mark

+0

giorni = tempo/86400 ore = (tempo/3600) - (giorni * 24) minutes = (tempo/60) - (giorni * 1440) - (* ore 60) secondi = tempo mod 60 Grazie. – Dan

risposta

5

Una delle cose della programmazione è che non c'è mai un solo modo di fare qualcosa. In effetti, se dovessi pensare a ciò, potrei riuscire a trovare una dozzina di modi completamente diversi per raggiungere questo obiettivo. Non ti manca nulla se il tuo codice soddisfa i requisiti.

Per il vostro divertimento, ecco un modo per formattare fino ore: minuti: secondi sotto Windows (elapsed è un doppio & rappresenta il numero di secondi trascorsi dal ... qualcosa)

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

Ad esempio: 31600000 = 365 giorni, 46 minuti, 40 secondi.

Davvero?

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

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

Forse intendevi "convertire l'input in giorni, ore, minuti e secondi, e poi scarta le ore" o "convertire l'input in giorni, i minuti totali in un giorno (cioè possono essere più di 60) e secondi "?

Nel secondo caso penso che si dovrebbe sostituire l'istruzioni per i minuti con

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

Sì, intendevo scartare le ore, ma grazie per la risposta. – Dan

8

questo mi sembra essere il modo più semplice per convertire secondi in 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; 

Spero che aiuti!

saluti,

Stoycho

+0

sei sicuro? Con il tuo codice ottengo che 1641 secondi equivalgono a giorni = 0 ore = 1 minuti = 27 secondi = 21, il che mi sembra molto improbabile (un'ora in più) – Wim

+0

Sì, hai ragione Wim. Devi usare gmtime invece di localtime quando converti in tempo di interruzione. Forse sei in un fuso orario UTC +01: 00 (ad esempio, CET), da cui proviene la differenza di un'ora. – stoycho

+0

ah, non pensavo a quello, grazie mille :-) ma attualmente sto usando la risposta di John Dibling (vedi sopra): int hours = floor (totalseconds/3600.0); minuti int minuti = piano (fmod (totalseconds, 3600.0) /60.0); int secondi = fmod (totalseconds, 60.0); human_readable.sprintf ("% 01du% 02dm% 02ds", ore, minuti, secondi); – Wim

3

credo sia la sfida dal libro di Stephen Prata. L'ho fatto come segue:

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