Datum aus DB mit php time() vergleichen

vandamp

Erfahrenes Mitglied
Hallo,
ich speichere mit now() das derzeitige Datum in eine mysql Datenbank (Feld ist ein Datetime).

Wenn ich dieses Datum auslese bekomme ich es so YYYY-MM-DD HH:MM:SS.

Das Datum aus der DB will ich jetzt mit der aktuellen Zeit vergleichen und dann die Differenz Ausgeben.
Was ich bis jetzt hab schaut so aus :
PHP:
<?php
//so kommt das Datum aus meiner DB
$datum = '2010-11-21 02:05:57';
// Datum aufteilen
$Jahr = substr($datum,0,4);
$Monat = substr($datum,5,2);
$Tag = substr($datum,8,2);
$Stunde = substr($datum,11,2);
$Minute = substr($datum,14,2);
$Sekunde = substr($datum,17,2);
//Datum getrennt ausgeben
echo '<br>Datum '.$datum.'';
echo '<br>Jahr '.$Jahr.'';
echo '<br>Monat '.$Monat.'';
echo '<br>Tag '.$Tag.'';
echo '<br>Stunde '.$Stunde.'';
echo '<br>Minute '.$Minute.'';
echo '<br>Sekunde '.$Sekunde.'';

//timestamp selbst erstellen?
if($Monat == 1 ) { $Multi = 31;}
if($Monat == 2 ) { $Multi = 31+28;}
if($Monat == 3 ) { $Multi = 31+28+31;}
if($Monat == 4 ) { $Multi = 31+28+31+30;}
if($Monat == 5 ) { $Multi = 31+28+31+30+31;}
if($Monat == 6 ) { $Multi = 31+28+31+30+31+30;}
if($Monat == 7 ) { $Multi = 31+28+31+30+31+30+31;}
if($Monat == 8 ) { $Multi = 31+28+31+30+31+30+31+31;}
if($Monat == 9 ) { $Multi = 31+28+31+30+31+30+31+31+30;}
if($Monat == 10 ) { $Multi = 31+28+31+30+31+30+31+31+30+31;}
if($Monat == 11 ) { $Multi = 31+28+31+30+31+30+31+31+30+31+30;}
if($Monat == 12 ) { $Multi = 31+28+31+30+31+30+31+31+30+31+30+31;}

$timestamp = $Sekunde + $Minute * 60 + $Stunde *60*60 + $Tag * 60 * 60 *24 + $Monat *60 * 60 *24 * $Multi + $Jahre * 60*60*24*365; 
//timestamp mit mktime erstellen
$time = mktime($Sekunde,$Minute,$Stunde,$Monat,$Tag,$Jahr);
echo'<br><br>var timestamp '.$timestamp.' dieser ist selbst errechnet';
echo'<br>var time '.$time.' diesen erstelle ich mit der mktime() funktion';
$now = time();
echo'<br>var now '.$now.' timestamp von php';
//differenzen errecnen
$dateDiff = $now - $time; 
$Jahre = floor($dateDiff/(60*60*24*365));
$Tage = floor($dateDiff/(60*60*24));
$Stunden = floor($dateDiff/(60*60));
$Minuten = floor($dateDiff/(60));
$Sekunden = floor($dateDiff/1);

// alle errechneten Differenzen ausgeben
echo '<br><br><br>Differenz';
echo '<br>Jahre '.$Jahre.'';
echo '<br>Tage '.$Tage.'';
echo '<br>Stunden '.$Stunden.'';
echo '<br>Minuten '.$Minuten.'';
echo '<br>Sekunden '.$Sekunden.'<br><br>';	

// nur höchsten wert ausgeben, der größer gleich 1 ist  + Zeitcheck
if($Jahre == 1) { echo ''.$Jahre.' Jahr';}
if($Jahre > 1) { echo ''.$Jahre.' Jahre';}

if($Jahre == 0 && $Monate == 0 && $Tage == 1) { echo ''.$Tage.' Tag';}
if($Jahre == 0 && $Monate == 0 && $Tage > 1) { echo ''.$Tage.' Tage';}

if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 1) { echo ''.$Stunden.' Stunde';}
if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden > 1) { echo ''.$Stunden.' Stunden';}

if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten == 1) { echo ''.$Minuten.' Minute';}
if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten > 1) { echo ''.$Minuten.' Minuten';}

if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten == 0 && $Sekunden == 1) { echo ''.$Sekunden.' Sekunde';}
if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten == 0 && $Sekunden > 1) { echo ''.$Sekunden.' Sekunden';}

?>

Als Server verwende ich derzeit den XAMPP, beim Eintragen in die DB stimmt die aktuelle Zeit, wenn ich allerdings dann wie oben in dem Skript die Zeit vergleiche, schaut es aus als ob der Server 28 Stunden in der Vergangenheit ist. Ich schätze der XAMPP nimmt einfach die Windowszeit, diese ist aber korrekt.

