2015-03-05 16 views
5

Mam następujący kod:Konwersja struct tm do 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"; 

wyjście jest:

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) 

Moje pytanie brzmi dlaczego mktime() zmienić wartości time i dlaczego jest przerobiona time_t nie równa się mojej daty wprowadzenia. Spodziewam się, że dane wyjściowe to data wyrażona w sekundach od 1970 (27.05.2010 = 1330905600).

góry dzięki

+2

Jakie były wartości 'time.tm_hour',' time.tm_min' i 'time.tm_sec' przed wywołaniem' mktime'? – Wintermute

+0

@Wintermute Dodałem informacje. – aQuip

+3

Err ... wziąłeś niezainicjowaną strukturę, zainicjowałeś trzy z wielu pól, następnie "przekonwertowałeś" (trzy znaczące wartości plus dużo śmieci), a następnie odczytałeś pola i zastanawiasz się, dlaczego dostajesz głównie śmieci? ;-) GIGO, naprawdę. – DevSolar

Odpowiedz

6

mktime normalizuje wszystkie swoje argumenty przed konwersją do time_t. Masz ogromne wartości godzin, minut i sekund, więc wszystkie są konwertowane na odpowiednią liczbę dni, przesuwając wartość daleko w przyszłość.

Musisz wyzerować inne ważne atrybuty (w tym godzinę/minutę/sekundę) tm przed wywołaniem mktime. Jak wspomniano w komentarzu, po prostu zainicjuj go na zero: tm time = {0}; (oznaczone C++, więc wiodący struct nie jest potrzebny). Dalej, możesz chcieć ustawić tm_isdst na -1, aby próbował określić wartość czasu letniego zamiast zakładać, że nie DST (jeśli zostanie zainicjowany do zera).

+0

Czy istnieje inteligentniejszy sposób niż ręczne ustawienie wszystkich wartości na zero? Przepraszam, nie znam się na C. – aQuip

+0

Zarządzałem sam. Mimo to bardzo dziękuję. – aQuip

+0

"Wyzeruj godzinę/minutę/sekundę" jest niewystarczające. Wszystkie pola, oczekujące 'tm_yday, tm_wday', muszą być inicjowane, włączając' tm_isdst' i potencjalne inne, a całkowity zbiór pól nie jest zdefiniowany, stąd "proste przyporządkowanie do tych atrybutów." nie może zainicjować wszystkich pól, chyba że kod wie, czym one wszystkie są. – chux

Powiązane problemy