php-script für Datum und Öffnungszeiten?

2 Antworten

Ja, soetwas sollte sich umsetzen lassen. Wo genau werden die Öffnungszeiten hinterlegt? Hardgecodet im PHP-Code oder in einer Datenbank?

Angezeit werden soll das Datum dann vermutlich in der Zeit des lokalen Computers. Dafür benötigst du zusätzlich womöglich Javascript.


ItsNiklas 
Beitragsersteller
 22.05.2020, 10:08

Der Script wäre in einer PHP-Datei. Kannst du mir dabei helfen?

0
Destranix  22.05.2020, 11:31
@ItsNiklas

Hier eine erste Implementierung:

<?php
    $openTimes = [
        [],
        [],
        [],
        [],
        [["8:30", 200], ["10:00", 120], ["19:00", 200]],
        [],
        []
    ];//Muss erst irgendwie gesetzt werden. Enthält die Öffnungszeiten beschrieben durch Tag der Öffnung, Öffnungszeit und Öffnungslänge. Zeitangaben in UTC
    
?>
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        var openTimes = JSON.parse('<?php echo json_encode($openTimes);?>');
        const dayNames = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"];
        const monthNames = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
        document.addEventListener("DOMContentLoaded", init);
        function init(){
            var currentDate = new Date();
            var currentTime = dayNames[currentDate.getDay()]+", der "+currentDate.getDate()+"."+monthNames[currentDate.getMonth()]+" "+currentDate.getFullYear();
            var openTimesToday = openTimes[(currentDate.getDay()+6)%7];//0 is Sunday
            var openTimesElems = document.getElementById("openTimes");
            var timeRelative = -1;
            for(var i=0;i<openTimesToday.length;++i){
                var splitTime = openTimesToday[i][0].split(":");
                var startTime = new Date();
                startTime.setUTCHours(splitTime[0]);
                startTime.setUTCMinutes(splitTime[1]);
                var endTime = new Date(startTime.getTime() + openTimesToday[i][1]*60000);
                if(currentDate.getUTCHours() > startTime.getUTCHours() || (currentDate.getUTCHours() == startTime.getUTCHours() && currentDate.getUTCMinutes() > startTime.getUTCMinutes()) &&
                    currentDate.getUTCHours() < endTime.getUTCHours()  || (currentDate.getUTCHours() == endTime.getUTCHours() && currentDate.getUTCMinutes() < endTime.getUTCMinutes())){
                    timeRelative = endTime.getTime() - currentDate.getTime();
                    console.log(startTime, endTime, currentDate, timeRelative);
                }
                var durationString = "PT"+openTimesToday[i][1]+"M";
                var timeString = startTime.getHours()+":"+(startTime.getMinutes()<10?"0":"")+startTime.getMinutes()+" - "+endTime.getHours()+":"+(endTime.getMinutes()<10?"0":"")+endTime.getMinutes();
                if(openTimesToday.length > 1){
                    if(openTimesToday.length > 2){
                        if(i < openTimesToday.length-2){
                            timeString += ",";
                        }else if(i == openTimesToday.length-2){
                            timeString += " und";
                        }
                    }
                }
                timeString += " ";
                
                var timeContainer = document.createElement("b");
                var time = document.createElement("time");
                time .setAttribute("datetime", durationString);
                time.appendChild(document.createTextNode(timeString));
                timeContainer.appendChild(time);
                openTimesElems.appendChild(timeContainer);
            }
            
            var openTimeRelative;
            if(timeRelative < 0){
                openTimeRelative = "hat gerade geschlossen";
            }else{
                var timeRelativeHours = Math.round(timeRelative/3600000);
                var timeRelativeMinutes = Math.round((timeRelative-timeRelativeHours)/600000);
                openTimeRelative = "schließt in "+timeRelativeHours+" Stunden und "+timeRelativeMinutes+" Minuten";
            }
            
            document.getElementById("currentTime").appendChild(document.createTextNode(currentTime));
            document.getElementById("openTimeRelative").appendChild(document.createTextNode(openTimeRelative));
        }
    </script>
