Aloha ;)
ehrlich? Gar nichts ist klar. Ich habe nicht mal Bahnhof verstanden :/
Gut, ich bin sehr für ehrliche Worte 😉 Also gerne noch einmal in kleinen Schritten.
Wir haben schon festgestellt, dass ceil
offenbar auf ganze Stunden rundet. Nur möchtest du leider nicht auf ganze Stunden runden, sondern auf viertel Stunden. Also müssen wir uns überlegen, wie wir ceil
dazu bringen, nicht mehr auf ganze Zahlen, sondern eben auf "viertel Zahlen" zu runden.
Dazu erstmal eine analoge Überlegung. Ich habe einen Wert, sagen wir 633, den ich auf Hunderter genau aufrunden möchte. Ich habe aber nur eine Funktion, die auf Ganze zahlen rundet. Wie könnten wir also vorgehen? Richtig. Wir verschieben das Komma um zwei Stellen. Das macht dann 6,33. Dann können wir die Funktion drüber lassen: ceil(6.33) = 7
. Und dann müssen wir natürlich das Komma wieder um zwei Stellen zurückverschieben: 700. Wir haben also die Zahl auf ein Format gebracht, mit dem die Rundungsfunktion arbeiten kann, und dann haben wir das Format wieder zurückgewandelt.
Ist dir diese Überlegung klar?
Wenn ja, dann abstrahieren wir ein wenig. Was haben wir getan? Wir wollen auf HUNDERTER runden. Zunächst haben wir das Komma um zwei Stellen nach links verschoben - welcher mathematischen Operation entspricht das? - Richtig: Teilen durch hundert. Dann haben wir die Rundungsfunktion angewandt. Und zuletzt haben wir das Komma wieder zwei Stellen nach rechts verschoben, also mal hundert.
Erkennst du vielleicht jetzt schon den Zusammenhang?
Was müssen wir also tun, wenn wir nicht auf hundert, sondern auf viertel runden wollen?
- Teilen durch ein Viertel ( $$\frac{1}{1/4} = 4$$, das Teilen durch ein Viertel entspricht also "Malnehmen mit 4")
- Anwendung von
ceil
- Malnehmen mit ein Viertel (das entspricht "Teilen durch 4")
Ich hoffe es wurde jetzt ein wenig klarer. Ich kann gut verstehen, dass das mit den Vierteln nicht mehr so anschaulich ist, aber mit "runden auf Hunderter" kommt man vielleicht einfacher klar und das, was man mit dem Viertel machen muss, ergibt sich einfach analog.
Außerdem wüsste ich nicht wie ich deine Formel auf mein Beispiel anwenden könnte.
Das zeig ich dir gerne 😀 Aber bitte versuch wirklich zunächst zu verstehen, welche Logik dahintersteht! Solche Rundungs-Manipulationen braucht man öfter und man sollte sie verstanden haben, wenn man sich ernsthaft mit dem Programmieren befasst.
Jedenfalls - angewandt auf dein Beispiel:
$startzeit = strtotime("12:20");
$endzeit = strtotime("14:00");
$dauerInStunden = ($endzeit - $startzeit)/60/60;
$dauerInStundenAufViertelGerundet = ceil($dauerInStunden * 4) / 4;
Die Variablenbezeichner sollen nur verdeutlichen was passiert.
Wenn du es gerne kompakt hättest, in einer Zeile:
$dauerInGerundetenStunden = ceil(($endzeit - $startzeit)/900)/4;
(Ich habe hier benutzt, dass 1/60 * 1/60 * 4 = 1/900)
Grüße,
RIDER
P.S.: Wer glaubt, es stelle ein Problem dar, dass wir ja hier mit Zeitwerten (60er-System) rechnen, der irrt! Ein Viertel ist ein Viertel, egal ob das jetzt 1/4m = 0,25m = 25cm sind oder 1/4h = 0,25h = 15min! Man muss lediglich darauf achten, Bruchteile richtig in die nächstkleinere Einheit umzuwandeln - für die Rundung von Vierteln spielt das überhaupt keine Rolle.