Weiß vielleicht jemand, warum es zu dieser Differenz kommt?
Habe auch schon versucht anstatt die mktime() funktion von php zu benutzen den timestamp selbst zu errechnen, da kommt allerdings nur Blödsinn raus. hab mal gehört die Zeit wird erst ab 1970 oder so gerechnet?
 
Hallo,

warum machst du es nicht mit time()?
Dann speicherst du den Wert in einem int() Feld in der DB.
Damit kannst du super mit date() arbeiten, und bei time() wurde die Zeit von 1970 in Sekunden gerechnet, also kann man super mit aktuellen zeiten vergleichen.
 
Auch wenn deine Lösung wohl obsolet ist, will ich dir trotzdem mal eine verbreitete Technik zeigen: Fall thru
PHP:
$Multi = 0;

switch($Monat) {
  case 12:
    $Multi += 31;
  case 11:
    $Multi += 30;
  case 10:
    $Multi += 31;
  case 9:
    $Multi += 30;
  case 8:
    $Multi += 31;
  case 7:
    $Multi += 31;
  case 6:
    $Multi += 30;
  case 5:
    $Multi += 31;
  case 4:
    $Multi += 30;
  case 3:
    $Multi += 31;
  case 2:
    $Multi += 28;
  case 1:
    $Multi += 31;
}

Was mir gerade noch einfiel: Wenn du aus deinem Zeitstempel einen UNIX-Zeitstempel erstellen willst und das mit MySQL, dann ist das leichter als du denkst. Nutze dazu einfach die MySQL-Funktion UNIX_TIMESTAMP(date).
 
Zuletzt bearbeitet:
Ich kann Dir nur meine Erfahrung erzählen: Bis jetzt hat es (bei mir) in keinem Fall Sinn gemacht, Datumsinformationen im Datumsformat zu speichern, timestamp hat IMMER die effektiveren Ergebnisse gebracht.

(Da Du aber zwischen den Zeilen sagst, dass Du auch mit Werten unter ts=0 (1970) arbeitest, wäre die witzige Lösung, zum Speichern, den ts um 100 Jahre umzudatieren, sprich: der 01.03.1960 wird plus 100 Jahre gerechnet (=01.03.2060) (somit einen gültigen timestamp) und lediglich in jeder Ausgabe die 100 Jahre wieder abgezogen)

Und: Schau Dir mal strtotime() an.

mfg chmee
 
Morgen,

ja sinnvoller wäre es schon mit timestamps zu arbeiten, werde es ggf. noch adaptieren.
Nach ner langen Nacht bin ich dann aber doch noch zu nem Ergebnis bekommen

Die mktime funktion ist etwas unlogisch aufgebaut, da war mein Fehler.

mktime (Stunde, Minute, Sekunde, Monat, Tag, Jahr)



PHP:
//so kommt das Datum aus meiner DB
$datum = '2010-11-21 12:25:57';
// Datum aufteilen
$Jahr = substr($datum,0,4);
$Monat = substr($datum,5,2);
$Tag = substr($datum,8,2);
$Stunde = substr($datum,11,2);
$Minute = substr($datum,14,2);
$Sekunde = substr($datum,17,2);
//Datum getrennt ausgeben
echo '<br>Datum '.$datum.'';
echo '<br>Jahr '.$Jahr.'';
echo '<br>Monat '.$Monat.'';
echo '<br>Tag '.$Tag.'';
echo '<br>Stunde '.$Stunde.'';
echo '<br>Minute '.$Minute.'';
echo '<br>Sekunde '.$Sekunde.'';
//timestamp mit mktime erstellen
$time = mktime($Stunde,$Minute,$Sekunde,$Monat,$Tag,$Jahr);
$now = time();
//differenzen errecnen
$dateDiff = $now - $time; 
$Jahre = floor($dateDiff/(60*60*24*365));
$Tage = floor($dateDiff/(60*60*24));
$Stunden = floor($dateDiff/(60*60));
$Minuten = floor($dateDiff/(60));
$Sekunden = floor($dateDiff/1);

// nur höchsten wert ausgeben, der größer gleich 1 ist  + Zeitcheck
if($Jahre == 1) { echo ''.$Jahre.' Jahr';}
if($Jahre > 1) { echo ''.$Jahre.' Jahre';}

if($Jahre == 0 && $Monate == 0 && $Tage == 1) { echo ''.$Tage.' Tag';}
if($Jahre == 0 && $Monate == 0 && $Tage > 1) { echo ''.$Tage.' Tage';}

if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 1) { echo ''.$Stunden.' Stunde';}
if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden > 1) { echo ''.$Stunden.' Stunden';}

if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten == 1) { echo ''.$Minuten.' Minute';}
if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten > 1) { echo ''.$Minuten.' Minuten';}

if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten == 0 && $Sekunden == 1) { echo ''.$Sekunden.' Sekunde';}
if($Jahre == 0 && $Monate == 0 && $Tage == 0 && $Stunden == 0 && $Minuten == 0 && $Sekunden > 1) { echo ''.$Sekunden.' Sekunden';}

Trotzdem danke für eure Hilfe.
 
Zurück