strano comportamento di mktime ()
Domanda
il mio tentativo di creare una classe DateTime , sto cercando di memorizzare il tempo di "epoca" nella mia funzione:
void DateTime::processComponents(int month, int day, int year,
int hour, int minute, int second) {
struct tm time;
time.tm_hour = hour;
time.tm_min = minute;
time.tm_sec = second;
time.tm_mday = day;
time.tm_mon = month;
time.tm_year = year - 1900;
ticks_ = mktime(&time);
processTm(time);
}
void DateTime::processTm(struct tm time) {
second_ = time.tm_sec;
minute_ = time.tm_min;
hour_ = time.tm_hour;
weekday_ = time.tm_wday;
monthday_ = time.tm_mday;
yearday_ = time.tm_yday;
month_ = time.tm_mon;
year_ = time.tm_year + 1900;
}
Per una data arbitraria, processComponents(5,5,1990,1,23,45)
(6 Giu 1990 01:23:45), imposta tutti i valori in modo corretto e come previsto.
Tuttavia, dopo ulteriori test, trovo che per processComponents(0,0,1970,0,0,0)
(1 gennaio 1970, 00:00:00), fa sì che mktime(&time)
time
essere avvitato:
time.tm_mon = 11;
time.tm_mday = 30;
time.tm_year = 69;
time.tm_hour = 23;
time.tm_min = 0;
time.tm_sec = 0;
time.tm_isdst = 0;
time.tm_gmtoff = -18000;
time.tm_zone = "EST";
time.tm_wday = 2;
time.tm_yday = 363;
Tradurre per una data del 31 dicembre 1969 11:00:00.
è possibile verificare che mktime()
è responsabile, perché commentando quella linea, riporta la data e l'ora correttamente come 1 Gennaio 1970 00:00:00.
Perché mktime()
solo rovinare l'epoca? E come dovrei risolvere / soluzione questo?
Grazie!
Soluzione
Si sta passando 0 come il parametro day
e la messa che in time.tm_mday
. Tale componente (e solo quella componente) di struct tm
è 1-based, non 0-based.
Non chiedetemi perché.
Per specificare 1 gennaio 1970, 12:00:00 AM che ci si vuole chiamarlo in questo modo:
processComponents(0,1,1970,0,0,0);
E come sdtom menzionati, si vuole fare in modo che tm_isdst
è impostato in modo appropriato -. 0 per non aver in effetti, positivi per in effetti, e negativo per non si sa (nel qual caso mktime()
dovrebbe cercare di indovinare)
Solo per farvi sapere, quando passo la data che avete (0 Gennaio 1970, 00:00:00) per mktime()
in MSVC 9 restituisce un errore (il passato in struct tm
è intatta e il valore restituito è time_t
- 1).
Altri suggerimenti
Dal momento che è off di ora mi aspetto l'ora legale. È il valore di time.tm_isdst PREPARATIVI da qualche parte? Se non si imposta esso, potrebbe essere in modo casuale sempre impostato su 1 o 0 che influenzare i risultati.
Passando tutti gli zeri per mktime()
viene interpretato come "Sun Jan 0 00:00:00 1900". Sulla base di questo, ci deve essere qualche aggiustamento ...
// the input is local time
// the output is seconds since the epoch
// The epoch is Jan 1, 1970 @ 0:00 GMT
time_t mktime_wrapper( int month, int day, int year,
int hour=0, int min=0, int sec=0, bool isDST=-1
)
{
tm t;
t.tm_sec=sec, t.tm_min=min, t.tm_hour=hour, t.tm_isdst=isDST;
t.tm_mday=day, t.tm_mon=month-1, t.tm_year=year-1900;
return mktime( &t );
}