Hi, ich hab mir eine kleine Software-RTC gebastelt, und möchte diese um eine Datumsfunktion erweitern. Ich frag mich grad, wie ich das Datum prüfen kann, also z.B. wenn es 30.Juni ist, dass dann um 00:00 der 01.Juli entsteht und nicht der 31.Juni, oder eben Prüfung auf Schaltjahr -> 29.Februar. Und die Ermittlung des Wochentags wär auch ne nette Sache. Mein Ansatz wär jetzt mal folgender: - Die Berechnung des letzten Monatsdatums erschlage ich einfach durch eine Tabelle, in der die entsprechenden Angaben stehen, und vergleiche diese. - Den 29.Februar kann ich wohl ermitteln, indem ich die Jahreszahl (ich verwende in meiner SW nur die letzten beiden Ziffern, also 2000-2099) durch vier Teile, und wenn der Rest der Teilung Null ergibt, dann haben wir ein Schaltjahr. - Die Wochentagsberechnung inklusive Datumsprüfung könnte ich nach folgendem Code (http://de.wikipedia.org/wiki/Zellers_Kongruenz), Abschnitt "Verwendung in Programmiersprachen", vornehmen. So, jetzt wäre die Frage eigentlich, ob es noch einfachere Möglichkeiten gibt, zumal ich glaube, dass die C-Funktion aus dem Wikipedia-Artikel meinen µC evtl. doch arg strapazieren könnte :) Wie würdet ihr das lösen? Ralf
Ralf wrote: > - Die Berechnung des letzten Monatsdatums erschlage ich einfach durch > eine Tabelle, in der die entsprechenden Angaben stehen, und vergleiche > diese. Gang genau. > - Den 29.Februar kann ich wohl ermitteln, indem ich die Jahreszahl (ich > verwende in meiner SW nur die letzten beiden Ziffern, also 2000-2099) > durch vier Teile, und wenn der Rest der Teilung Null ergibt, dann haben > wir ein Schaltjahr. Ansatz ist sauber, die Division kannste dir hier aba sparen: Durch vier teilbar ist alles, wo die untersten beiden Bits null sind ;-) AAAber: Jedes vierte Jahr isn Schaltjahr. Jedes hundertste Jahr aber wieder nicht. Und jedes vierhundertste Jahr ist dann aber trotzdem wieder ein Schaltjahr. Du brauchst nur eine einzige Division durchführen (nämlich durch 100). Wie man auf Teilbarkeit durch 4 testet, hab ich ja schon gesagt. Und durch 400 geht immer, wenns Ergebnis der Division wiederum durch 4 geht. > - Die Wochentagsberechnung inklusive Datumsprüfung könnte ich nach > folgendem Code (http://de.wikipedia.org/wiki/Zellers_Kongruenz), > Abschnitt "Verwendung in Programmiersprachen", vornehmen. Dasn schönes Mittelchen, nur leider sind Divisionen und Multiplikationen immer nich-so-gut aufm Prozessor umsetzbar. > So, jetzt wäre die Frage eigentlich, ob es noch einfachere Möglichkeiten > gibt, zumal ich glaube, dass die C-Funktion aus dem Wikipedia-Artikel > meinen µC evtl. doch arg strapazieren könnte :) :-) Richtig erkannt...
>> So, jetzt wäre die Frage eigentlich, ob es noch einfachere Möglichkeiten >> gibt, zumal ich glaube, dass die C-Funktion aus dem Wikipedia-Artikel >> meinen µC evtl. doch arg strapazieren könnte :) Wie oft pro Sekunde willst du denn das Datum ausrechnen ? Ich glaube in dem Punkt machst du dich zuviel sorgen. Gruss Helmi
Hallo Sven & Helmut, danke für die Antworten. @Sven: Stimmt, an die beiden unteren Bits hab ich gar nicht gedacht. Und die Division durch 100 kann ich mir sparen, weil ich ja wie erwähnt nur die letzten beiden Jahresziffern nutze :) Fazit hierzu: Maskieren mit 0x03 Was die Multiplikationen/Divisionen angeht, siehe Antwort bei Helmut... @Helmut: Hast recht, ich muss ja nur einmal pro Tag um 00:00 machen :) Ralf
Hab so ne Uhr gerade in Assembler programmiert. Das mit dem 100er Jahr hab ich in Anbetracht dessen, das wir derzeit das Jahr 8 in unserem Jahrhundert haben dezent weggelassen (was geht mich das an, was in 92 Jahren ist ;-) Den Wochentag zähle ich einfach immer weiter. Nach Sonntag kommt halt wieder Montag. Beim stellen der Uhr muss man den Wochentag mit eingeben und ab dann stimmt es ja. Da für später eh noch DCF77 geplant ist, denke ich mal, dass das so reicht. Sven
>Hab so ne Uhr gerade in Assembler programmiert. Das mit dem 100er Jahr >hab ich in Anbetracht dessen, das wir derzeit das Jahr 8 in unserem >Jahrhundert haben dezent weggelassen (was geht mich das an, was in 92 >Jahren ist ;-) Na das ist aber kein zukunftweisendes Design. Was werden deine Ururenkel denn dazu sagen ? Gruss Helmi
Die können dann ja für viel Geld ein Softwareupdate für mein Gerät anbieten und sich damit eine goldenen Nase verdienen. Gibt es eigentlich einen Jahr 2256 Bug? Wenn nicht habe ich ihn in meiner Software erfunden, da ich das Jahr in einem Byte speichere, was im Jahr 2255 überlaufen müsste und dann wieder der 1.1.2000 ist. Juchu noch mal Millenium feiern ;-) Sven
@ Sven Stefan (stepp64) >Hab so ne Uhr gerade in Assembler programmiert. Das mit dem 100er Jahr >hab ich in Anbetracht dessen, das wir derzeit das Jahr 8 in unserem >Jahrhundert haben dezent weggelassen (was geht mich das an, was in 92 >Jahren ist ;-) Sei nicht so leichtsinnig. Morgen beschließt die EU, daß es übermorgen das Jahr 2099 zu sein hat, dann ist es fünf vor zwölf für Dich wegen einem Update ... ;-)
Habe schon einmal fertigen C-Code geschrieben: Beitrag "TI58 TI-58 TI59 TI-59 solid state software modul Programm 20" In den Sourcen des JDK (Java Development Kits) stehen auch sehr schöne Routinen und viel lesenswerte Theorie! z.B. (um den Path anzugeben) C:\jdk118-dotnetframework\JDK118\SRC\JAVA\UTIL\Calendar.java C:\jdk118-dotnetframework\JDK118\SRC\JAVA\UTIL\Date.java C:\jdk118-dotnetframework\JDK118\SRC\JAVA\UTIL\GregorianCalendar.java und die darumliegenden Dateien.
Die Berechnung des Wochentags zu einem gegebenen Datum kann man sich auch einfach machen: wenn es sowieso schon eine Funktion gibt, um das Datum (samt Wochentag) einen Tag weiterzuzählen (braucht die Uhr sowieso jeden Tag um Mitternacht einmal), zählt man einfach von einem Datum mit bekanntem Wochentag solange weiter, bis das gesuchte Datum erreicht ist. Klar, diese "brute force"-Methode ist unelegant und ineffizient, hat aber den Vorteil, daß man keine komplizierten Formeln debuggen muß, d.h. man kommt schnell zu der Gewißheit, daß das Programm richtig funktionieren wird. Und die Effizienz dürfte meist gut genug sein: der 6502@1MHz hat damals ca. 5s gebraucht, um ein ganzes Jahrhundert durchzuzählen; ein moderner Prozessor wird wohl schneller zum Ergebnis kommen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.