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!

È stato utile?

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 );
   }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top