kleines Script um Zeiten von verschiedenen Treffen zu berechnen

Muckel1986

Erfahrenes Mitglied
Guten Morgen zusammen,

eine Freundin von mir hat nun einen Partner gefunden, jedoch führen die beiden eine Fernbeziehung und können sich daher nicht immer sehen. Da sie durch die Gesundheit ein paar Konzentrationsschwierigkeiten hat, fragte sie mich, ob ich ihr ein Script basteln könne, welches die Treffen des Paares auflistet und dazu die Dauer berechnet und auch die Wartezeit zwischen den Treffen.

Der erste Versuch bezog sich lediglich auf ein Countdown Script. Dank eurer Hilfe habe ich mir dann schon das umgehen mit der Zeit in php ein wenig angeeignet und hoffe nun, dass ihr mir bei der letzten Verbesserung auch noch helfen könnt.

Das Script ist im Moment so aufgebaut, dass ich für jedes Treffen drei Variable definiere:
PHP:
	// 1. Treffen
		$treffen_1_start = strtotime("27.12.2010 14:02:00"); 	// Beginn
		$treffen_1_ende = strtotime("08.01.2011 12:00:00"); 	// Ende
		$treffen_1_dauer = (($treffen_1_ende - $treffen_1_start) / 86400);	// Dauer
So kann zu jedem Treffen Datum und Uhrzeit angegeben werden und es wird gleich die Dauer des Treffens errechnet.

Im zweiten Teil gibt es dann die Berechnung der Wartezeit zwischen den einzelnen Treffen, welches ich so gelöst habe:
PHP:
	// Wartezeit 1
		$warten_1 = (($treffen_1_start - $kontakt) / 86400); 	// Zeit zw. Ersten Kontakt und 1. Treffen
	// Wartezeit 2
		$warten_2 = (($treffen_2_start - $treffen_1_ende) / 86400); 	// Zeit zwischen den Treffen

Das kleine Script soll dann auch ausgeben, wie lange es noch bis zu dem nächsten Treffen ist. Mir ist bewusst, dass dies nur bei dem Seitenaufruf oder dem Aktualisieren der Seite geschieht, doch das reicht aus. Umgesetzt habe ich das so:
PHP:
	// Uebrige Zeit zum Treffen
	$counter_5 = (($treffen_5_start - $heute) / 86400);
	
	$counter_5_sec = abs($treffen_5_start - $heute);	// Sekunden
	$counter_5_min = intval($counter_5_sec / 60);		// Minuten
	$counter_5_sec %= 60;	// Verhältnis zw sec und min
	$counter_5_h = intval($counter_5_min / 60);		// Stunden
	$counter_5_min %= 60;	// Verhältnis zw min und h
	$counter_5_d = intval($counter_5_h / 24);		// Tag
	$counter_5_h %= 24;	// Verhältnis h zu Tag

Die letzte Berechnung ist dann die, dass ausgegeben werden soll, wie lange sich die beiden getroffen haben. Das habe ich so gelöst:
PHP:
	// Berechnen der Gesamt-Zeit unserer Treffen
		$gesamt_haben = round(($treffen_1_dauer + $treffen_2_dauer + $treffen_3_dauer + $treffen_4_dauer + $treffen_5_dauer),2);

Nun komme ich zu meinem Problem. Am Ende von dem Script habe ich eine Tabelle, in der die einzelnen Treffen aufgelistet sind und damit auch die Dauer und die Wartezeit zum kommenden Treffen. Das gibt es hier zu sehen.

Die Tabelle habe ich im Moment mit einem WYSIWYG-Editor erstellt. Das hat aber den Nachteil, dass ich für jedes neue Treffen auch eine neue Zeile einfügen muss und in jener auch die leicht veränderte PHP-Variable.

Meine Variablen haben schon eine Fortlaufendezahl, damit ich so sehr einfach die entsprechende Zeilen kopieren konnte und nur noch die Zahl verändern braucht.

Meine Idee ist nun, dass ich mir die fortlaufende Nummerierung zu nutze mache und das Script so um stelle, dass die Dauer des Treffen, die Wartezeiten dazwischen und die Tabelle automatisch erzeugt wird. Das Pärchen ist nun bei dem 5. Treffen. Also dachte ich mir, dass ich am Anfang des Scriptes noch eine Variable setzte, die lediglich die fortlaufende Nummer des aktuellen Treffen enthält. Zum Beispiel also
PHP:
$aktuell = 5;

