Frage von schooln00b77, 21

Zeitraum per Cookie berechnen?

Bei meiner letzten Frage hat mir kingbongo schon echt geholfen, aber ich schaffe es einfach nicht, dass der Zeitraum über einen Cookie berechnet wird :( Der Cookie mit dem ersten Datum heißt "from" und der zweite "to". Kann da einer helfen?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von mastema666, 21

In welchem Format ist das Datum / die Zeit denn in den Cookies gespeichert?

Und in welcher Sprache willst du den Zeitraum ermitteln?

Grundsätzlich ist das jedenfalls nur eine ganz einfache Subtraktion.

Kommentar von schooln00b77 ,

In der ersten Seite wird das Datum über eun Input Feld eingegeben:

<form action="seite2.php" method="post">
<input type="text" name="from">
<input type="text" name="to">
</form>

Auf der 2. Seite als Cookie gespeichert:

<?php
$varfrom = $_POST["from"];
setcookie("from", $varfrom, 0);
$varto = $_POST["to"];
setcookie("to", $varto, 0);
?>

Und auf der 3. soll es ausgelesen werden:

$date_uglyfrom = $_COOKIE["from"];
$date_uglyto = $_COOKIE["to"];
$date_nicefrom = str_replace('+', '/', substr($date_uglyfrom, strpos($date_uglyfrom, '+') + 1) );
$date_niceto = str_replace('+', '/', substr($date_uglyto, strpos($date_uglyto, '+') + 1) );
$date_a = date_create_from_format('d/M/Y', $date_nicefrom)->getTimestamp();
$date_b = date_create_from_format('d/M/Y', $date_niceto)->getTimestamp();
echo "Anzahl Tage:" . floor( ($date_a - $date_b) /(60*60*24));

Nur.. es klappt nicht.

Danke :)

Kommentar von coding24 ,

Was klappt denn nicht? Stehen die Zeiten auch korrekt gespeichert im Cookie?

Hast du das Ganze mal debugged und geprüft, ab welcher Stelle es nicht funktioniert?

Kommentar von schooln00b77 ,

Es kommt ein fatal error dass er getTimestamp nicht auf ein Boolean anwenden kann, aber das ist doch kein Boolean! Ahhhh ich bin am verzweifeln.. Danke für die Hilfe

Kommentar von mastema666 ,

Dann ist vermutlich die Umwandlung in ein Datumsobjekt fehlgeschlagen, dann würde "date_create_from_format()" nämlich "FALSE" (also einen Boolean Wert) zurückgeben.

Hast du mal geprüft, was denn in dem Cookie steht bzw was du an date_create_from_format() übergibst (z.B. einfach je eine Zeile davor per var_dump($var) ausgeben)? Wahrscheinlich ist nämlich entweder schon im Cookie ein falsches Format gespeichert oder die Umwandlung mit str_replace() danach ist fehlerhaft (wird das Datum wirklich als z.B. "09+09+2016" eingegeben? So müsste es nämlich sein, damit der str_replace() funktioniert.).

Kommentar von schooln00b77 ,

Okay... der Inhalt ist z.B. "Montag%2C+12+September+2016"... weißt du ein umwandlungscode? Danke ;)

Kommentar von schooln00b77 ,

Und hier einmal der genaue Fehler:

Fatal error: Call to a member function getTimestamp() on boolean in ... on line ...
Kommentar von mastema666 ,

Jo,der Fehler kommt, weil der übergebene String kein Datum im Format "d/M/Y" ist.

Ich würde das Datum einfach direkt in einem passenden Format eingeben auf der Seite mit dem Formular. So wie es jetzt ist müsstest du halt sicher gehen, dass es auch immer in genau diesem Format eingegeben wird, sonst funktioniert es wieder nicht.

Wenn du sicher bist, dass das Datum immer genau so wie oben eingegeben wird, sollte das z.B. so funktionieren, dass du das Datum aus dem Cookie erstmal mit urldecode() in einen ordentlichen Datums-String umwandelst und dann mit strtotime() in einen Unix-Timestamp.


Damit kannst du dann direkt weiter rechnen ohne die Zwischenschritte mit "str_replace()" und "date_create_from_format()", macht das Ganze auch etwas kürzer, also z.B. einfach so: 

$from = strtotime(urldecode($_COOKIE["from"]));
$to = strtotime(urldecode($_COOKIE["to"])); echo "Anzahl Tage:" . floor(($to - $from)/86400);
Kommentar von schooln00b77 ,

Danke, ich probiers mal aus :)

Kommentar von schooln00b77 ,

Ich bin zu doof dafür xD

Er zeigt jetzt zwar keinen Error mehr an aber der Wert ist immer 0.

Aber trotzdem danke...

Kommentar von schooln00b77 ,

Okay, ich bin einen Schritt weiter. Ich hab das Format jetzt auf "dd/MM/yy" geändert, und jetzt geht es. Allerdings ohne das "/86400"

Jetzt sieht es so aus:

echo "Anzahl Tage:" . floor(($to - $from));

Zur Not lass ich es so, aber wenns auch mit dem Format "DD, dd/MM/yy" gehen würde..

Danke :)

Kommentar von mastema666 ,

Wird an der Sprache liegen, der Tag ist ja auf deutsch, mit einer kleinen Anpassung sollte es aber jetzt funktionieren:

$from = $_COOKIE['from'];
$to = $_COOKIE['to'];
$de = array('Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag');
$en = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
$from = str_replace($de, $en, $from);
$to = str_replace($de, $en, $to);
$from = strtotime(urldecode($from));
$to = strtotime(urldecode($to));
echo "Anzahl Tage:" . floor(($to - $from)/86400);

Wenn das Datum das gegebene Format hat, dann funktionierts:  http://phpfiddle.org/main/code/q1r7-vz58

Kommentar von mastema666 ,

Was genau funktioniert denn nicht? Gibts ne Fehlermeldung, kommt das falsche raus, oder was?

Also ich würde das ja so machen, dass man das Datum direkt in einem passenden Format eingeben muss, dann sparst du dir auch die Schritte mit dem "ugly to nice" (und man muss das Datum ja sowieso auch jetzt schon in einem festen Format eingeben, warum also nicht gleich ein passendes?).

Ansonsten fällt mir da auf den ersten Blick nur eins auf, und zwar, dass du $date_a - $date_b rechnest, es müsste aber umgekehrt sein, denn $date_a ist ja der "from" Wert, also wenn nur das falsche Ergebnis rauskommt liegts möglicherweise daran.

Antwort
von Typhus, 14

Speichere in beiden Cookies UNIX Zeitstempel und subtrahiere dann den kleineren vom Größeren. Deinen Zeitraum erhälst du dann in Sekunden.

Antwort
von LeonardM, 19

Am einfachsten wärs mit der timestamp ^^

Keine passende Antwort gefunden?

Fragen Sie die Community