Zuerst mal sorry für die späte Antwort - aber die Schule droht hier so kurz vor dem Abi tatsächlich nochmal etwas stressig zu werden
FreedomCall hat gesagt.:
Zu deinem Beispiel: das Grundprinzip hab ich soweit verstanden, dein Beispiel hingegen nicht!
Ich meine, die Rechnung "22:10 - 20:45" ergibt 01:25, das weiß ich (durch nachrechnen
) auch.
Nichtsdestotrotz peil' ich nicht ganz, warum du "45 auf 70" rechnest und nicht "45 auf 100" (BtW: bei uns heißt das nicht "auf", sondern "bis" - aber das ist ja egal, ich versteh' ja, was du meinst
).
Gegenfrage: Wieso sollte man "45 auf 100" rechnen? Beim schriftlichen Subtrahieren von Zahlen rechnest du ja bspw. als ersten Schritt auch nicht "5 auf 10", wenn du 262 - 15 ausrechnest, sondern "5 auf 12". Dieses 12 ergibt sich einfach dadurch, dass man die "2" nimmt, die Minuenden steht, und die nächsthöhere Stelle dieser Zahl mit einer "1" besetzt. Also wird aus "2" eine "12".
Analog verhält es sich bei den Zeiten. Ich nehme die 10 Minuten vom Minuenden und besetze die nächsthöhere Stelle (die Stunden) mit einer "1" und erhalte somit 1 Stunde + 10 Minuten. Und das sind natürlich 60 Minuten + 10 Minuten = 70 Minuten.
Würde man jetzt beispielsweise mit Tagen und Stunden rechnen, und sagen wir mal... 7d 6h - 3d 17h rechnen, dann würde das so aussehen:
Code:
7d 6h
- 3d 17h
1d
--------
3d 13h
Sprich: 17h auf 6h -> geht nicht, also Übertrag: 17h auf 1d 6h -> 17h auf 24h+6h -> 17h auf 30h = 13h. 13h an, 1d gemerkt. Und dann 4d auf 7d = 3d. 3d an.
Alles klar?
Der Rest ist dann soweit einleuchtend - bis auf diesen Passus:
Warum willst du die Anzahl der Tage des Vormonats hinzuzählen?
Und wie stellst du dabei sicher, dass korrekt gerechnet wird (manche Monate haben 30, manche 31, andere 28, teilweise 29)
Mit den Monaten war es etwas kniffliger. Aber auch hier geht es darum, bei der Berechnung mit Tagen und Monaten die nächsthöhere Stelle mit "1" zu besetzen. Aber wie rechnet man jetzt 1 Monat in Tage um? Am besten mach ich wieder ein Beispiel, vielleicht wird's dann einleuchtend...
Nehmen wir mal an, wir befinden uns auf dem Planeten "Gnarz", auf dem die Monate ziemlich kurz sind. Die ersten vier Monate eines Gnarz-Jahres (Foo, Bar, Fork und Dork) sind 4, 3, 5 und 4 Tage lang. Zwibbeldrop, ein Bewohner von Gnarz, wurde nun am 3. Foo geboren. Momentan haben wir den 2. Dork, und Zwibbeldrop will jetzt wissen, wie alt er heute ist.
Code:
Foo Bar Fork Dork
_______ _______ _______ _______
|_______||___.___||___.___||___.___|
|_______||___.___||___.___||___H___|
|___Z___||___o___||___o___||_______|
|___.___| |___.___||_______|
|___.___|
4d 3d 5d 4d
"Z" kennzeichnet den Geburtstag unseren Gnarzmännchens und "H" den momentanen Gnarztag. Die Punkte bezeichnen den zu berechnenden Zeitraum. Wir wollen also folgendes berechnen:
Also Schema F angewandt und gedacht:
3d auf 1m 2d sind...? Hm. Was wollen wir da eigentlich in diesem Schritt berechnen? Ach ja, die Tage der Zeitdifferenz. Aber da ist es doch vollkommen egal, in welchem Monat Zwibbeldrop Geburtstag hatte - so lange der Tag des Monats gleich bleibt (der 3.), kann er auch am 3. Bar oder am 3. Fork (die "o" im Kalender) gehabt haben. Wenn wir seinen Geburtstag in Monatsschritten verschieben, ändert sich am Alter von Zwibbeldrop nur der Monatsanteil. Prima. Aber bringt uns das? Wir können nun die Berechnung der Tagesdifferenz vereinfachen, indem wir den Geburtstag auf den 3. Fork legen - also auf den Monat, der vor dem Dork kommt. (In den Dork selber können wir ihn natürlich nicht verlegen, denn sonst wäre unser kleiner Kamerad ja noch überhaupt nicht geboren.)
Aber wie berechnen wir jetzt die Tage zwischen dem dem 3. Fork und dem 2. Dork? Zeichnen wir den Kalender von Fork und Dork doch mal etwas anders:
Code:
_______
|___.___| <- 1. Fork
|___.___|
|___o___|
|___.___|
|___.___|
_______
|___.___| <- 1. Dork
|___x___|
|_______|
|_______|
Jetzt sollte man es schon fast auf den ersten Blick erkennen: Wenn wir die entsprechenden Tage vom 1. Fork aus zählen, dann ist der 3. Fork auf Position 3. Der 2. Dork liegt auf Position 5 + 2 (5 Tage vom Fork + 2. Tag vom Dork). Und die Differenz daraus... 3 auf 7... Moment, das kommt uns doch bekannt vor! Genau, das ist doch
3d auf 1m 2d, nur dass wir 1m durch 5d ersetzt haben. Und diese 5d sind - genau, die Länge des Vormonats in Tagen. Flugs ausgerechnet ergibt das 4d. Der Rest der Rechnung gestaltet sich einfach: 4d an, 1m gemerkt:
Code:
4m 2d
- 1m 3d
1m
-------
2m 4d
Hurra, fertig! Zwibbeldrop ist also 2 Monate und 4 Tage alt.
Das ganze verläuft absolut analog für Erdenjahre und Monate. Und die Länge der Monate ermittle ich in meinem Code mit der schönen Funktion monthdays (die steht ganz am Anfang
), die ich so aufrufe:
$diff['D'] += monthdays($t2['M']-1, $t2['Y']); Warum, sollte nun hoffentlich klar sein
So, und jetzt muss ich los nach Gnarz. Mit 2 Monaten und 4 Tagen ist man dort nämlich volljährig, was immer mit einem rauschenden Fest gefeiert wird. Und da ich Zwibbeldrop recht gut kenne... ;-)