Sekunden seit 1900
-
Hallo,
für ein Programm muss ich mit Zeit rechnen. Die ersten Erfahrungen mit der time.h habe ich bereits gemacht, jedoch habe ich nnun folgendes Problem:
Ich brauche die Sekunden von 1900 bis zu einem bestimmten von mir festgelegten Datum. Ein befreundeter Programmierer meinte, ein struct *tm mit dem Datum zu füllen und es über time() auswerten zu lassen.
Jedoch habe ich jetzt nochmal nachgeschaut, jedoch steht dort das time() als optionaken Parameter time_t nimmt.
Jetzt bick eich da erstens nicht durch und zweitens, was ist nun der richtige Weg??
Gruß
-
time( )
liefert die aktuelle Systemzeit in Sekunden, die seit dem 01.01.1970 00:00 UTC vergangen sind. Mit Zeitdifferenzen hat das nichts zu tun. Dafür wäredifftime( )
zuständig, die aber mit Daten vor 01.01.1970 00:00 UTC, wie IMHO alle Zeitfunktionen dertime.h
nichts anfangen kann.viel Spaß beim selberschreiben
cheers, Swordfish
-
deine Daten in Sec. umrechnen heute_sec - sec_1900 = sec_diff
-
--- schrieb:
deine Daten in Sec. umrechnen heute_sec - sec_1900 = sec_diff
uiui... gut mitgelesen.. haha...
Joa da musste deine eigene kleine ... kleine xD ... Funktion basteln...
Ist Mordsarbeit, habe Zeitrechnung mal in Delphi gemacht... Einrechnen der Schaltjahre und so...Macht schon spass..
-
habe es jetzt vollendet _
Wers testen will, würde mich freuen...
http://floorball92.rockt.es/zeit.exe
Das Programm berechnet, wie viele Tage man bisher gelebt hat.
-
lippoliv schrieb:
[...] Einrechnen der Schaltjahre und so...
Schaltsekunden nicht vergessen.
floorball92 schrieb:
Das Programm berechnet, wie viele Tage man bisher gelebt hat.
Und wofür benötigst du dafür die Differenz in *Sekunden*!?
cheers, Swordfish
-
Jetzt mal ehrlich das wurde schon tausendfach implementiert sowas selber zu tun ist Käse. Nimm dir eine der tausend Libraries, wahrscheinlich kommt sogar jeder Compiler mit einer entsprechenden Bibliothek.
-
Interessehalber: Welche zum Beispiel?
cheers, Swordfish
-
lippoliv schrieb:
--- schrieb:
deine Daten in Sec. umrechnen heute_sec - sec_1900 = sec_diff
uiui... gut mitgelesen.. haha...
Joa da musste deine eigene kleine ... kleine xD ... Funktion basteln...
Ist Mordsarbeit, habe Zeitrechnung mal in Delphi gemacht... Einrechnen der Schaltjahre und so...Macht schon spass..
das sind max(!) 85 Zeilen mit dem main Programm...
-
Swordfish schrieb:
Interessehalber: Welche zum Beispiel?
cheers, Swordfish
wxWidgets -> wxDateTime -> wxTimeSpan/wxDateSpan
Viel Spaß damit ...
nurF
-
Das ganze Programm sind 108 Zeilen, von daher habt ihr recht, dass ist wirklcih nicht so viel.
Warum ich die Zeitdifferenz möchte?? Weil man so leicht die gelebten Tage errechnen kann.
Gruß Sebastian
-
floorball92 schrieb:
Das ganze Programm sind 108 Zeilen, von daher habt ihr recht, dass ist wirklcih nicht so viel.
Warum ich die Zeitdifferenz möchte?? Weil man so leicht die gelebten Tage errechnen kann.
Gruß Sebastian
Wieso nur 108 Zeilen? Wie gehst du vor? Was beachtest du? http://nopaste.info/ klatsch ma bitte rein, will mal sehen..
Ja ich habe inna Schule son "Datumsrechner" geschrieben wo man Daten addieren und sobtrahieren udn so konnte... Auch die Tagesdifferenz errechnen... Und das war ziemlich viel (glaub ich)... Is ne weile her, vllt war das drumherum das meißte..
-
probiert das hier:
// Reads RTC as seconds from timeoffset UINT32 GetTimeStamp (UINT32 timeoffset) { UINT8 i; UINT32 result = 0; unsigned idx; // days of each month UINT8 md[] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; UINT16 year = CLOCK_READ_YEARS(); UINT8 month = CLOCK_READ_MONTHS(); UINT8 day = CLOCK_READ_DAYS(); UINT8 hour = CLOCK_READ_HOURS(); UINT8 minute = CLOCK_READ_MINUTES(); UINT8 second = CLOCK_READ_SECONDS(); // Make month an array index idx = month - 1; if (idx > 11) idx = 0; // Leap year? adjust february if (year%400 == 0 || (year%4 == 0 && year%100 !=0)) md[1] = 29; else md[1] = 28; // Calculate days of years before result = (UINT32)year * 365; if (year >= 1) { result += (year+3) / 4; result -= (year-1) / 100; result += (year-1) / 400; } // Start with 2007 a.d. result = result - timeoffset; // Loop thru each month, adding the days for (i=0; i<idx; i++) result += md[i]; // Add remaining days result += day; // Convert to seconds, add all the other stuff result = (result-1) * 86400L + (UINT32)hour * 3600L + (UINT32)minute * 60 + second; return result; }
hat ein freund von mir vor jahren mal gebastelt.
die makros CLOCK_READ... usw. müsst ihr durch eure eingabedaten ersetzen, also jahr, monat, tag, stunde, minute, sekunde.
damit der wert ab 1900 zählt, muss 'timeoffset' so aussehen:#define TIMEOFFSET_1900 693961
^^also, keine 50 zeilen.
-
hihi
Ich muss mal meinen Delphi-Code raussuchen... Ich glaub da hab ich ur zu viel gemacht (so wie immer) xDMal sehen...
Is auf jeden Fall super gelöst!
-
Joa, dass ist natürlich ne sehr schöne Lösung, ich bin ja auch noch ein anfänger, deshalb ist bei mir alles wahrscheinlich sehr umständliuch gemacht.
http://rafb.net/p/5SNXc840.html
Zum Vorgehen, denke das seiht man ganz klar, aber ich sage es auch nochmal kurz:
Errechnen der Schaltjahre vor 2008
Errechnen der Schaltjahre nach 2008
Errechnen der Tage im Geburtsjahr
Errechnen der Tage der restlichen Jahreä
Errechen der Tage dieses Jahres ( Simpel _ )->Alles addieren
fertig!
Denke mal recht umständlich aber war in meinen Augen der schnellste Weg.
Werde aber nochmal versuchen, es zu verbessern.
Gruß
-
floorball92 schrieb:
Joa, dass ist natürlich ne sehr schöne Lösung, ich bin ja auch noch ein anfänger, deshalb ist bei mir alles wahrscheinlich sehr umständliuch gemacht.
was willst du denn? dein code sieht doch gar nicht mal schlecht aus (vorausgesetzt natürlich, dass er auch funzt).
-
fricky schrieb:
was willst du denn? dein code sieht doch gar nicht mal schlecht aus (vorausgesetzt natürlich, dass er auch funzt).
^^ Da stimm ich dir zu!
-
also ich habe es mit meinem Geburtsdatum ausprobiert und es dann manuel nachgerechnet und das hat gestimmt.
Natürlich wirt die 50 Zeiler Version noch um einiges besser.
ps: die Konsolenanwendungen beenden sich am Ende immer direkt selber, deshalb habe ich auch das 15 sec warten eingebaut. Gibt es nicht ne Andere Lösung?? EIn Freund sagt einfach ein getchar() einbauen, hat aber auch nix gebracht.
-
wenn getchar nicht klappt dann ist noch was im puffer, wie du den leer bekommst ist dann deine nächste aufgabe xD
-
fflush(stdin); ??