paco: date() / time() / mktime() - Verwirrung bei Datumsberechnung

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

  1. 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

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. 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

      1. 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

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. 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

          1. 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).

            1. 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.

            1. 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

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
            1. 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

        2. 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";

          1. 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

            1. echo $danksagung

              ich meinte natürlich
              echo $danksagung;
              ;-)