Meine erste und wichtigste Frage wäre nun, wie ich in einer Variable noch eine Variable unterbringe. Also wie ich bei dieser Zeile
PHP:
$treffen_1_dauer = (($treffen_1_ende - $treffen_1_start) / 86400);	// Dauer
die Zahlen durch eine Variable ersetzten kann, ohne das es die restliche Variable "beschädigt".

Bei dieser Zeile muss ich eine Möglichkeit finden, wie ich es umsetzten kann, dass sie bis zur Anzahl der eingetragenen Variable (also der 5) wiederholt wird und das bei jeder wiederholung die Zahl 1 um 1 erhöht wird. Müsste für die Berechnung dann dieses erhalten:
PHP:
$treffen_1_dauer = (($treffen_1_ende - $treffen_1_start) / 86400);	// Dauer
$treffen_2_dauer = (($treffen_2_ende - $treffen_2_start) / 86400);	// Dauer
$treffen_3_dauer = (($treffen_3_ende - $treffen_3_start) / 86400);	// Dauer
$treffen_4_dauer = (($treffen_4_ende - $treffen_4_start) / 86400);	// Dauer
$treffen_5_dauer = (($treffen_5_ende - $treffen_5_start) / 86400);	// Dauer
Und genau in diesem Bereich muss ich mein Wissen erweitern und hoffe, dass ihr mir helfen könnt.

Insgesamt muss ich am Ende diese PHP-Code Zeilen abändern
PHP:
<?php
// Vordefinierte Werte
// ===================

	// Aktuelles Datum und aktuelle Uhrzeit mit dem Zeitstempel
		$datum = date("d.m.Y");		// Aktuelles Datum
		$zeit = date("H:i:s");		// Aktuelle Uhrzeit
		$heute = mktime();			// Zeitstempel

	// Variable mit der fortlaufenden Nummer des anstehenden Treffen
		$naechstes = 5; // Zahl des anstehenden Treffen

// Zeitpunkte der Treffen mit Start, Ende und der Dauer
// ====================================================

	// Erster Kontakt
		$kontakt = strtotime("22.09.2010 14:34:00"); // Erster Kontakt auf gofeminin.de
	// 1. Treffen
		$treffen_1_start = strtotime("27.12.2010 14:02:00"); 	// Beginn
		$treffen_1_ende = strtotime("08.01.2011 12:00:00"); 	// Ende
	// 2. Treffen
		$treffen_2_start = strtotime("16.02.2011 13:02:00"); 	// Beginn
		$treffen_2_ende = strtotime("01.03.2011 12:00:00"); 	// Ende
	// 3. Treffen
		$treffen_3_start = strtotime("21.04.2011 16:05:44"); 	// Beginn
		$treffen_3_ende = strtotime("26.04.2011  12:00:00");	// Ende
	// 4. Treffen
		$treffen_4_start = strtotime("01.06.2011 15:12:45"); 	// Beginn
		$treffen_4_ende = strtotime("13.06.2011 11:41:55");	// Ende
	// 5. Treffen
		$treffen_5_start = strtotime("06.08.2011 11:41:00"); 	// Beginn
		$treffen_5_ende = strtotime("20.08.2011 12:25:00");	// Ende

	// Achtung, die folgenden sind nur aufgeführt, damit ich später nur das Datum und die Uhrzeit eintragen brauch
	
	// 6. Treffen
		$treffen_6_start = strtotime("01.09.2011 13:02:00"); 	// Beginn
		$treffen_6_ende = strtotime("07.09.2011 12:00:00");	// Ende
	// 7. Treffen
		$treffen_7_start = strtotime("01.10.2011 13:02:00"); 	// Beginn
		$treffen_7_ende = strtotime("07.10.2011 12:00:00");	// Ende



// Berechnung der dauer der jeweiligen Treffen
// ===========================================

	$treffen_1_dauer = (($treffen_1_ende - $treffen_1_start) / 86400);	// Dauer



// Berechnung der Wartezeiten
// ==========================

		$warten_1 = (($treffen_1_start - $kontakt) / 86400); 	// Zeit zw. Ersten Kontakt und 1. Treffen



