Frage von kevni2012, 47

PHP Zeit-Bedingung über Mitternachtsgrenze?

Guten Morgen zusammen!

Ich habe ein PHP-Skript, das sich um die Anzeige und Archivierung von Webcambildern kümmert. Zwischen 22 und 8 Uhr morgens soll aber ein Offline-Grafik angezeigt werden. Das habe ich mit einer Bedingung an die Uhrzeit gelöst, zu der dann ein Überschreiben des aktuellen Bildes mit der Offline-Grafik stattfindet.

Das Ganze klappte nie, wenn ich >= 2200 .... <= 0800 drin hatte, also habe ich es mal gesplittet (siehe Code). Jetzt wird die Bedingung auch erfüllt, aber leider nur die erste zwischen 22 und 23.59 Uhr -.- Daher meine Frage:

  1. Wo liegt der Fehler, bzw. warum hat das Script Probleme mit der Zeit nach Mitternacht?
  2. Wie kann man die Bedingung verknüpfen, damit der ganze Zeitraum abgedeckt ist? Oder geht das auf Grund der Datumsgrenze nicht?

    //zeit
    $datum = date("Ymd"); [Wird für was anderes gebraucht]
    $uhrzeit = date("Hi");  
    
    [Skript gekürzt]
    
    //oflineschalte
    if (($uhrzeit >= 2205) && ($uhrzeit <=2359)) {
        @copy($verzeichnis_off.$offline, $verzeichnis_root.$online);
    }
    elseif (($uhrzeit >= 0001) && ($uhrzeit <=0800)) {
        @copy($verzeichnis_off.$offline, $verzeichnis_root.$online);
    }

Besten Dank im Voraus!

Ps. Bevor einer meckert, ich bin kein PHP-Genie ^^

Antwort
von TanteHolger, 25

Warum so kompliziert wenn es auch einfach geht?
Hier die einfache Lösung ;)

<?php
$zeit = date("G");
if ($zeit >= 22 && $zeit < 8)
{
@copy($verzeichnis_off.$offline, $verzeichnis_root.$online);
}
?>

Gruß: Holger

Erklärung: Da Du volle Stunden nutzt, benötigst Du bei date nur den Parameter "G". date("G") gibt Dir die aktuelle Stunde (24 Stunden Format) ohne führende 0 aus, der Rest ist einfache Mathematik und Logik :)

Kommentar von kevni2012 ,

Danke für den Hinweis und deine Erklärung. Leider kann ich nicht nur mit G arbeiten, da die Cam gerne mal ein paar Minuten abweicht und z.b. ggf. erst um 22.01 oder 03 hochläd, womit dann das letzte Bild unterschlagen wäre ;-) Also muss es wohl doch die komplizierte Variante sein...

Kommentar von TanteHolger ,

Wie ist denn die Erfahrung mit dem Delay bis zur letzten Speicherung? Du könntest dann in die Rechnung eine Minute mit einbeziehen.

Kommentar von TanteHolger ,

Versuch dies, das sollte klappen =) Edit: Klammern vergessen.

