Question

Continuer ma tentative de créer une classe DateTime , J'essaie de stocker le temps "l'époque" dans ma fonction:

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

Pour une date arbitraire, processComponents(5,5,1990,1,23,45) (6 juin 1990 1:23:45 AM), il définit toutes les valeurs correctement et comme prévu.

Cependant, lors de nouveaux tests, je trouve que pour processComponents(0,0,1970,0,0,0) (1er janvier 1970, 12h00 du matin), mktime(&time) causes time à foutre:

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;

Traduction par une date du 31 décembre 1969 23:00:00 PM.

Je peux vérifier que mktime() est responsable, car en commentant cette ligne, il rapporte correctement la date et l'heure au 1er janvier 1970 à 12 h 00.

Pourquoi est-ce mktime() ne gâcher que l'époque? Et comment dois-je réparer / solution de contournement?

Merci!

Était-ce utile?

La solution

Vous passez 0 comme le day paramètre et mettre cela dans time.tm_mday. Ce composant (et seulement ce composant) de struct tm est basé sur 1, pas basé sur 0.

Ne me demandez pas pourquoi.

Pour spécifier le 01 janvier 1970, 12h00 du matin, vous voudriez l'appeler comme ça:

processComponents(0,1,1970,0,0,0);

Et comme SDTOM mentionné, vous voudrez vous assurer que tm_isdst est défini de manière appropriée - 0 pour pas en vigueur, positif pour en effet, et négatif pour vous ne savez pas (auquel cas mktime() devrait essayer de deviner).

Juste pour vous faire savoir, quand je passe la date que vous avez (0 janvier 1970, 00:00:00) mktime() Dans MSVC 9, il renvoie une erreur (le passé struct tm est intact et le retourné time_t la valeur est -1).

Autres conseils

Comme il est décalé d'une heure, je m'attendrais à ce que l'heure d'été. La valeur de Time.tm_isdst est-elle définie quelque part? Si vous ne le définissez pas, il pourrait être réglé au hasard sur 1 ou 0, ce qui affecterait vos résultats.

Passer tous les zéros à mktime() est interprété comme "dim 0 00:00:00 1900". Sur cette base, il doit y avoir des ajustements ...

// 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 );
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top