// Errechnen der aktuellen Zeit bis zum Treffen
// ============================================

	// Uebrige Zeit zum Treffen
	$counter_5 = (($treffen_5_start - $heute) / 86400);
	
	$counter_5_sec = abs($treffen_5_start - $heute);	// Sekunden
	$counter_5_min = intval($counter_5_sec / 60);		// Minuten
	$counter_5_sec %= 60;	// Verhältnis zw sec und min
	$counter_5_h = intval($counter_5_min / 60);		// Stunden
	$counter_5_min %= 60;	// Verhältnis zw min und h
	$counter_5_d = intval($counter_5_h / 24);		// Tag
	$counter_5_h %= 24;	// Verhältnis h zu Tag



// Berechnung der Gesamt Zeiten
// ============================

	// Berechnen der Gesamt-Zeit unserer Treffen
		$gesamt_haben = round(($treffen_1_dauer + $treffen_2_dauer + $treffen_3_dauer + $treffen_4_dauer + $treffen_5_dauer),2);
	
?>
Und dann noch die Tabelle.

Eine fertige Lösung möchte ich von euch nicht haben, sondern lieber Tipps, Hinweise und Ratschläge.

Denn ähnlich wie bei der guten Freundin habe auch ich einpaar gesundheitliche Baustellen, weshalb ich schon starke Schmerzmittel nehmen muss. Diese wirken sich auch auf meine Konzentration usw. aus, so dass ich mir manches zum wiederholten male aneignen muss oder es bei manchen Situationen nicht auf anhieb "klick" macht.

Aufgeben zählt aber nicht, denn man soll sich ja so viel vom Leben erhalten, wie es irgendwie geht. Daher hoffe ich, dass ihr Verständnis dafür habt.

Lieben Gruß
Tobias
 
Guten Morgen,

habe selbst nun einfach mal die Variable $aktuell mit einer if else Bedingung (oder Schleife?) getestet um zu schauen, ob php die geschriebene Zahl überhaupt beachtet. Dies klappt auch:
In der Variable aktuell steht der Wert 5. Die Bedingung ist also wahr.
Getestet habe ich das mit diesen kurzen Zeilen:
PHP:
<?php
	// Versuch zu schauen, wie man sich auf die Zahl der Variable beziehen kann
	if ($aktuell == 5) {
		echo "In der Variable <em>aktuell</em> steht der Wert " . $aktuell . ". <strong>Die Bedingung ist also wahr.</strong>";
		}	else {
			echo "In der Variable <em>aktuell</em> steht nicht der Wert 5. Die Variable hat den Inhalt: " . $aktuell . ". <strong>Somit ist die Bedingung nicht wahr.</strong>"; }
?>
Zu vor in der Datei ist die Variable definiert:
PHP:
	// Variable mit der fortlaufenden Nummer des anstehenden Treffen
		$aktuell = "5"; // Zahl des anstehenden Treffen

Nun könnte ich die if-Schleifen so wiederholen, bis sie bei dem Wert 5 ankommt, doch ist das der richtige Weg? Selbst wenn, wüsste ich gerade nicht, wie ich das machen könnte.

Hoffe ihr habt Tipps für mich! Nun aber erstmal gute Nacht!
 
Schau Dir mal Schleifen und Arrays an, das macht die Sache sehr viel pflegeleichter - und vor Allem effizienter.

PHP:
// dies ist ein array im array mit (anfang, ende)
// also ein zweidimensionales Variablenfeld
$zeiten= array(
array( 1987, 2000),
array( 2005, 2007),
array( 2010, 2015),
array( 2020, 2039)
);

// anzahl der einträge in $zeiten auslesen
$counted = count($zeiten);

// und eine schleife, die jedes array im array durchgeht
for($i;$i<$counted;$i++)
{
   echo "Eintrag ".$i."</br>";
   echo "Anfangszeit :".$zeiten[$i][0]."</br>";
   echo "Endzeit :".$zeiten[$i][1]."</br>";
}

// genauso einfach mit foreach()
foreach($zeiten as $treffen)
{
   echo "Anfangszeit :".$treffen[0]."</br>";
   echo "Endzeit :".$treffen[1]."</br>";
}

mfg chmee
 
Zuletzt bearbeitet:
Guten Tag und vielen Dank für Deine Antwort!

Dein Beispiel klingt interessant, doch es geht mir ja nicht nur um die Jahreszahl. Bei meiner Variante berücksichtige ich die Uhrzeit und das dazugehörige Datum. Die Uhrzeit bezieht sich auf die Ankunftszeit des Zuges oder seiner Abfahrtszeit (je nachdem ob es der Anfang oder das Ende ist).

Berücksichtigt das array dann auch das komplette Datum mit Uhrzeit?
 
Was im Array drinsteht, ist herzlich egal. Da Du solche Fragen stellst, nehme ich an, dass Du mit Programmieren (noch) nicht lange zu tun hast..

Jenes Array könnte auch so aussehen:
PHP:
$zeiten= array(
array("27.12.2010 14:02:00","08.01.2011 12:00:00")
); 

// und eine Schleife dazu
foreach($zeiten as $meeting)
echo strtotime($meeting[0])." bis ".strtotime[$meeting[1])."<br/>";
Ein Array ist eine Liste von Variablen - egal welcher Art, die per Index angesprochen werden können. In meinem Beispiel mach ich den zweiten Schritt und packe eine Liste von Einträgen in eine weitere Liste, das ergibt ein 2dimensionales Listenfeld, analog zu einer Exceltabelle, welches man mit Position X und Position Y ansprechen kann.

mfg chmee
 
Zuletzt bearbeitet:
Hallo zusammen,

irgendwie gibt es da noch eine Schwierigkeit. Hab es jetzt mit Zahlen und dem Datum getestet. Bekomme davon folgende Ausgabe:
Test mit Datum

Eintrag
Anfangszeit :
Endzeit :

Eintrag 1
Anfangszeit :16.02.2011
Endzeit :01.03.2011

Eintrag 2
Anfangszeit :21.04.2011
Endzeit :26.04.2011

Eintrag 3
Anfangszeit :01.06.2011
Endzeit :13.06.2011

Eintrag 4
Anfangszeit :06.08.2011
Endzeit :20.08.2011
Test mit Zahlen

Eintrag
Anfangszeit :
Endzeit :

Eintrag 1
Anfangszeit :3
Endzeit :4

Eintrag 2
Anfangszeit :5
Endzeit :6

Eintrag 3
Anfangszeit :7
Endzeit :8

Eintrag 4
Anfangszeit :9
Endzeit :10
Genutzt habe ich dafür Deine Code-Zeilen. Lediglich den Namen der Variable habe ich am Anfang geändert, damit es für mich verständlicher ist. Für den Test der Zahlen, habe ich die Variablen auch umgenannt, damit für zwei verschiedene Sachen in dem Script nicht die selbe Variable gesetzt wird:
PHP:
// Angabe der Treffen in einem Array1
	$treffen = array(
		array( '27.12.2010', '08.01.2011'),
		array( '16.02.2011', '01.03.2011'),
		array( '21.04.2011', '26.04.2011'),
		array( '01.06.2011', '13.06.2011'),
		array( '06.08.2011', '20.08.2011')
	);


// anzahl der Einträge in $treffen auslesen
	$counted = count($treffen);

// und eine schleife, die jedes array im array durchgeht
	for($i;$i<$counted;$i++)
		{
		echo "<p>Eintrag ".$i."</br>";
		echo "Anfangszeit :".$treffen[$i][0]."</br>";
		echo "Endzeit :".$treffen[$i][1]."</p>";
		}

echo ("<h1>Test mit Zahlen</h1>");

// Angabe der Treffen in einem Array 2
	$zahlen = array(
		array( 1, 2),
		array( 3, 4),
		array( 5, 6),
		array( 7, 8),
		array( 9, 10)
	);

// anzahl der Einträge in $treffen auslesen
	$zaehlen = count($zahlen);

// und eine schleife, die jedes array im array durchgeht
	for($x;$x<$zaehlen;$x++)
		{
		echo "<p>Eintrag ".$x."</br>";
		echo "Anfangszeit :".$zahlen[$x][0]."</br>";
		echo "Endzeit :".$zahlen[$x][1]."</p>";
		}
Das Array klappt auch zu 99%, nur das jeweilig erste Array wird nicht berücksichtigt. Doch ich weiß im Moment nicht, woran das liegt.

Dann habe ich zu der Zahl in den Eckigen Klammern eine Frage. Da gibt es ja 0 und 1. Bezieht sich das auf die Einträge im jeweiligen Array? Also 0 = erster Eintrag, 1 = zweiter Wert im Array. Sehe ich das so richtig?