<?php
function cpvan()
{
$stunde = date("G");
$minute = date("i");
if ($stunde >= 22 && $stunde < 8)
{
if ($stunde == 22 && $minute < 10)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}

if (cpvan())
{
@copy($verzeichnis_off.$offline, $verzeichnis_root.$online);
}
?>
Antwort
von kevni2012, 31

Also keine Ahnung ob es daran lag, dass ich mir gerade ein Bier genommen hab, aber es läuft dann jetzt :D Hatte mir die ganze Zeit darüber Gedanken gemacht warum er ein Problem mit der Datumsgrenze, bzw. mit der Mitternachtsstunde hat - na und irgendwie hatte ich im Kopf "Vielleicht sind vier Nullen ja eine zufiel?" :P

Habe die Zeitausgabe jetzt mal ohne nullführende Stunden eingestellt und siehe da - es funktioniert (siehe Code).

Trotzdem wäre es immer noch hilfreich zu wissen

1. warum das Skript Probleme mit Mitternacht hat, wenn es 0000 sind und

2. warum sich das nur mit elseif lösen lässt?! Denn trotz der Umstellung auf >=2200 und <=800 hat er Probleme -.-

//zeit
$uhrzeit = date("Gis");
//oflineschalte
if (($uhrzeit >= 220500) && ($uhrzeit <= 235959)) {
@copy($verzeichnis_off.$offline, $verzeichnis_root.$online);
}
elseif (($uhrzeit >= 00001) && ($uhrzeit <= 80000)) {
@copy($verzeichnis_off.$offline, $verzeichnis_root.$online);
}
Kommentar von Malemeister ,

Hallo,

das Skript hat keine Probleme mit Mitternacht. Du solltest dir deine beiden Codes nur nochmal genau ansehen, dann findest du von alleine den Fehler.

Zu deinem elseif: Das lässt sich auch nur mit 2 If Abfragen lösen. Ein elseif musst du hier nicht verwenden.

Zu deinem restlichen Code:

1. Bei deinen If Abfragen (Expressions) kannst du die Klammern, welche den Vergleich der Zahlen umklammer, weglassen. Dann wird dein Code auch leserlicher.

2. Mach das @ vor copy weg und behebe die Warnung welche dir rausgeschmissen wird! Du solltest nie mit @ arbeiten. Es hat ja schon ein Sinn warum eine Warnung oder, schlimmer noch, eine Fehlermeldung rausgeschmissen wird!

Grüße

Kommentar von macmad ,

Zahlen, die in PHP mit 0 beginnen, werden nicht als Dezimalzahlen interpretiert sondern als Oktalzahlen. Das Oktalsystem kennt nur Ziffern von 0 bis 7. Da 0800 eine 8 enthält, wirft PHP einen Fehler. Falls dir dieser Fehler nicht angezeigt wurde, solltest du die Anzeige von Fehlern aktivieren.

Kommentar von macmad ,

Ergänzung: Erst ab PHP 7 wird in diesem Fall ein Fehler geworfen. In früheren Versionen wird 0800 zu 0 ausgewertet und das Script läuft normal weiter.

Antwort
von CrEdo85wiederDa, 31

Als erstes solltest du überhaupt feststellen, ob der Fehler in der Abfrage oder in dem Script liegt - mit ganz einfachen echo-Befehlen lässt es sich einfach feststellen. Falls schon die Abfrage nicht klappen sollte (was ich nicht glaube), dann solltest du dir auch noch ein echo $uhrzeit einbauen.

PS: was passiert um genau 0 Uhr? Also bei $uhrzeit == 0000? ;)

Kommentar von kevni2012 ,

Habe kein Echo drin, aber schau dir mal meinen Nachtrag an. Mittlerweile klappt es, nur mit einem Manko. Das ist zu verkraften, aber ich würde trotzdem gerne wissen wo das Problem liegt :)

Kommentar von CrEdo85wiederDa ,

das problem liegt bei den führenden Nullen - die variable ist ein string. schaue dir folgende Seite an, sie dürfte einen Lösungsansatz liefern:http://stackoverflow.com/questions/2767068/adding-30-minutes-to-time-formatted-a...hp

Kommentar von CrEdo85wiederDa ,

Man kann die zwei Bedingungen nicht miteinander zusammenfassen, da der Script ja nicht weiß, dass in deinem Verständnis z.B. 0001 größer ist als 2359.

Kommentar von CrEdo85wiederDa ,

An für sich wäre aber die Lösung ganz einfach: kehre den Script um. Lasse per Default die Offline-Grafik anzeigen und überschreibe diese in der Zeit zwischen 0800 und 2200 mit dem Online-Bild. oder ohne den Script umzukehren: if (8 bis 22) {nix} else {script}

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten