date() / time() / mktime() - Verwirrung bei Datumsberechnung
paco
- php
Hallo!
Ich versuche eine simple Methode zu finden um ein festgelegtes Datum ($frist) mit dem aktuellen Datum zu vergleichen und die Differenz weiterzuverarbeiten.
Mein Ansatz:
Frist wird aus einem mySQL-Date-Feld ausgelesen und mit mktime() in Sekunden umgerechnet. Dann das aktuelle Datum mit date() ermittelt und mit mktime() umgerechnet. Als Ergebnis der Subtraktion müßte ich doch dann die Sekunden bekommen, was mir dann (mit ergebnis/(60*60*24)) die übrigen Tage liefert. Ich habe bereits festgestellt, daß mir time() und mktime(date("Y-m-d")) zwei unterschiedliche Werte liefern, aber auch wenn ich nur date() benutze bekomme ich keine vernünftigen Werte.
Mein testscript sieht folgendermaßen aus:
function ontime($frist) {
$timestamp = time();
$datum_aktuell = date("Y-m-d");
$datum_aktuell_sec = mktime($datum_aktuell);
$frist_sec = mktime($frist);
$differenz = ($frist_sec - $datum_aktuell_sec);
echo 'Frist: ' . $frist . '<br />';
echo 'aktuelles Datum (ueber date): ' . $datum_aktuell . '<br />';
echo 'aktuelles Datum in Sekunden aus time(): ' . $timestamp . '<br />';
echo 'aktuelles Datum in sekunden aus date(): ' . $datum_aktuell_sec . '<br />';
echo 'Frist in Sekunden: ' . $frist_sec . '<br />';
echo 'Differenz in Sekunden: ' . $differenz . '<br />';
.. und liefert mir z. B. folgendes:
Frist: 2009-05-13
aktuelles Datum (ueber date): 2009-05-12
aktuelles Datum in Sekunden aus time(): 1242130997
aktuelles Datum in sekunden aus date(): 1249312997
Frist in Sekunden: 1249312997
Differenz in Sekunden: 0
Wo liegt denn mein Denkfehler? Wieso bekomme ich bei mktime($frist) und bei mktime($datum_aktuell) das gleiche Ergebnis??
Bin verwirrt und für jeden Hinweis dankbar.
Liebe Grüße und schonmal vielen Dank,
Paco
Hi paco!
Wo liegt denn mein Denkfehler? Wieso bekomme ich bei mktime($frist) und bei mktime($datum_aktuell) das gleiche Ergebnis??
Du solltest dir nochmal anschauen, welche Parameter mktime() erwartet.
MfG H☼psel
Hi paco!
»» Wo liegt denn mein Denkfehler? Wieso bekomme ich bei mktime($frist) und bei mktime($datum_aktuell) das gleiche Ergebnis??
Du solltest dir nochmal anschauen, welche Parameter mktime() erwartet.MfG H☼psel
Ok, ich verstehe was du meinst. Aber heißt das, ich muß mein datum (z.B. $datum = 2009-05-12) erst wieder aufdröseln, in $jahr, $monat und $tag, um dann mktime damit zu füttern? a la mktime(0,0,0, $monat, $tag, $jahr)?
Geht das nicht einfacher?
lg
Paco
Hi paco!
Ok, ich verstehe was du meinst. Aber heißt das, ich muß mein datum (z.B. $datum = 2009-05-12) erst wieder aufdröseln, in $jahr, $monat und $tag, um dann mktime damit zu füttern? a la mktime(0,0,0, $monat, $tag, $jahr)?
Geht das nicht einfacher?
Du willst also den Timestamp des aktuellen Tages um "genull nau Uhr" herausfinden?
Dann gibt es keinen einfacheren (verständlicheren) Weg.
MfG H☼psel
Hi paco!
»» Ok, ich verstehe was du meinst. Aber heißt das, ich muß mein datum (z.B. $datum = 2009-05-12) erst wieder aufdröseln, in $jahr, $monat und $tag, um dann mktime damit zu füttern? a la mktime(0,0,0, $monat, $tag, $jahr)?
»» Geht das nicht einfacher?Du willst also den Timestamp des aktuellen Tages um "genull nau Uhr" herausfinden?
Dann gibt es keinen einfacheren (verständlicheren) Weg.
Die Uhrzeit ist mir ziemlich egal, es reicht auf den Tag genau, ich dachte mktime() erwartet da einfach Werte und rechnet ansonsten Unsinn aus.
Dann drängen sich mir aber noch andere Fragen auf:
1. Wie trenne ich denn die date-Variable, die ja kein String ist, auf? Kann ich da explode verwenden, oder muß ich die erst umwandeln?
2. Ich wollte nachträglich noch anhand des timestamps in der Datenbank (z. B. wann die OK-checkbox abgehakt wurde) nachvollziehen können, ob die Frist eingehalten wurde, bzw wie lange drüber etc..
Wenn nun time() und mktime(date(...)) mir unterschiedliche Ergebnisse liefern, kann ich ja gar nicht davon ausgehen, dass bei der Verrechnung von Datenbankeintrag ($frist) und UNIX-Timestamp (wann der Eintrag erfolgte) vernünftige Ergebnisse rauskommen :-(
lg
Paco
Hi Paco!
Die Uhrzeit ist mir ziemlich egal, es reicht auf den Tag genau, ich dachte mktime() erwartet da einfach Werte und rechnet ansonsten Unsinn aus.
Schuld an der unerwarteten Rückgabe sind zum einen die Variable Anzahl von Parametern, die mktime erwartet, und die automatische Typumwandlung von PHP (String => 0).
- Wie trenne ich denn die date-Variable, die ja kein String ist, auf?
Doch, das ist sie.
Kann ich da explode verwenden, oder muß ich die erst umwandeln?
Ich würde es über explode machen.
- Ich wollte nachträglich noch anhand des timestamps in der Datenbank (z. B. wann die OK-checkbox abgehakt wurde) nachvollziehen können, ob die Frist eingehalten wurde, bzw wie lange drüber etc..
Wenn nun time() und mktime(date(...)) mir unterschiedliche Ergebnisse liefern, kann ich ja gar nicht davon ausgehen, dass bei der Verrechnung von Datenbankeintrag ($frist) und UNIX-Timestamp (wann der Eintrag erfolgte) vernünftige Ergebnisse rauskommen :-(
Du hast mein vollstes Unverständnis.
Wenn du die Daten falsch nutzt und interpretierst, brauchst du dich über falsche Rückgaben und Berechnungen nicht wundern.
MfG H☼psel
Wenn du die Daten falsch nutzt und interpretierst, brauchst du dich über falsche Rückgaben und Berechnungen nicht wundern.
Ich wundere mich ja auch gar nicht mehr, ich hatte mir eher einen Hinweis darauf erhofft, wie ich die Daten denn richtig nutze und interpretiere..
Aber danke für den explode-hinweis, dann mach ich da mal weiter.
lg
Paco
echo $begrüßung;
Du willst also den Timestamp des aktuellen Tages um "genull nau Uhr" herausfinden?
Dann gibt es keinen einfacheren (verständlicheren) Weg.
Doch. Wenn man das Datum als String im Format Y-m-d vorliegen hat, dann kann strtotime() das parsen.
Was auch noch zu beachten ist: Nicht alle Tage haben 24 Stunden.
echo "$verabschiedung $name";
echo $begrüßung;
»» Du willst also den Timestamp des aktuellen Tages um "genull nau Uhr" herausfinden?
»» Dann gibt es keinen einfacheren (verständlicheren) Weg.Doch. Wenn man das Datum als String im Format Y-m-d vorliegen hat, dann kann strtotime() das parsen.
Was auch noch zu beachten ist: Nicht alle Tage haben 24 Stunden.
echo "$verabschiedung $name";
Hi dedlfix!
Perfekt! Das ist genau das was ich brauch, hab leider Deinen Beitrag nicht sofort gelesen. Vielen Dank! Ich glaube die Schaltjahrproblematik lasse ich jetzt mal aussen vor.
echo $danksagung
lg,
paco
echo $danksagung
ich meinte natürlich
echo $danksagung;
;-)