![]() |
DEUTSCHE VERSION |
|
![]() |
Links | | | Forums | | | Comments | | | Report news |
![]() |
Chat | | | Polls | | | Newsticker | | | Archive |
![]() |
amiga-news.de Forum > Programmierung > Tagesdifferenz berechnen | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2007-02-14, 23:52 h MaikG Posts: 5172 User |
Ich hab ein Beispiel aus einem Buch genommen um die Differenz von 2 Daten zu berechnen: (T=Tag, M=Monat, J=Jahr) code:incr m If m>=4 then 830 m=m+12:decr j 830 n=int(j*365,25)*Int(m*30.6001)+t Aus faulheit hab ich irgendwie mal nur die letzte zeile genommen, ich dachte das wird schon gehen. Aber es geht z.B. für den 31.12.2006 und den 01.01.2007 nicht, zweiteres Ergebniss ist größer als das erste. Es gehts ja um die Anzahl der Tage seit Zeitzählung. Der wert 30.6001 scheint mir nicht korrekt, 365,25/12=30.4375, nochmal durchgerechnet und die die Ergebnisse der beiden Tage sind jetzt immerhin gleich für meine zwecke würde das reichen. Wäre die Rechnung so richtig? Ich meine warum steht das in dem Buch dann so kompliziert? [ - Answer - Quote - Direct link - ] |
2007-02-15, 00:18 h DariusBrewka Posts: 899 [Banned user] |
Also so einfach wirst du das nicht hinbekommen, weil z.B. die Anzahl der Tage in einem Jahr nicht wirklich 365.25 ist, die Rechnung ist wohl etwas komplizierter weil die 365.25 ja so eine Art korrektur für die Schaltjahre beinhaltet die nur Annährend funktioniert. 365.25 würde für die Tage seit begin der Zeitrechnung nur stimmen, wenn jedes 4te Jahr wirklich ein Schaltjahr wäre, allerdings sind alle durch 100 Teilbaren Jahre keine Schaltjahre, durch 400 jedoch schon, der Faktor 30.6001 erscheint mir auch komisch, aber da ist ja noch so ne Komische Rechnung davor, die für mich undurchsichtig ist. Für mein Tool habe Ich so eine Funktion mal geschrieben, aber die ist ziemlich Lang, vieleicht gibt's wirklich eine Einfachere "formel" [ - Answer - Quote - Direct link - ] |
2007-02-15, 09:08 h DrNOP Posts: 4118 User |
Zitat:Ich hab' zuallererst einmal Probleme mit deiner Kommasetzung. Vielleicht willst du dich ja entscheiden, ob du ein Dezimalkomma oder einen Dezimalpunkt benutzen willst? Also 365,25/12=30,4375 oder 365.25/12=30.4375? Zitat:Der 1.1.07 ist doch auch später als der 31.12.06, da muß das Ergebnis doch auch größer sein? Exakt um einen Tag größer? -- Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker [ - Answer - Quote - Direct link - ] |
2007-02-15, 09:31 h Solar Posts: 3680 User |
Wenn Du Datumsberechnung richtig machen willst, ist das kein Einzeiler. Vor allem dann nicht, wenn Du über das Mittelalter hinaus in die Vergangenheit willst, denn der Kalender hat sich vormals diverse Male geändert. Wer auch immer sich diese "Näherungsbrüche" ausgedacht hat, sollte die Finger von ernsthafter Programmierung lassen. 30.6001 als Näherung für die Länge eines Monats? Um Himmels willen... [ - Answer - Quote - Direct link - ] |
2007-02-15, 10:09 h MaikG Posts: 5172 User |
>365.25 würde für die Tage seit begin der Zeitrechnung nur stimmen, >wenn jedes 4te Jahr wirklich ein Schaltjahr wäre, Also ist schon die Jahreszahl falsch. Also 365,25/12=30,4375 oder 365.25/12=30.4375? zweites. >Der 1.1.07 ist doch auch später als der 31.12.06, da muß das >Ergebnis doch auch größer sein? Exakt um einen Tag größer? Ja, weil INT ist eine Rundung auf eine ganzzahl. 2006 = 732692, 12=367, 31=31 entspricht 733090 2007 = 733057, 1=31, 1=1 entspricht 733089 >Wenn Du Datumsberechnung richtig machen willst, ist das kein >Einzeiler. Vor allem dann nicht, wenn Du über das Mittelalter >hinaus in die Vergangenheit willst, denn der Kalender hat sich >vormals diverse Male geändert. Nein, soweit muss ich nicht zurück 1978 ist vollkommen ausreichend. >Wer auch immer sich diese "Näherungsbrüche" ausgedacht hat, sollte >die Finger von ernsthafter Programmierung lassen. 30.6001 als >Näherung für die Länge eines Monats? Um Himmels willen... Es steht in einem alten Buch, das Programm war wohl für ein KC85, der hat vielleicht auch gewisse Einschränkungen bei Fließkommazahlen. [ - Answer - Quote - Direct link - ] |
2007-02-15, 10:24 h melior Posts: 160 User |
@MaikG: Warum läßt Du denn nicht das AmigaOS (utility.library: Amiga2Date, CheckDate) die Aufgabe erledigen? Tschüß André [ - Answer - Quote - Direct link - ] |
2007-02-15, 11:31 h DariusBrewka Posts: 899 [Banned user] |
Hier mal ein Code, den Ich vor einiger Zeit geschrieben habe. OK ist ziemlich lang, aber Ich bin nicht so der Optimizer. das 2te Datum muß nach dem ersten liegen, es dürfte aber nicht so schwer sein das zu ändern. GetDB2Dates(day1,month1,year1, day2, month2, year2); liefert (oder sollte liefern) die Tage zwischen zwei Daten c code:int getDaysMonth(int year, int month) { switch (month) { case 1: return 31; break; case 2: if ((year % 400) == 0) return 29; if ((year % 100) == 0) return 28; if ((year % 4) == 0) return 29; return 28; break; case 3: return 31; break; case 4: return 30; break; case 5: return 31; break; case 6: return 30; break; case 7: return 31; break; case 8: return 31; break; case 9: return 30; break; case 10: return 31; break; case 11: return 30; break; case 12: return 31; break; } } int getDaysYear(int year) { if ((year % 400) == 0) return 366; if ((year % 100) == 0) return 365; if ((year % 4) == 0) return 366; return 365; } int DB2Dates(int d1, int m1, int y1, int d2, int m2, int y2); unsigned int GetDB2Dates(int d1, int m1, int y1, int d2, int m2, int y2) { unsigned int days = 0, i; if ((m1 == m2) && (y1 == y2) && (d1 == d2)) return 0; if ((m1 == m2) && (y1 == y2)) { days = d2 - d1; if (days > 0) return days; else return 0; } else if (y1 == y2) { if (m1 > m2) return 0; days += getDaysMonth(y1, m1) - d1; for (i = m1+1; i <= (m2-1); i++) days += getDaysMonth(y1, i); days += d2; } else { days += DB2Dates(d1, m1, y1, 31, 12, y1); for (i = y1+1; i <= (y2-1); i++) days += getDaysYear(i); days += DB2Dates(1, 1, y2, d2, m2, y2); days++; } return days; } int DB2Dates(int d1, int m1, int y1, int d2, int m2, int y2) { if (y2 < y1) return -GetDB2Dates(d2, m2, y2, d1, m1, y1); if (m2 < m1) return -GetDB2Dates(d2, m2, y2, d1, m1, y1); if (d2 < d1) return -GetDB2Dates(d2, m2, y2, d1, m1, y1); return GetDB2Dates(d1, m1, y1, d2, m2, y2); } [ - Answer - Quote - Direct link - ] |
2007-02-15, 12:39 h p-OS Posts: 131 User |
Also, wenn du ne einfache Lösung suchst, sieh dir mal die date.library an. Die beinhaltet ein umfangreiches Repertoire an Funktionen für Datumsberechnungen. Läßt sich als shared library auch in den meisten Programmiersprachen nutzen. [ - Answer - Quote - Direct link - ] |
2007-02-15, 13:05 h MaikG Posts: 5172 User |
>Warum läßt Du denn nicht das AmigaOS (utility.library: Amiga2Date, >CheckDate) die Aufgabe erledigen? Mh, die arbeiten aber mit 1978 oder? Und der 20xx Bug wurde ja auch noch nicht behoben. >Hier mal ein Code, den Ich vor einiger Zeit geschrieben habe. OK >ist ziemlich lang, aber Ich bin nicht so der Optimizer. Wow, ist ja ganz schön komplex sowas. Muss ich mal sehen, die Funktion wird ja relativ häufig aufgerufen. [ - Answer - Quote - Direct link - ] |
2007-02-15, 14:32 h DariusBrewka Posts: 899 [Banned user] |
Zitat: beheben kannst du Ihn sowieso nicht, da ein ULONG eben nur eine bestimmte Anzahl an Sekunden aufnehmen kann, einen Jhar 2000 Bug hatte das AOS aber sowieso nicht, mit Vorzeichenbehaftung dürfte das aber bis ca. 2040 mit ULONG funktionieren, wenn man wirklich daran glauben will das das AOS dann noch existiert. [ - Answer - Quote - Direct link - ] |
2007-02-15, 14:35 h melior Posts: 160 User |
Zitat: Ich habe mal in meinen Sourcen gekramt ein kleines Testprogramm geschrieben: 21.(0)Work:Oberon2> bin/Kalendertest 31-Dec-06 01-Jan-07 86400 s 1440 min 24 h 1 d 21.(0)Work:Oberon2> bin/Kalendertest 31-Dec-06 02-Jan-07 172800 s 2880 min 48 h 2 d 21.(0)Work:Oberon2> So weit so gut, oder? Tschüß André [ - Answer - Quote - Direct link - ] |
2007-02-15, 15:34 h MaikG Posts: 5172 User |
>beheben kannst du Ihn sowieso nicht, da ein ULONG eben nur eine >bestimmte Anzahl an Sekunden aufnehmen kann, einen Jhar 2000 Bug >hatte das AOS aber sowieso nicht, mit Vorzeichenbehaftung dürfte >das aber bis ca. 2040 mit ULONG funktionieren, wenn man wirklich >daran glauben will das das AOS dann noch existiert. In einen voll Kompatiblen weg kann man das sicherlich nicht beheben, aber zukünftig(was bei OS3.9 hätte schon geschehen sollen) könnte man z.B. eine weitere ULONG verwenden die das Programm dann hinzuaddieren muss. >Ich habe mal in meinen Sourcen gekramt ein kleines Testprogramm >geschrieben: Also müsste ich in dem fall der utility.library einen Tag geben und bekomme dann Tage, Stunden, Minuten und Sekunden zurück welche ich dann zusammenrechnen muss? >So weit so gut, oder? Ja, das scheint korrekt zu Funktionieren. [ - Answer - Quote - Direct link - ] |
2007-02-15, 16:23 h melior Posts: 160 User |
Zitat: Du übergibst der utility.library ein Datum (= mit Tag, Monat und Jahr ausgefüllte Struktur "ClockData"). Daraus berechnet Dir die Library die Anzahl der Sekunden seit dem 1.1.1978. Wenn Du das mit 2 Datumswerten machst, bekommst Du mit Differenz zwischen den beiden Sekundenwerten den Abstand zwischen Datum1 und Datum2 in Sekunden. Na und das mußt Du nur noch durch 60 (min), 60 (h) und 24 (d) teilen. Tschüß André [ - Answer - Quote - Direct link - ] |
2007-02-15, 17:48 h MaikG Posts: 5172 User |
mh, die Struktur ist nirgens beschrieben. Ist das korrekt? code:'$INCLUDE utility.bh '$INCLUDE Exec.bh LIBRARY OPEN "exec.library" LIBRARY OPEN "utility.library" tCD&=AllocVec&(ClockData_sizeof% ,MEMF_CLEAR&) POKEW tCD& +sec%, 0 POKEW tCD& +min_%, 0 POKEW tCD& +hour%, 0 POKEW tCD& +mday%, 31 POKEW tCD& +month%, 12 POKEW tCD& +year%, 2006 POKEW tCD& +wday%, 0 PRINT Date2Amiga&(tCD&) FreeVec tCD& nicht das ich jetzt irgendwo Word reinschreibe und Long wird benötigt oder so. [ - Answer - Quote - Direct link - ] |
2007-02-15, 18:37 h melior Posts: 160 User |
Zitat: Im NDK 3.1 gibt es date.h: struct ClockData { UWORD sec; UWORD min; UWORD hour; UWORD mday; UWORD month; UWORD year; UWORD wday; }; Zitat: Sieht gut aus, wenngleich ich mich nicht als Basic-Fachmann bezeichnen möchte. ;-) Tschüß André [ - Answer - Quote - Direct link - ] |
2007-02-16, 00:16 h MaikG Posts: 5172 User |
>Im NDK 3.1 gibt es date.h: Na das muss man erstmal finden... Okay alles Word also, dann ist es richtig. Gut, dann werde ich das mal Implementieren. Danke @all [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Tagesdifferenz berechnen | [ - Search - New posts - Register - Login - ] |
![]() |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved. |
![]() |