Ich hab für sowas mir ne Funktion geschrieben....
Die bekommt die Zeit übergeben und gibt einen Bool zurück.
Im Übrigen hab ich grad gesehen, das ich oben nur bis 22 zaehle - ich bin also auch nicht perfekt
Wenn es nicht nur um Stunden geht, sondern auch um Minuten / Sekunden ist es besser die Zeit in Minuten bzw Sekunden umzurechnen und den Vergleich dann mit Minuten / Sekunden zu machen Dadurch erspart man sich aufwendige Verschachtelung der Abfrage mit Stunden Minuten und etwaig Sekunden.
Noch notwendiger wird das wenn man Zeiten summiert. Startzeit x stopzeit nach y Minuten.
Ihr habt jetzt für den Nacht-Anfang vor und nach Mitternacht abgefangen. Das Nacht-Ende muss immer nach Mitternacht sein.
Wenn es nun nicht um "Nacht" sondern um beliebige Tages-Abschnitte ginge, wäre das immer noch nicht "perfekt". (Wenn man daraus eine allgemeingültige Funktion bauen will)
Nur zum Spaß: wenn man die Dauer der Nacht anstatt des Endes benutzt kann man das auch so rechnen:
constexpr unsigned nachtStart = 19;
constexpr unsigned nachtEnde = 1;
constexpr unsigned nachtDauer = ((nachtEnde+24)-nachtStart) % 24; // falls man das nicht selbst rechnen will...
bool nacht(unsigned h)
{
return (h - nachtStart + 24) % 24 <= nachtDauer;
}
void setup()
{
while (!Serial) {}
Serial.printf("Start: %02d:00 \nEnde: %02d:00 \nDauer: %dh\n\n", nachtStart, nachtEnde, nachtDauer);
for (unsigned h = 0; h < 24; h++)
{
Serial.printf("%02d:00 ist %s\n",h, nacht(h) ? "nacht" : "tag");
}
}
Ergibt:
Start: 19:00
Ende: 01:00
Dauer: 6h
00:00 ist nacht
01:00 ist nacht
02:00 ist tag
03:00 ist tag
04:00 ist tag
05:00 ist tag
06:00 ist tag
07:00 ist tag
08:00 ist tag
09:00 ist tag
10:00 ist tag
11:00 ist tag
12:00 ist tag
13:00 ist tag
14:00 ist tag
15:00 ist tag
16:00 ist tag
17:00 ist tag
18:00 ist tag
19:00 ist nacht
20:00 ist nacht
21:00 ist nacht
22:00 ist nacht
23:00 ist nacht