Datum auf Gültigkeit prüfen

Hallo,

ich möchte bei meinem Projekt das Eingeben der Uhrzeit und des Datum ermöglichen. Die Uhrzeit kann ich ja sehr leicht auf Plausibilität überprüfen, aber wie sieht das mit dem Datum aus.

Gibt es eine Funktion welche prüft ob es ein eingegebenes Datum auch wirklich gibt?

Wenn nicht müsste man ja Tag, Monat und Jahr manuell und in Abhängigkeit voneinander prüfen.

Vielen Dank für Eure Hilfe.

ArduinoArti

Du kannst die Anzahl der Tage pro Monat in einem Array speichern. Dann kann man das bequem testen

Dabei das Schaltjahr nicht vergessen oder am 29.Februar nichts ändern :wink:

Gruß Tommy

Hallo,

das Problemchen tritt ja beim Tag und unterschiedlichen Monaten auf, ich denke das sprichst Du an.

ein byte Arrary mit den Einträgen der Tagen für jeden Monat , Index ist dann der Monat.

Dann kann man abfragen ob die Eingabe > als der Array Wert ist.

zu spät @Tommy guter Einwand glatt vergessen

Heinz

Tommy56:
Dabei das Schaltjahr nicht vergessen oder am 29.Februar nichts ändern

Man kann vereinfacht annehmen dass der Februar immer 29 Tage hat

Das mit dem Schaltjahr und den unterschiedlichen Tagen pro Monat hatte ich mir auch überlegt.
Deshalb hab ich gehofft, das es schon was fertiges gibt :smiley:
Aber wie es ausschaut werde ich es wohl manuell abfragen müssen.

Serenifly:
Man kann vereinfacht annehmen dass der Februar immer 29 Tage hat

Wie reagiert dann die unbekannte Lib des TO auf die 3 falschen 29. Februar? Nimmt sie dann den 1. März? Ist das gewollt? Evtl. war es nur ein Fehler und es hätte der 28. sein sollen?

Das wäre mir zu riskant oder übersehe ich etwas?

Gruß Tommy

Na ja, das kommt auch nur vor wenn man an einem Schalttag das Datum neu eingibt. Bei einem Hobby-Projekt dass man nur selbst verwendet muss man da nicht unbedingt so genau sein.

Ansonsten ist es auch kein Problem mit der üblichen Formel abzufragen ob es ein Schaltjahr ist und zu den maximalen Tagen eins dazu addieren

Eben, deshalb hatte ich auch geschrieben Schaltjahr berücksichtigen oder am 29.2. nicht ändern.
Mir lag jetzt nur die Aussage "Februar immer mit 29 Tagen angeben" verquer.

Gruß Tommy

Hi

Die Anzahl der Tage pro Monat ist ja nun nicht so kompliziert (31/30 im Wechsel, wenn man bei Januar beginnt).
Jeder ungerade Monat hat somit 31 Tage, solange Monat <8 ist.
Über 7 hat jeder gerade Monat 31 Tage.
Der Februar hat 28 Tage, Ausnahme, die Jahreszahl ist durch 4 teilbar, aber nicht durch 100.

Gegeben: Monat Jan=1, Dez=12
Anzahl=30 Tage;
Wenn Monat <8
... Monat%1 -> 31 Tage
... Monat == 2, prüfen auf Schaltjahr und 100 für 28/29
ELSE
--- Monat%1==0 -> 31 Tage

MfG

postmaster-ino:
Der Februar hat 28 Tage, Ausnahme, die Jahreszahl ist durch 4 teilbar, aber nicht durch 100.

"Aber nicht durch 100 teilbar" halte ich für falsch, oder zumindest nicht komplett richtig.

Z.B. war das Jahr 2000 ein lupenreines Schaltjahr, mit 29.02. und 2000/4=500 und 2000/100=20. Ähnliches wird etwas später auch für das Jahr 2200 gelten, aber das Beispiel ist dann wieder etwas übertrieben. :wink:

wapjoe:
"Aber nicht durch 100 teilbar" halte ich für falsch, oder zumindest nicht komplett richtig.

Genau. Unvollständig.
Da fehlt noch eine Regel unseres gregorianischen Kalenders, nämlich:
Ist eine Jahreszahl ganzzahlig durch 400 teilbar, so ist sie, entgegen der Regel der ganzzahligen Teilbarkeit durch 100, trotzdem ein Schaltjahr.
(Dies trifft z.B. auf die Jahre 1600 und 2000 zu).

siehe: Gregorianischer Kalender – Wikipedia

:slight_smile:

  int Y = 2000;
  bool leapYear = !(Y % 4) && Y % 100 || !(Y % 400);
  Serial.printf("Schaltjahr %s\n", leapYear ? "Ja" : "Nein");

Gruß Fips

Wenn man eine Datumseingabe auf Plausibilität prüfen will, ist dann ein 01.04.2525 gültig
Und ein 9.9.99
???

Evtl. kann man sich die Schaltjahr-Logik vereinfachen, wenn keine Genehmigung vom Vatikan erforderlich ist :slight_smile:

Vielen Dank für euren Input. Nachdem ich jetzt erst mal mit anderen Problemen gekämpft habe, habe ich nun die Abfrage zusammengebastelt. Es gibt vielleicht elegantere Lösungen aber ich stell sie jetzt doch mal hier ein. Vielleicht kann sie ja jemand brauchen.

void setup() {
  while (!Serial);
  Serial.begin(9600);

  byte d = 12;    //day
  byte m = 2;     //month
  byte Y = 2020;  //year
  bool valid = true;

  if (!(Y % 4) && Y % 100 || !(Y % 400)) {
    Serial.println(F("Schaltjahr"));
  }
  else {
    Serial.println(F("Kein Schaltjahr"));
  }

  if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
    if (d > 31 || d < 1) {
      valid = false;
    }
  }
  else if (m == 4 || m == 6 || m == 9 || m == 11) {
    if (d > 30 || d < 1) {
      valid = false;
    }
  }
  else if (m == 2) {
    if (((!(Y % 4) && Y % 100 || !(Y % 400)) && d > 29) || d < 1) {
      valid = false;
    }
    else if ((!((!(Y % 4) && Y % 100 || !(Y % 400))) && d > 28) || d < 1) {
      valid = false;
    }
  }
  else {
    valid = false;
  }
  if (valid) {
    Serial.print(F("Datum gültig"));
  }
  else {
    Serial.print(F("Datum ungültig"));
  }
}

void loop() {
}

Gruß
Arduino Arti