php-script für Datum und Öffnungszeiten?
Hallo,
ich möchte gerne ein php script erstellen womit die aktuellen Öffnungszeiten des Parks angezeigt werden. So soll der Code ungefähr so aussehen:
Heute ist Donnerstag, der 21. Mai 2020.
Der Park hat heute von 9 - 18 Uhr geöffnet
und schließt in 2 Stunden / hat leider bereits geschlossen.
So möchte ich gerne in einem php-script gerne die Öffnungszeiten hinterlegen sowie das aktuelle Datum. Hinzu soll es automatisch anzeigen wann der Park schließt, bzw. wenn er bereits geschlossen hat soll er den Text "hat leider bereits geschlossen" anzeige. Kann man sowas umsetzen?
Viele Grüße
Niklas
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.
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>
Vielen Dank! Ich möchte nun doch nicht das es den aktuellen Tag anzeigt, könntest du das vielleicht noch für mich entfernen? ;)
Außer soll er wenn es noch unter 60 Minuten sind nur die Minuten anzeigen und nicht noch 0 Stunden.
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>
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.
Einfach das b zum div machen. Zudem den timeContainer entfernen und stattdessen time selbst appenden.
Wobei: Eigentlich müsste es schons ein sopan sein. ich teste das mal schnell.
Also bei mir geht es mit einem span.
Evtl. hast du irgendein Stylesheet drinnen, das Mist baut?
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?
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.
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
Der Script wäre in einer PHP-Datei. Kannst du mir dabei helfen?