Hallo
In einer portablen Bibliothek habe ich das Problem, dass mktime() nicht auf dem Zielsystem zur Verfügung steht, jedoch ein Unix Timestamp benötigt wird. Nun frage ich mich wie dieser berechnet wird? Mein erster naiver Ansatz (siehe unten) hat eine Differenz am 1.1.1970 von -3600 Sekunden. Zähle ich diese Differenz hinzu, funktioniert das bis am 30.3.1981, dann liege ich nochmals um -3600 Sekunden daneben.
Sieht jemand den Fehler? Ich sehe die Zeit vor lauter Sekunden nicht mehr :-/
Code:
time_t
time_to_timestamp(unsigned int year,
unsigned int month,
unsigned int day,
unsigned int hour,
unsigned int minute,
unsigned int second)
{
#define is_leap_year(y) \
((0 == (y) % 400) ? 1 : (0 == (y) % 100) ? 0 : (0 == (y) % 4) ? 1 : 0)
const static short month_table[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
unsigned int y;
unsigned int days = 0;
for (y = 1970; y < year; y++)
days += is_leap_year(y) ? 366 : 365;
days += month_table[month];
if (month > 2 && is_leap_year(year))
days += 1;
days += day - 1; /* minus one as we start at midnight */
return days * 86400 + hour * 3600 + minute * 60 + second;
}
Ergänzung Wertebereiche:
Code:
year: [1970-2039]
month: [1-12]
day: [1-31] (bzw. 30, 29, 28)
hour: [0-23]
minute: [0-59]
second: [0-59]
Nachtrag: Wer lesen kann ist klar im Vorteil: mktime erwartet ein Argument in lokaler Zeit. Damit währe das geklärt. Damit gehts in die nächste Runde: Wie komme ich zum Zeitzohnen-Offset. Aber das ist eine andere Geschichte und hat nichts mit Unix zu tun.
Gruss, Andy
Lesezeichen