norbert: Probleme mit der Zeit

Hallo,

in einer mysql-Zelle mit dem Typ datetime ist die, zur Speicherzeit, aktuelle Zeit mit: SET datum = NOW() gespeichert worden.

Ich möchte die Differenz aus dieser Zeit und der aktuellen berechnen.
Vor der Berechnung wollte ich mir die Zahlen mal anschauen:

echo strtotime($datumAusMysql);
echo strtotime(now);

Die Zeit in der Datenbank wird dabei nicht verändert!

Das Ergebniss überrascht mich doch sehr, ist doch die Zahl der aktuellen Zeit stets kleiner als die aus der Datenbank.
Gut, ich habe die Zeit in der Datenbank erst Minuten vorher gespeichert, aber immerhin in der Vergangenheit.

Rufe ich das Script mit den Echos mehrfach auf wächst die aktuelle Zeit, was ja zu erwarten ist.

wieso ist aber die Zeit aus der Datenbank höher?

Übrigens die Datenbank und das Script mit den echos laufen auf dem selben Server. Unterschiedliche Serveruhren scheiden als Fehlerquelle aus.

Mach ich was falsch?

Gruß

  1. Tach!

    echo strtotime($datumAusMysql);
    echo strtotime(now);

    Wenn now keine Konstante sondern ein String ist, schreib ihn bitte in Anführungszeichen.

    Die Zeit in der Datenbank wird dabei nicht verändert!

    Sollte logisch sein, bei einem SELECT (ohne Aufruf von Stored Routines) wird nie etwas an den Daten verändert.

    Das Ergebniss überrascht mich doch sehr, ist doch die Zahl der aktuellen Zeit stets kleiner als die aus der Datenbank.

    Um wieviel kleiner ist es denn? Bitte konkrete Zahlen liefern, inklusive Zeitpunkt des NOW(), dem unveränderten Wert in $datumAusMysql und am besten auch noch vom Ergebnis von strtotime() eine Umrechnung in ein menschenlesbares Format date('Y-m-d H:i:s', strtotime('now')) vornehmen. Obendrein kann nicht schaden, zusätzlich zu date() auch noch eine gmdate()-Ausgabe hinzufügen.

    Ohne konkrete Zahlen kann die Ursache alles mögliche sein. Sind es (nahezu) ganze Stunden, dann kann es ein Zeitzonenproblem sein.

    dedlfix.

  2. Moin

    Das Ergebniss überrascht mich doch sehr, ist doch die Zahl der aktuellen Zeit stets kleiner als die aus der Datenbank.
    Gut, ich habe die Zeit in der Datenbank erst Minuten vorher gespeichert, aber immerhin in der Vergangenheit.

    Das ist nicht überaschend. Du hast sicher eine andere Timezone-Einstellung in der Datenbank als auf deinem Webserver.

    Am besten du berechnest den Unterschied direkt im SQL und lässt dir diese Differenz bereits qualifiziert zurückgeben. Dann gibts auch keine Probleme mit der Portierung.

    Entsprechendes findet google zu Hauf.

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    ### Henry L. Mencken ###
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ## Viktor Frankl ###
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Das ist nicht überaschend. Du hast sicher eine andere Timezone-Einstellung in der Datenbank als auf deinem Webserver.

      Das Schien mir einleuchtend. Aber ich habe jetzt die Zeit des Webservers in die Datenbank gespeichert:

      SET datum = 'time()'

      Immer noch ist die Zeit aus der Tabelle größer als die aktuelle Zeit.

      1. Moin

        Das ist nicht überaschend. Du hast sicher eine andere Timezone-Einstellung in der Datenbank als auf deinem Webserver.

        Dann ist beim speichern etwas schief gegangen. Wie ist der Wert deines time()-Wertes (mal ausgeben) beim speichern, und was steht in der DB???

        Dann vergleichen...

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        ### Henry L. Mencken ###
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ## Viktor Frankl ###
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      2. Moin

        SET datum = 'time()'

        Immer noch ist die Zeit aus der Tabelle größer als die aktuelle Zeit.

        Und hast du mal versucht direkt im SQL den Zeitunterschied zu berechnen?

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        ### Henry L. Mencken ###
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ## Viktor Frankl ###
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      3. Tach!

        Aber ich habe jetzt die Zeit des Webservers in die Datenbank gespeichert:
        SET datum = 'time()'

        Bitte achte auf Präzision bei deinen Beschreibungen. Mit den Anführungszeichen um time() hast du einen String notiert. Wenn du diesen einem DATETIME-Feld zuweist, steht darin '0000-00-00 00:00:00'.

        Was also hast du wirklich gemacht?

        dedlfix.

  3. Mach ich was falsch?

    Ich bin jetzt nicht sicher worauf dedlfix hinaus will - ich sehe das wie Bobby: warum berechnerst du die Differenz nicht direkt per SQL?

    1. Tach!

      Ich bin jetzt nicht sicher worauf dedlfix hinaus will -

      Die Ursache der Differenz finden. Mit der ungenauen Angabe, die letztlich auf lediglich ein "ist anders" hinausläuft, kann man gar nichts einigermaßen realistisches hineininterpretieren. Vielleicht ist es die Zeitzone, vielleicht nur ein Handlingsfehler.

      ich sehe das wie Bobby: warum berechnerst du die Differenz nicht direkt per SQL?

      Damit kann man das Problem möglicherweise umgehen, bekommt aber keine weitere Erkenntnis zu seiner Ursache, die sich eventuell noch an ganz anderen Stellen (un)bemerkbar machen kann.

      dedlfix.

      1. Ich bin jetzt nicht sicher worauf dedlfix hinaus will -

        Die Ursache der Differenz finden.

        Das war mir schon klar :)

        Mit der ungenauen Angabe, die letztlich auf lediglich ein "ist anders" hinausläuft, kann man gar nichts einigermaßen realistisches hineininterpretieren. Vielleicht ist es die Zeitzone, vielleicht nur ein Handlingsfehler.

        ich sehe das wie Bobby: warum berechnerst du die Differenz nicht direkt per SQL?

        Damit kann man das Problem möglicherweise umgehen, bekommt aber keine weitere Erkenntnis zu seiner Ursache, die sich eventuell noch an ganz anderen Stellen (un)bemerkbar machen kann.

        Ach wieder wahr ja, aber ich hoffe wir sind uns einig, dass es sich hierbei (nebst der ungereimtheit) eigentlich um ein Programmiertechnik-Problem handelt :)

        1. Moin

          Ach wieder wahr ja, aber ich hoffe wir sind uns einig, dass es sich hierbei (nebst der ungereimtheit) eigentlich um ein Programmiertechnik-Problem handelt :)

          korrekt, dem stimm ich zu. ;)

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          ### Henry L. Mencken ###
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ## Viktor Frankl ###
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    2. Moin

      Ich bin jetzt nicht sicher worauf dedlfix hinaus will

      Is klar was dedlfix will. Er will die einzelnen Werte um überprüfen zu können, wo erstens der Fehler entsteht und zweitens ob eventuell ein Umwandlungsproblem besteht. Im Prinzip das was wir auch mit dem Wunsch des Zeitvergleich im SQL bezwecken wollen (Fehlerausschluss).

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ## Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)