• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

negativer timestamp funktionen

mustang

Mitglied
echo $begrüßung;

ich habe mich in den letzten Tagen mal mit einem Problem beschäftigt, dass den timestamp im PHP angeht. Da ich in meiner Datenbank nur mit timestamps arbeite, ergab sich das Problem, dass Daten vor dem 01.01.1970 nicht funktionieren. Da man aber öfters auch Geburtstage der User abspeichern will und ich deswegen nicht meine Datenbank umstellen wollte, habe ich die Funktionen date() und mktime() neu bzw. umgeschrieben. Jetzt werden auch negative timestamps ausgegeben und auch wieder in ein Datum zurückgewandelt.
Ich möchte euch hier die Funktionen zeigen, damit ihr sie verwenden könnt, aber vor allem dafür, dass ihr sie testet und eure Meinung dazu abgebt.

Zur Erklärung:
die bestehenden Funktionen date() und mktime() müssen im script lediglich durch fdate() und fmktime() ersetzt werden und können genauso verwendet werden, wie auch schon vorher. Wobei die Unterstützung der gesamten date() Funktionen noch nicht fertig ist und lediglich die Ausgabe von Jahr, Monat, Tag, Stunde, Minute, Sekunde funktioniert.
Außerdem habe ich zur vollständigkeit auch die time() Funkion neu definiert. Sie kann aber auch so gelassen werden, wie sie ist.
Außerdem habe ich in die Funktionen die Umrechnung in Zeitzonen eingebaut. Hierfür müssen die Angaben in der Funktion ftimetoserver() und in ftimetozone() geändert werden im Format "Europe/Berlin" oder ähnliche. Die entsprechenden Zeitzonen lassen sich per fzeitzonen() ausgeben (auch nützlich für die Erstellung einer Auswahl für den Benutzer).

die Funktionen:

time_functions.php

PHP:
function ftime() {
return (time());
}

function fdate($format, $time) {
$time = ftimetozone($time);
if ($time >= 0) {$umrechnung = fsectoday($time);
$tage = $umrechnung["tage"];
$jd = (gregoriantojd(01, 01, 1970) + ($tage));
$greg = explode("/", jdtogregorian($jd));
$datum["tag"] = $greg[1];
$datum["monat"] = $greg[0];
$datum["jahr"] = $greg[2];$datum["stunden"] = $umrechnung["stunden"];
$datum["minuten"] = $umrechnung["minuten"];
$datum["sekunden"] = $umrechnung["sekunden"];} else {$umrechnung = fsectoday($time);
$tage = $umrechnung["tage"];if ($umrechnung["stunden"] != 0 || $umrechnung["minuten"] != 0 || $umrechnung["sekunden"] || 0) { $tage += 1; }
$jd = (gregoriantojd(01, 01, 1970) - ($tage));
$greg = explode("/", jdtogregorian($jd));
$datum["tag"] = $greg[1];
$datum["monat"] = $greg[0];
$datum["jahr"] = $greg[2];
$tagsekunden = (3600*24) - (($umrechnung["stunden"] * 3600) + ($umrechnung["minuten"] * 60) + ($umrechnung["sekunden"]));
$restgreg = fsectoday($tagsekunden);
$datum["stunden"] = $restgreg["stunden"];
$datum["minuten"] = $restgreg["minuten"];
$datum["sekunden"] = $restgreg["sekunden"];
}

$format = str_replace("d", str_pad($datum["tag"], 2, "0", STR_PAD_LEFT), $format);
$format = str_replace("m", str_pad($datum["monat"], 2, "0", STR_PAD_LEFT), $format);
$format = str_replace("Y", $datum["jahr"], $format);
$format = str_replace("y", substr($datum["jahr"], 2, 2), $format);
$format = str_replace("H", str_pad($datum["stunden"], 2, "0", STR_PAD_LEFT), $format);
$format = str_replace("i", str_pad($datum["minuten"], 2, "0", STR_PAD_LEFT), $format);
$format = str_replace("s", str_pad($datum["sekunden"], 2, "0", STR_PAD_LEFT), $format);

return $format;
}

function fmktime($stunden, $minuten, $sekunden, $monat, $tag, $jahr) {$time = strtotime("".$jahr."-".$monat."-".$tag." ".$stunden.":".$minuten.":".$sekunden."");
$time = ftimetoserver($time);
return $time;
}

function fsectoday($zeit) {
if ($zeit < 0) { $zeit *= -1; } //abs
$restsekunden = $zeit % (3600*24);
$tage = ($zeit - $restsekunden) / (3600*24);

$zeit = $restsekunden;
$restsekunden = $restsekunden % 3600;
$stunden = ($zeit - $restsekunden) / 3600;

$zeit = $restsekunden;
$restsekunden = $restsekunden % 60;
$minuten = ($zeit - $restsekunden) / 60;
$sekunden = $restsekunden;

return array("tage" => $tage, "stunden" => $stunden, "minuten" => $minuten, "sekunden" => $sekunden);}

