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.
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
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?
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.
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
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.
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).
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() {
}