PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C - Timestamp, stunden verschwinden ^^


TheRealTentacle
2007-05-09, 21:23:49
// Umwandlung der Chars in Ints
year = 10 * char_to_int (date[6]) + char_to_int (date[7]);
month = 10 * char_to_int (date[3]) + char_to_int (date[4]);
day = 10 * char_to_int (date[0]) + char_to_int (date[1]);

second = 10 * char_to_int (time[6]) + char_to_int (time[7]);
minute = 10 * char_to_int (time[3]) + char_to_int (time[4]);
hour = 10 * char_to_int (time[0]) + char_to_int (time[1]);

// 2000 Problem ... relativierung zu 1970, Unix Timestamp
if (year < 70)
year = year + 30;
else
year = year - 70;

// Addiert Schalttage
day = day + (year - year%4) / 4;

// Wenn schaltjahr und vor märz, einen Tag subtrairen.
if (((year + 2)%4 == 0) && (month <= 2))
{
day = day - 1;
}

// Abziehen von zu vielen Monatstagen
if (month > 2)
day = day - 3;

if (month > 4)
day = day - 1;

if (month > 6)
day = day - 1;

if (month > 7)
day = day - 1;

if (month > 9)
day = day - 1;

if (month > 11)
day = day - 1;

timestamp = second + 60 * minute + 60 * 60 * hour + 60 * 60 * 24 * (day - 1) + 60 * 60 * 24 * 31 * (month - 1) + 60 * 60 * 24 * 365 * year;

return timestamp;

Es verschwindet genau eine stunde je nichtschaltjahr, wie kommt das?

Bitte keine Kritik wegen der Realisierung im Bezug auf 2038 / 2070 Kompatibilität ... ich bekomme schon nicht 2000 kompatible Daten ;).

Danke im Vorraus :)

Bietchiebatchie
2007-05-10, 01:58:20
Auf deine Frage kann ich direkt keine Antwort, dafür aber einen Tipp geben:
Warum programmierst du sowas selber? Gibt bestimmt einige Bibliotheken, die sich deinem Problem angenommen haben...
Wenn du das natürlich explizit selber programmieren wolltest, dann sry.

Doch! ich glaube ich habe deine Fehler gefunden: du substrahierst einen Tag pro Schaltjahr; richtig wäre natürlich einen zu addieren.

wori
2007-05-10, 10:14:51
In time.h findest Du alle Funktionen um den Timestamp des Systems zu verarbeiten.
Auf http://www2.fh-fulda.de/~klingebiel/c-stdlib/time.htm findest Du folgendes:
Funktionen für Datum und Uhrzeit: <time.h>

Die Definitionsdatei <time.h> vereinbart Typen und Funktionen zum Umgang mit Datum und Uhrzeit. Manche Funktionen verarbeiten die Ortszeit, die von der Kalenderzeit zum Beispiel wegen einer Zeitzone abweicht. clock_t und time_t sind arithmetische Typen, die Zeiten repräsentieren, und struct tm enthält die Komponenten einer Kalenderzeit:

int tm_sec; Sekunden nach der vollen Minute (0, 61)*
int tm_min; Minuten nach der vollen Stunde (0, 59)
int tm_hour; Stunden seit Mitternacht (0, 23)
int tm_mday; Tage im Monat (1, 31)
int tm_mon; Monate seit Januar (0, 11)
int tm_year; Jahre seit 1900
int tm_wday; Tage seit Sonntag (0, 6)
int tm_yday; Tage seit dem 1. Januar (0, 365)
int tm_isdst; Kennzeichen für Sommerzeit
(*Die zusätzlich möglichen Sekunden sind Schaltsekunden)

tm_isdst ist positiv, wenn Sommerzeit gilt, Null, wenn Sommerzeit nicht gilt, und negativ, wenn die Information nicht zur Verfügung steht.

clock_t clock(void)

clock liefert die Rechnerkern-Zeit, die das Programm seit Beginn seiner Ausführung verbraucht hat, oder -1, wenn diese Information nicht zur Verfügung steht. clock()/CLOCKS_PER_SEC ist eine Zeit in Sekunden.