Lieben Gruß
Tobias
 
sorry, hab den Fehler gesehen. In der For-Schleife, muß der Zähler $i initialisiert , also auf 0 gesetzt werden

PHP:
for($i=0;$i<$counted;$i++)
{
#---
}

Zur Frage: Ja, die Zählung fängt idR bei 0 an, erster Eintrag ist [0].

mfg chmee
 
Guten Tag zusammen,

das ganze hat soweit schonmal geklappt und ich habe in der Schleife nun auch die Tabelle geschrieben, so das sie sich eben auch "automatisch"vervollständigt.

Als nächstes möchte ich nun die Dauer der Treffen und die Wartezeit berechnen. Da es aber gleich Mittagessen gibt, wird das erst nacher etwas.

Der Code schaut nun so aus:
PHP:
// Datum des ersten Kontaktes
	$kontakt = strtotime("22.09.2010 14:34:00"); // Erster Kontakt auf einer Internetseite

// Angabe der Treffen in einem Array1
	$treffen = array(
		array( '27.12.2010', '08.01.2011'),
		array( '16.02.2011', '01.03.2011'),
		array( '21.04.2011', '26.04.2011'),
		array( '01.06.2011', '13.06.2011'),
		array( '06.08.2011', '20.08.2011')
	);

// anzahl der Einträge in $treffen auslesen
	$counted = count($treffen);

echo ("<h1>Testen der Ausgabe in einer Tabelle</h1>");

// Ausgabe des Tabellen-Kopfes
echo "<table id=\"uebersicht\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\" >
  <tr>
    <th align=\"center\" valign=\"middle\" scope=\"col\">Nr</th>
    <th align=\"center\" valign=\"middle\" scope=\"col\">Wartezeit</th>
    <th align=\"center\" valign=\"middle\" scope=\"col\">Beginn</th>
    <th align=\"center\" valign=\"middle\" scope=\"col\">Ende</th>
    <th align=\"center\" valign=\"middle\" scope=\"col\">Dauer</th>
    <th align=\"left\" valign=\"top\" scope=\"col\">Bemerkung</th>
  </tr>";
// Ausgabe der übrigen Tabelle mit der Schleife
	for($i=0;$i<$counted;$i++)
		{
		echo "<tr>";
		echo "<td>".$i."</td>";
		echo "<td>Wartezeit</td>";
		echo "<td>".$treffen[$i][0]."</td>";
		echo "<td>".$treffen[$i][1]."</td>";
		echo "<td>Dauer</td>";
		echo "<td>Bermerkung</td>";
		echo "</tr>";
		}
	echo "</table>";
 
Hi,

wenn du die einzelnen Einträge mittels der strtotime()-Funktion umrechnest, kannst du mit ihnen wunderbar rechnen. Die Datumse werden in den sogenannten Unix-Timestamp umgerechnet. Dieser ist ein Integerwert mit den Anzahl der Sekunden, die seit dem 1.1.1970 vergangen sind.

Du wandelst also beide Werte in diesen Unixtimestamp um, berechnest die Differenz und rechnest die Sekunden in die gewünschte Einheit um.

Best regards
 
Hallo zusammen,

habe in der IF-Schleife nun eine Variable Namens dauer gesetzt, in der ich die Werte von einander abziehe und das Ergebnis dann auf 2 Stellen Runde. Im PHP-Code sieht das so aus:
PHP:
// Ausgabe der übrigen Tabelle mit der Schleife
	for($i=0;$i<$counted;$i++)
		{
		$dauer = round(($treffen[$i][1] - $treffen[$i][0]),2);
		echo "<tr>";
			echo "<td>".$i."</td>";
			echo "<td>Wartezeit<br /></td>";
			echo "<td>".$treffen[$i][0]."</td>";
			echo "<td>".$treffen[$i][1]."</td>";
			echo "<td>Dauer<br />" . $dauer . "</td>";
			echo "<td>Bermerkung</td>";
		echo "</tr>";
		}
Problem ist "nur", dass es nicht klappt, wenn während des Treffens auch ein Monatswechsel ist. Ist jener da, dann erscheint vor der Ausgabe ein Minuszeichen, welches ich mir nicht erklären kann. Zu sehen gibt es das hier.
 

Neue Beiträge

Zurück