</head>
<body>
    <p>Heute ist <b id="currentTime"></b></p>
    <p>Der Park hat heute von <span id="openTimes"> </span>Uhr geöffnet</p>
    <p>und <b id="openTimeRelative"></b>.</p>
</body>
</html>
1
ItsNiklas 
Beitragsersteller
 22.05.2020, 13:48
@Destranix

Vielen Dank! Ich möchte nun doch nicht das es den aktuellen Tag anzeigt, könntest du das vielleicht noch für mich entfernen? ;)

0
ItsNiklas 
Beitragsersteller
 22.05.2020, 13:52
@ItsNiklas

Außer soll er wenn es noch unter 60 Minuten sind nur die Minuten anzeigen und nicht noch 0 Stunden.

0
Destranix  22.05.2020, 14:01
@ItsNiklas

Ich könnte natürlich. Allzu kompliziert ist das aber nicht, dass solltest du auch selber hinbekommen.

Zum entfernen des Tages schlicht die entsprechende Zeile aus dem HTML rauslöschen un din der init-Methode das setzen der currentTime und das erstellen der Textnode entfernen.

Zum entfernen der Stundenanzeige schlicht eine weitere Unterscheidung für relativeTime bauen.

Ungetestet:

<?php
    $openTimes = [
        [],
        [],
        [],
        [],
        [["8:30", 200], ["10:00", 120], ["19:00", 200]],
        [],
        []
    ];//Muss erst irgendwie gesetzt werden. Enthält die Öffnungszeiten beschrieben durch Tag der Öffnung, Öffnungszeit und Öffnungslänge. Zeitangaben in UTC
    
?>
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        var openTimes = JSON.parse('<?php echo json_encode($openTimes);?>');
        const dayNames = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"];
        const monthNames = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
        document.addEventListener("DOMContentLoaded", init);
        function init(){
            var currentDate = new Date();
      
            var openTimesToday = openTimes[(currentDate.getDay()+6)%7];//0 is Sunday
            var openTimesElems = document.getElementById("openTimes");
            var timeRelative = -1;
            for(var i=0;i<openTimesToday.length;++i){
                var splitTime = openTimesToday[i][0].split(":");
                var startTime = new Date();
                startTime.setUTCHours(splitTime[0]);
                startTime.setUTCMinutes(splitTime[1]);
                var endTime = new Date(startTime.getTime() + openTimesToday[i][1]*60000);
                if(currentDate.getUTCHours() > startTime.getUTCHours() || (currentDate.getUTCHours() == startTime.getUTCHours() && currentDate.getUTCMinutes() > startTime.getUTCMinutes()) &&
                    currentDate.getUTCHours() < endTime.getUTCHours()  || (currentDate.getUTCHours() == endTime.getUTCHours() && currentDate.getUTCMinutes() < endTime.getUTCMinutes())){
                    timeRelative = endTime.getTime() - currentDate.getTime();
                    console.log(startTime, endTime, currentDate, timeRelative);
                }
                var durationString = "PT"+openTimesToday[i][1]+"M";
                var timeString = startTime.getHours()+":"+(startTime.getMinutes()<10?"0":"")+startTime.getMinutes()+" - "+endTime.getHours()+":"+(endTime.getMinutes()<10?"0":"")+endTime.getMinutes();
                if(openTimesToday.length > 1){
                    if(openTimesToday.length > 2){
                        if(i < openTimesToday.length-2){
                            timeString += ",";
                        }else if(i == openTimesToday.length-2){
                            timeString += " und";
                        }
                    }
                }
                timeString += " ";
                
                var timeContainer = document.createElement("b");
                var time = document.createElement("time");
                time .setAttribute("datetime", durationString);
                time.appendChild(document.createTextNode(timeString));
                timeContainer.appendChild(time);
                openTimesElems.appendChild(timeContainer);
            }
            
            var openTimeRelative;
            if(timeRelative < 0){
                openTimeRelative = "hat gerade geschlossen";
            }else{
                var timeRelativeHours = Math.round(timeRelative/3600000);
                var timeRelativeMinutes = Math.round((timeRelative-timeRelativeHours)/600000);
if(timeRelativeHours > 0){
 openTimeRelative = "schließt in "+timeRelativeHours+" Stunden und "+timeRelativeMinutes+" Minuten";
}else{
 openTimeRelative = "schließt in "+timeRelativeMinutes+" Minuten";
}
               
            }
            
      
            document.getElementById("openTimeRelative").appendChild(document.createTextNode(openTimeRelative));
        }
    </script>
