Forum: Mikrocontroller und Digitale Elektronik Wie Datum prüfen?


von Ralf (Gast)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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...

von Helmut L. (helmi1)


Lesenswert?

>> 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

von Ralf (Gast)


Lesenswert?

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

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

>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

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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

von Peter D. (peda)


Lesenswert?


von JensG (Gast)


Lesenswert?

@ 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 ... ;-)

von eProfi (Gast)


Lesenswert?

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.

von Nosnibor (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.