Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Unix Timestamp berechnung

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320

    Unix Timestamp berechnung

    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
    Geändert von RapidMax (04-06-2007 um 14:43 Uhr) Grund: Nachtrag

  2. #2
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Der Zeitzonenoffset geht aus den Dateien in /usr/share/zoneinfo hervor.

    Mit
    Code:
    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
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •