www.mikrocontroller.net

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


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: JensG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ... ;-)

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nosnibor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.