Das Problem kann ich recht einfach erklären:
2 ist größer als 0.
Gut, vielleicht muss ich ein wenig ausholen. Üblicherweise vergleicht man bei der Arbeit mit Computern Zeitstempel. Das ist die Anzahl Sekunden seit dem 1.1.1970 um 0 Uhr. Mit diesen kann man sehr komfortabel rechnen und sie eben vergleichen.
Sie hingegen verwenden das Datum als String (Text):
$now = date("d.m.Y H:i");
$start = date($timeRange[0]);
$end = date($timeRange[1]);
Dabei kommt folgendes heraus, z.B.
$now = '02.03.2020 21:38';
$start = '29.02.2020 00:00';
$end = '02.03.2020 23:59';
Ich habe den Zeitraum jetzt mal etwas verlängert, damit ich das aktuelle Datum verwenden kann. Aber es geht um das Prinzip.
Betrachten Sie diese 3 Zeilen jetzt bitte einmal nicht als Datum, sondern als Text. Damit es einfacher fällt, habe ich die 0 durch "A" ersetzt, die 1 durch "B" u.s.w.
$now = 'AC.AD.CACA CB:DL';
$start = 'CJ.AC.CACA AA:AA';
$end = 'AC.AD.CACA CD:FJ';
So, nun vergleichen wir mal ($now >= $start)
entsprechend Ihrem Code. Was kommt zuerst "AC" oder "CJ"? Genau. $now
ist nun kleiner als $start
. Entsprechend ist Ihr Code der Meinung, das etwas nicht passt.
Inzwischen sehen Sie auch, weshalb das Problem immer zum Monatswechsel auftritt. Da ändert sich die erste Stelle des Tages - und zwar "nach unten". Schuld an Ihrer Misere ist also die technikfeindliche Schreibweise für das Datum.
Lösung: Verwenden Sie Zeitstempel. Versuchen Sie es bitte einmal mit folgender Modifikation:
$now = time();
$timeRange = dbGet('Day'.$studyDay);
$start = strtotime($timeRange[0]);
$end = strtotime($timeRange[1]);
Ob unten das korrekte Datum ermittelt wurde können Sie wie folgt testen:
debug(date('d.m.Y H:i', $start));
debug(date('d.m.Y H:i', $end));