2013-02-14 9 views
21

ich benutze PHP 5.4.6 und MySQL 5.5.29 und ich bekomme Probleme durch die Umwandlung eines UNIX TIMESTAMP in MySQL DATETIME und umgekehrt. Mysql und PHP wun auf der gleichen lokalen Maschine.PHP-MYSQL: Konvertieren von Unix Timestamp zu DateTime und umgekehrt

Ich habe eine einfache MySQL-Tabelle

CREATE TABLE Entry(
id SERIAL PRIMARY KEY, 
created DATETIME NOT NULL); 

Daten einzufügen Ich benutze php PDO und mysql NOW(). Dies funktioniert einwandfrei, die korrekte Datetime wird in der Datenbank gespeichert.

Mein Plan ist es, mit Unix-Timestamps auf der Client-Seite zu arbeiten (PHP & MySQL auf der Serverseite).

Also würde ich gerne Unix-Zeitstempel an meinen Kunden liefern. Daher verwende ich MySql UNIX_TIMESTAMP() -Funktion, um es direkt in der Abfrage zu konvertieren.

So eine Beispielabfrage sieht wie folgt aus:

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry 

Das Ergebnis: erstellt = 2013.02.14 20.47.35 TS = 1360871255

So jetzt will ich das tun Andernfalls übergebe ich einen UNIX-Timestamp und möchte ihn mit den Einträgen in meiner Datenbank vergleichen. Leider kann ich kein PHP-Skript schreiben, das funktioniert. Ich weiß nicht, warum, aber wenn ich den gleichen Zeitstempel m vorbei (1360871255) zu PHP Ich habe nicht 2013.02.14 20.47.35 mit dieser Methode:

public static function toDateTime($unixTimestamp){ 
    return date("Y-m-d H:m:s", $unixTimestamp); 
} 

Als ich ToDateTime nennen (1360871255) wird 2013-02-14 20:02:35 zurückgeben, was nicht die ursprüngliche DateTime ist.

Ich weiß, ich brauche nicht 1360871255 zu einem Y-m-d formatieren H: m: s in MYSQL zu verwenden, aber 1360871255 scheint nicht die Zeit zu sein, die ich erwartet (und MYSQL UNIX_TIMESTAMP zurückgegeben hat).

Was ich tun möchte, ist eine einfache Abfrage, die mir Einträge zeigt, die älter als eine bestimmte Zeitstempel sind, etwas Einfaches wie folgt aus:

SELECT * FROM Entry WHERE created < 1360871255 

aber wie ich schon erwähnt, das Abfrageergebnis ist nicht die erwartete , denn 1360871255 scheint nicht die richtige Zeit zu sein.

Ich gebe keine spezielle Zeitzone für die MySQL-Verbindung in PHP.

Irgendwelche Vorschläge?

Antwort

36

Ihr date format ist falsch ... i ist für Minute, nicht m (Monate).

return date("Y-m-d H:i:s", $unixTimestamp); 

Einige Randnotizen:

  • Es gibt keine Notwendigkeit zu assign wieder, das heißt $unixTimestamp = $unixTimestamp;
  • Da Sie PHP> 5.3 verwenden sind. Sie könnten sich für das neue Objekt DateTime interessieren.
+1

Verdammt, dein Recht ... omg ... ich bin so dumm – sockeqwe

+3

@sockeqwe - Du bist nicht dumm. Du hast es einfach überschätzt. Es passiert. – Greeso

3

Das Problem liegt in der Funktion, die Sie schreibt:

return date("Y-m-d H:m:s", $unixTimestamp); 

Sie geben Monat (m) sowohl in den Datums- und Zeitabschnitten. Sie sollten die zweite m durch i, die richtige Flagge für Stunden bei der Verwendung von date() in PHP ersetzen.

Abhängig von Ihren Bedürfnissen können Sie die PHP-Funktion strtotime() nützlich genug finden.

0
function format_date($str) { 
    $month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"); 
    $y = explode(' ', $str); 
    $x = explode('-', $y[0]); 
    $date = "";  
    $m = (int)$x[1]; 
    $m = $month[$m]; 
    $st = array(1, 21, 31); 
    $nd = array(2, 22); 
    $rd = array(3, 23); 
    if(in_array($x[2], $st)) { 
      $date = $x[2].'st'; 
    } 
    else if(in_array($x[2], $nd)) { 
      $date .= $x[2].'nd'; 
    } 
    else if(in_array($x[2], $rd)) { 
      $date .= $x[2].'rd'; 
    } 
    else { 
      $date .= $x[2].'th'; 
    } 
    $date .= ' ' . $m . ', ' . $x[0]; 

    return $date; 
} 
0

nichts von beidem. Sie sollten den Zeitstempel als INT oder BIGINT speichern, denn wenn Sie das TIMESTAMP Format von mysql verwenden, werden Sie es nie wieder zu einem int bekommen. Sie können nur so etwas erhalten 1970-01-01 01:00:00.

1

Warum nicht einfach die Funktion FROM_UNIXTIME in mysql verwenden?

+0

Die SQL-Sprache saugt und tut dies auch mit MySQL-Erweiterungen, insbesondere solche aus neueren Versionen. Und es ist viel einfacher und schöner, mit einer tatsächlichen Programmiersprache zu arbeiten als mit einer Meta-Sprache, die nicht in den Rest der Anwendung passt. – Deji