(TIMESTAMP) 1.1.1901 -> 31.12.1969 ?
Mastershrimp
- php
Heyho!
Ich mache gerade eine User-Datenbank, wo der User u.A. auch seinen Geburtstag eingeben kann. Jetzt habe ich folgendes Problem:
Wenn er den 1.1.1901 als Geburtstag eingibt, macht mktime daraus einen Timestamp für den 31.12.1969....
Jetzt weiß ich zwar, dass ein UNIX-Timestamp seit Beginn der UNIX-Epoche (1970) zählt, aber wie kann man Daten _vor_ 1970 erfassen? Geht das nicht? Darf doch eigentlich nicht sein, oder?
Der ganze Datums-Code sieht folgendermaßen aus:
//EINTRAGEN
if($user_geb_monat != "" && $user_geb_tag != "" && $user_geb_jahr != "")
{
if(checkdate($user_geb_monat,$user_geb_tag,$user_geb_jahr))
{ $geb_datum = mktime(0,0,0,$user_geb_monat,$user_geb_tag,$user_geb_jahr); }
else
{
echo "<br><br><br><br><div class='error'><b>Fehler: Der " . $user_geb_tag . "." . $user_geb_monat . "." . $user_geb_jahr . " ist kein gültiges Datum!<br><br><a class='nav' href='javascript:history.back()'>» zurück «</a></b></div>";
exit;
}
}
else
{ $geb_datum = "0"; }
//AUSLESEN
$heute = time();
if($user_geburtstag!="" && $user_geburtstag!="0")
{
$alter = $heute - $user_geburtstag;
$alter = date("Y",$alter) - 1970;
$user_geburtstag = date("d.m.Y",$user_geburtstag);
}
Wäre für jede Hilfe dankbar!
Chapeau! ;)
Mastershrimp
Hi,
Jetzt weiß ich zwar, dass ein UNIX-Timestamp seit Beginn der UNIX-Epoche (1970) zählt, aber wie kann man Daten _vor_ 1970 erfassen? Geht das nicht? Darf doch eigentlich nicht sein, oder?
Geht mit negativen Timestamps...
E7
Moin!
Wenn er den 1.1.1901 als Geburtstag eingibt, macht mktime daraus einen Timestamp für den 31.12.1969....
Du willst keinen Unix-Timestamp haben, sondern eine Datenbank-Spalte vom Typ "DATE". Schließlich kommt es nicht darauf an, auf die Sekunde genau die Geburtszeit zu bestimmen (das würde im Zweifel sowieso nur minutengenau gehen, so genau gucken die Hebammen nämlich nicht auf die Uhr), sondern den Tag festzuhalten.
Also: Tag, Monat, Jahr in der Datenbank speichern - das ist besser. Und dann klappts auch mit den Jahren vor 1970.
- Sven Rautenberg
Also: Tag, Monat, Jahr in der Datenbank speichern - das ist besser. Und dann klappts auch mit den Jahren vor 1970.
Argh. Neulich sagte noch irgendwer "nimm immer Timestamps, das ist viel besser!". Und jetzt mach ich's und es kommt wieder nix Richtiges raus :(
Wenn ich dann das Datum (sagen wir mal 1.1.1901) aus der db auslese - kann ich dann wieder mit den Timestamps arbeiten, um das Alter herauszubekommen?
Chapeau! ;)
Mastershrimp
Hallo Mastershrimp,
Wenn ich dann das Datum (sagen wir mal 1.1.1901) aus der db auslese - kann ich dann wieder mit den Timestamps arbeiten, um das Alter herauszubekommen?
Das mit den negativen Timestamps, die e7 vorschlaegt, habe ich noch nicht ausprobiert - aber dazu muesste man erst mal wissen, wie in einem solchen Fall die "Kalender-Intelligenz" implementiert ist. Serioese Datumsberechnung, die nicht mit den timestamp-abhaengigen Funktionen arbeitet, operiert von daher mit richtigen Kalenderfunktionen. Die gibts fuer viele Programmiersprachen als fertige Module. Manchmal lohnt es sich aber auch, eigene Funktionen zu implementieren. Unter http://pear.php.net/package/Calendar findest du etwas Entsprechendes fuer PHP.
viele Gruesse
Stefan Muenz
Heyho!
Danke! Werd's mir mal ansehen. Ich brauche keine absolut perfekte Datumsfunktion - ich denke, das, was ich da in meinem anderen Posting gebastelt habe, sollte reichen. Vorrausgesetzt es funktioniert. Aber ich schätze mal ja. Was meinst du?
Chapeau! ;)
Mastershrimp
Habe das jetzt mit der DATE-Spalte gelöst. Jetzt wird das Datum natürlich richtig angezeigt, aber man kann immer noch nicht das Alter errechnen!
Was muss ich an den folgenden Zeilen ändern, damit das Alter auch bei "alten" Menschen richtig errechnet wird?
$heute = time();
if($user_geburtstag!="" && $user_geburtstag!="0")
{
$alter = $heute - mktime(0,0,0,substr($user_geburtstag,5,2),substr($user_geburtstag,8,2),substr($user_geburtstag,0,4));
$alter = date("Y",$alter) - 1970;
$user_geburtstag = substr($user_geburtstag,8,2) . "." . substr($user_geburtstag,5,2) . "." . substr($user_geburtstag,0,4);
}
Ich habe leider nicht die leiseste Ahnung, wie man dieses "1970"-Problem beseitigen kann...
Danke für jede Hilfe!
Hi,
Habe das jetzt mit der DATE-Spalte gelöst. Jetzt wird das Datum natürlich richtig angezeigt, aber man kann immer noch nicht das Alter errechnen!
das Alter kannst du doch ganz einfach berechnen, indem du das Geburtsjahr vom aktuellen Jahr subtrahierst und wenn das jetzige Datum kleiner ist als das Geburtsdatum, nochmal 1 subtrahierst. Das kannst du auch von der Datenbank erledigen lassen, z.B. unter MySQL:
SELECT
(YEAR(CURRENT_DATE) - YEAR(geburtstag)) - (RIGHT(CURRENT_DATE, 5) < RIGHT(geburtstag, 5))
AS
Alter
FROM
Tabelle
Gruß,
Andreas.
Heyho!
Hmm. Habe leider nicht allzuviel Ahnung von Mysql-Operationen. Ich würde das lieber mit PHP machen.
Habe das folgendermaßen gelöst:
$dieses_jahr = date("Y");
if($user_geburtstag!="")
{
$alter = $dieses_jahr - substr($user_geburtstag,0,4);
if(substr($user_geburtstag,5,2) . substr($user_geburtstag,8,2)*1>date("nj"))
{ $alter--; }
}
sollte doch eigentlich klappen, oder?
Die Variable $user_geburtstag liegt in der Form YYYY-MM-DD vor.
Soweit ich's bis jetzt ausprobiert habe, scheint es zu klappen.
Danke für den Tipp!
Btw.: Also mit Timestamps wäre das definitiv nicht so einfach zu lösen, oder? Dann haben die Dinger doch absolut keinen Nutzen! Wer hat schon nur User die nach 1970 geboren wurden?
Chapeau! ;)
Mastershrimp