Produzieren des UNIX-Zeitstempels aus der in C übergebenen Datumszeit

Produzieren des UNIX-Zeitstempels aus der in C übergebenen Datumszeit


Ich portiere eine C-App von Solaris auf RedHat, und diese Funktion funktioniert nicht sehr gut auf RedHat (und ich brauche Ihre Hilfe, um herauszufinden, warum):


int toTimestamp (const char *InputDate, const char *DateFormat, time_t *lTimestamp){
struct tm tm;
if (NULL == strptime(InputDate, DateFormat, &tm)){
return FALSE;
}
*lTimestamp = mktime(&tm);
return TRUE;
}

Im Grunde erzeugt es einen UNIX-Zeitstempel aus einer Datumszeit, die als Zeichenfolge mit dem angegebenen Format übergeben wird.


char *effPaymentDate = NULL;
char *CohDueDate = NULL;
//...
effPaymentDate = PayRec->RecDate;//char RecDate[8+1];, value 20141005
CohDueDate = PayRec->DueDate;//char DueDate[8+1];, value 20140820
time_t currentDateUNIX;
time_t DueDateUNIX;
if (FALSE == toTimestamp(CohDueDate, "%Y%m%d", &DueDateUNIX) ||
FALSE == toTimestamp(effPaymentDate, "%Y%m%d", &currentDateUNIX)) {
return NULL;
}
//...

Es scheint jedoch nicht richtig zu funktionieren (funktioniert OK für effPaymentDate, gibt falsche Daten für CohDueDate an - z. B. Jahr 2543) - irgendwelche Ideen warum?


Antworten:


TL;DR:


Sie müssen tm initialisieren bevor es an APIs übergeben wird:


memset(&tm, 0, sizeof tm);

Warum?


strptime kann unbemerkt fehlschlagen:


$ man strptime


Also wegen tm nicht auf 0 gesetzt ist, können einige Felder zufällige Werte enthalten.


Außerdem:


$ man mktime


Die Zufallswerte liegen wahrscheinlich außerhalb des zulässigen Bereichs und mktime versucht, es zu normalisieren.
Es hat zwar gute Arbeit geleistet, aber die year verriet es!