function fdatumdiff($tag1, $monat1, $jahr1, $stunde1 = 0, $minute1 = 0, $sekunde1 = 0,  $tag2, $monat2, $jahr2, $stunde2 = 0, $minute2 = 0, $sekunde2 = 0) {$tage1 = gregoriantojd($monat1, $tag1, $jahr1);
$tage2 = gregoriantojd($monat2, $tag2, $jahr2);
$sekunden1 = $tage1 * 3600*24;
$sekunden1 += $stunde1*60*60;
$sekunden1 += $minute1*60;
$sekunden1 += $sekunde1;
$sekunden2 = $tage2 * 3600*24;
$sekunden2 += $stunde2*60*60;
$sekunden2 += $minute2*60;
$sekunden2 += $sekunde2;
$diff = $sekunden2 - $sekunden1;
if ($diff < 0) $diff *= -1; // abs

return $diff;
}

function fzeitzonen() {
return DateTimeZone::listIdentifiers();
}

function ftimetoserver($time) {
//hier die Zeitzone des Serverstandortes angeben
$diff = utcdiff("Europe/Berlin");
$time += $diff;
return $time;
}

function ftimetozone($time) {
//hier die Zeitzone der Ausgabe, also zum Beispiel des Users angeben
$diff = utcdiff("Europe/Berlin");
$time += $diff;
return $time;
}

function utcdiff($timezone) {
$dateTimeZoneUser = new DateTimeZone($timezone);
$dateTimeUser = new DateTime("now", $dateTimeZoneUser);
$timeOffset = $dateTimeZoneUser->getOffset($dateTimeUser);
return $timeOffset;
}

echo $verabschiedung;
echo name;
 
Werbung:
Meine Meinung ;) Man sollte, wenn man schon weiß, dass man mit Datumsangaben vor 1970 oder nach 2038 arbeitet, auf Timestamps verzichten. MySQL beherrscht mit DATE auch einige Datumsfunktionen durch die man auf solche Felder verzichten kann.

Wenn man mit negativen Timestamps arbeitet, weiß man nie wirklich welches Datum sie tatsächlich repräsentieren. Denn (auf 32bit-Maschinen) geht der Timestamps sowohl vor 1970 als auch nach 2038 ins negative. Diese Doppeldeutigkeit verhindert also genaue Angaben.

Wenn ich doch mal in die Verlegenheit komme solche Datumsangaben vor mir zu haben, habe ich bisher öfter die AdoDB verwendet. In dieser PHP-Bibliothek gibt es einige Funktionen die auch mit diesen an sich unmöglichen Datumsangaben arbeiten (und der Quellcode ist dadurch auch deutlich schmaler als deiner): ADOdb Date Time Library | PHP Everywhere
 
hm ok. Die die MySQL Datumsfunktionen hatte ich mir noch gar nicht angeschaut.
Dazu direkt mal eine Frage zum Einstieg:
Ich habe jetzt meine Spalte in Datetime umgestellt und mit Hilfe von
PHP:
	$sql = $db->query("INSERT INTO table (datum) VALUES (UTC_TIMESTAMP())");
das aktuelle Datum eingetragen. Jetzt will ich wo anders das Datum abfragen und direkt die richtige Ausgabe für die Zeitzone des Clients bekommen. Auf MySQL :: MySQL 5.1 Referenzhandbuch :: 5.11.8 Zeitzonen-Unterstützung des MySQL-Servers steht etwas davon, dass man die Server Zeitzone und auch die Client Zeitzone einstellen kann. Leider weiß ich nicht, wie das genau in PHP aussehen soll. Außerdem ist die Frage, ob ich dann mit einem normalen SELECT * FROM table WHERE.... direkt die richtige Zeit herausbekomme, oder trotzdem nur den Wert der Zelle.
Gibts vielleicht eine Seite, wo die Funktionen direkt von PHP her erklärt werden? Aus der angegebenen Seite werde ich nicht allzu schlau.
 
Werbung:
Das Datum formatiert man nicht per PHP sondern bereits in MySQL. In Bezug auf ein DATETIME-Feld:

Code:
SELECT DATE_FORMAT(spalte, '%d.%m.%Y') FROM tabelle

Die Angaben kann man den eigenen Wünschen anpassen, wenn man will kann man auch Wörter reinschreiben:
Code:
SELECT DATE_FORMAT(spalte, '%d.%m.%Y um %H:%i Uhr') FROM tabelle

Was dabei ausgegeben wird ist das Datum und die Zeit die in der Datenbank gespeichert wurde. Mit DATE_ADD() bzw. DATE_SUB() kannst Du das Datum auch noch manipulieren, z.B.

Code:
SELECT DATE_FORMAT(DATE_ADD(spalte, INTERVAL 1 HOUR), '%d.%m.%Y um %H:%i Uhr') FROM tabelle

Was hierbei genau möglich ist wird im Manual von MySQL beschrieben.
 
Zurück
Oben