2015-03-05 9 views
5

ho il seguente codice:Converti struct tm per time_t

struct tm time; 

strptime("27052010", "%d%m%Y", &time); 

cout << "sec: " << time.tm_sec << "\n"; 
cout << "min: " << time.tm_min << "\n"; 
cout << "hour: " << time.tm_hour << "\n"; 
cout << "day: " << time.tm_mday << "\n"; 
cout << "month: " << (time.tm_mon + 1) << "\n"; 
cout << "year: " << time.tm_year << "\n"; 

time_t t = mktime(&time); 

cout << "sec: " << time.tm_sec << "\n"; 
cout << "min: " << time.tm_min << "\n"; 
cout << "hour: " << time.tm_hour << "\n"; 
cout << "day: " << time.tm_mday << "\n"; 
cout << "month: " << (time.tm_mon + 1) << "\n"; 
cout << "year: " << time.tm_year << "\n"; 

cout << "time: " << t << "\n"; 

L'output è:

sec: 1474116832 
min: 32767 
hour: 4238231 
day: 27 
month: 5 
year: 110 

sec: 52 
min: 0 
hour: 6 
day: 2 
month: 9 
year: 640 
time: 18008625652 (Fri, 02 Sep 2540 04:00:52 GMT) 

mia domanda è perché fa mktime() modificare i valori di time e perché è il convertito time_t non uguale alla mia data di inserimento. Mi aspetto che l'output sia la data espressa in secondi dal 1970 (27.05.2010 = 1330905600).

Grazie in anticipo

+2

Quali erano i valori di 'time.tm_hour',' time.tm_min' e 'time.tm_sec' prima della chiamata a' mktime'? – Wintermute

+0

@Wintermute Ho aggiunto le informazioni. – aQuip

+3

Err ... hai preso una struttura non inizializzata, inizializzato tre dei suoi molti campi, poi "convertito" (tre valori significativi più un sacco di spazzatura), poi leggi i campi indietro e ti chiedi perché stai ricevendo la maggior parte dei rifiuti? ;-) GIGO, davvero. – DevSolar

risposta

6

mktime normalizza tutti i suoi argomenti prima della conversione in un time_t. Hai valori enormi per ora, minuto e secondo, quindi quelli sono tutti convertiti in un numero adeguato di giorni, spingendo il valore lontano nel futuro.

Prima di chiamare mktime è necessario azzerare gli altri attributi importanti (inclusi ora/minuto/secondo) di tm. Come indicato in un commento, inizializzalo a zero: tm time = {0}; (taggato C++ quindi non è necessario il numero iniziale struct). Si noti inoltre che potrebbe essere necessario impostare tm_isdst su -1 in modo che tenti di determinare il valore dell'ora legale anziché assumere l'ora legale (se inizializzato a zero).

+0

C'è un modo più intelligente di impostare manualmente tutti i valori due zero? Scusa, non ho molta familiarità con C. – aQuip

+0

L'ho gestito da solo. Tuttavia grazie molte. – aQuip

+0

"zero ore/minuti/secondi" è insufficiente. Tutti i campi, si aspetta 'tm_yday, tm_wday', devono essere inizializzati includendo' tm_isdst' e altri potenziali e il set totale di campi non è definito, quindi "assegnazione semplice a quegli attributi". potrebbe non inizializzare tutti i campi a meno che il codice non sappia cosa sono tutti. – chux