PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unix Timestamp berechnung



RapidMax
04-06-2007, 14:02
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 :-/



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:


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

Waxolunist
05-06-2007, 10:01
Der Zeitzonenoffset geht aus den Dateien in /usr/share/zoneinfo hervor.

Mit

ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
stellst du die Zeitzone auf Berlin um.

Die aktuellen Zeitzoneninfos gibts auf ftp://elsie.nci.nih.gov/pub.

Für diese Dateien gibts die beiden Programme zdump und zic (Zoneinfocompiler).

mfg, christian