</head>
<body>
    <p>Der Park hat heute von <span id="openTimes"> </span>Uhr geöffnet</p>
    <p>und <b id="openTimeRelative"></b>.</p>
</body>
</html>
2
ItsNiklas 
Beitragsersteller
 22.05.2020, 14:08
@Destranix

Vielen Dank! Nun bräuchte nur noch eine Hilfe ;) Und zwar möchte ich keinen fetten Text haben und wenn ich span nehme ist zwischen den Wörtern kein Abstand.

0
Destranix  22.05.2020, 14:09
@ItsNiklas

Einfach das b zum div machen. Zudem den timeContainer entfernen und stattdessen time selbst appenden.

0
Destranix  22.05.2020, 14:11
@ItsNiklas

Wobei: Eigentlich müsste es schons ein sopan sein. ich teste das mal schnell.

0
Destranix  22.05.2020, 14:12
@ItsNiklas

Also bei mir geht es mit einem span.

Evtl. hast du irgendein Stylesheet drinnen, das Mist baut?

0
ItsNiklas 
Beitragsersteller
 22.05.2020, 14:16
@Destranix

Ich schau mal... außerdem hat der Park (habe ich ganz vergessen zu schreiben, sorry) verschiedene Öffnungszeiten, an verschiedenen Tagen... da hatte ich folgenden Code:

= date("md"); //Datum als Monat Tag


    if($date >= "0101" && $date <= "0316") { //Zwischen 01. Jan und 16. März
        echo "Öffnungszeiten: 17 - 20 Uhr";
    }elseif($date >= "0317" && $date <= "0419"){ //Zwischen 17. März und 19. Aptil
        echo "Öffnungszeiten: 16 - 20 Uhr";
    }elseif($date >= "0420" && $date <= "0816"){ //Zwischen 19. Aptil und 16. Aug
        echo "Öffnungszeiten: 14 - 20 Uhr";
    }elseif($date >= "0817" && $date <= "1231"){ //Zwischen 17. Aug und 31. Dez
        echo "Öffnungszeiten: 17 - 20 Uhr";
    } 

Kann man den erweitern mit in wieviel Std. und Minuten der Park schließt?

0
Destranix  22.05.2020, 14:32
@ItsNiklas

In meiner Implementierung ist das schon vorgesehen. Du musst nur oben in den Array entsprechend nach Wochentag die Öffnungzeit und die Öffnungsdauer angeben.

Die Öffnungszeit ist UTC.

Also in folgenden Array:

$openTimes = [
        [],
        [],
        [],
        [],
        [["8:30", 200], ["10:00", 120], ["19:00", 200]],
        [],
        []
    ];

Wenn du noch eine besondere Implementierung für bestimmte Wochen brauchst, dann musst du da noch etwas rumbasteln.

0

Die Öffnungszeiten würde ich in einer Textdatei ablegen (CSV) oder etwas aufwändiger in einer SQL-Datenbank.

Das PHP müsste dann nur Darum und Zeit ermitteln und dann aus der Datei die entsprechenden Öffnubgszeiten.

Die Endzeit - Aktuelle Zeit wäre dann du Restliche Zeit - bei kleiner 0 wäre er schon geschlossen