time_t time(time_t *tp)

time liefert die aktuelle Kalenderzeit oder -1, wenn diese nicht zur Verfügung steht. Wenn tp von NULL verschieden ist, wird der Resultatwert auch bei *tp abgelegt.

double difftime(time_t time2, time_t timel)

difftime liefert time2 - timel ausgedrückt in Sekunden.

time_t mktime(struct tm *tp)

mktime wandelt die Ortszeit in der Struktur *tp in Kalenderzeit um, die so dargestellt wird wie bei time. Die Komponenten erhalten Werte in den angegebenen Bereichen. mktime liefert die Kalenderzeit oder -1, wenn sie nicht dargestellt werden kann.

Die folgenden vier Funktionen liefern Zeiger auf statische Objekte, die von anderen Aufrufen überschrieben werden können.

char *asctime(const struct tm *tp)

asctime konstruiert aus der Zeit in der Struktur *tp eine Zeichenkette der Form

Sun Jan 3 15:14:13 1988\n\0

char *ctime(const time_t *tp)

ctime verwandelt die Kalenderzeit *tp in Ortszeit; dies ist äquivalent zu

asctime(localtime(tp))

struct tm *gmtime(const time_t *tp)

gmtime verwandelt die Kalenderzeit *tp in Coordinated Universal Time (UTC). Die Funktion liefert NULL, wenn UTC nicht zur Verfügung steht. Der Name gmtime hat historische Bedeutung.

struct tm *localtime(const time_t *tp)

localtime verwandelt die Kalenderzeit *tp in Ortszeit.

size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp)

strftime formatiert Datum und Zeit aus *tp in s unter Kontrolle von fmt, analog zu einem printf-Format. Gewöhnliche Zeichen (insbesondere auch das abschließende '\0') werden nach s kopiert. Jedes %c wird so wie unten beschrieben ersetzt, wobei Werte verwendet werden, die der lokalen Umgebung entsprechen. Höchstens smax Zeichen werden in s abgelegt. strftime liefert die Anzahl der resultierenden Zeichen, mit Ausnahme von '\0'. Wenn mehr als smax Zeichen erzeugt wurden, liefert strftime den Wert Null.

%a abgekürzter Name des Wochentags.
%A voller Name des Wochentags.
%b abgekürzter Name des Monats.
%B voller Name des Monats.
%c lokale Darstellung von Datum und Zeit.
%d Tag im Monat (01 - 31).
%H Stunde (00 - 23).
%I Stunde (01 - 12).
%j Tag im Jahr (001 - 366).
%m Monat (01 - 12).
%M Minute (00 - 59).
%p lokales Äquivalent von AM oder PM.
%S Sekunde (00 - 61).
%U Woche im Jahr (Sonntag ist erster Wochentag) (00 - 53).
%w Wochentag (0 - 6, Sonntag ist 0).
%W Woche im Jahr (Montag ist erster Wochentag) (00 - 53).
%x lokale Darstellung des Datums.
%X lokale Darstellung der Zeit.
%y Jahr ohne Jahrhundert (00 - 99).
%Y Jahr mit Jahrhundert.
%Z Name der Zeitzone, falls diese existiert.
%% %.

TheRealTentacle
2007-05-10, 17:46:29
Wenn du das natürlich explizit selber programmieren wolltest, dann sry.

Doch! ich glaube ich habe deine Fehler gefunden: du substrahierst einen Tag pro Schaltjahr; richtig wäre natürlich einen zu addieren.

Ich wollte das Problem selber lösen, ja.

dein Lösungsvorschlag hilft mir auch leider nicht weiter, da das schon richtig ist:

day = day + (year - year%4) / 4;

addiert jedes schaltjahr einen tag dazu, allerdings war der ja am 28. Februar noch nicht, daher wird danach einer subtrairt.

Es fehlt ja kein tag, sondern eine Stunde, dass ist ja gerade das seltsame ...