php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Timestamp wird nicht genau zerlegt


 
f4b
18-12-2005, 12:54 
 
Hi

Ich habe ein Problem mit einem Countdown, der die Lebenszeit eines Kindes (oder eher noch Babys) in Jahren, Monaten und Tagen anzeigen soll.
Allerdings gibt es ,je weiter das Geburtsdatum zurück reicht, immer eine grössere Abweichung. :/
Auch wenn es zuerst nur ein paar Tage sind.

Es sollte zumindest seit dem Jahr 2000 genau sein, besser noch seit 1990. Die Abweichung tritt aber schon seit 2004 auf :(

Hier der Code:


$timestamp = mktime(0, 0, 0, $monat, $tag, $jahr);

$diff = time() - $timestamp;
// Tage ohne Monate ausrechnen (für die Positionierung des Zeigers)
$tmp1 = ($diff - ($diff % 31622400)) / 31622400;
$tmp2 = $diff - ($tmp1 * 31622400);
$count = ($tmp2 - ($tmp2 % 86400)) / 86400;

// den Timestamp zerlegen
$years = ($diff - ($diff % 31622400)) / 31622400;
$diff = $diff - ($years * 31622400);
$months = ($diff - ($diff % 2635200)) / 2635200;
$diff = $diff - ($months * 2635200);
$days = ($diff - ($diff % 86400)) / 86400;
// Ausgabestring des Datums
$msg = $kommentar." $years Jahre .$months Monat(e), $days Tag(e) alt";


Kann jemand das so umschreiben, dass es genaue Resultate liefert oder kennt jemand einen Code der exakte Daten liefert?

Vielen Dank schon im Vorraus! :)

Mfg F4b

(PHP-Version ist 5.0.5, Apache 2.0)

 
Quetschi
18-12-2005, 14:20 
 
Schon mal daran gedacht, dass nicht jedes Jahr und nicht jeder Monat gleich viele Tage haben?

 
f4b
18-12-2005, 16:39 
 
Hi

Ja, das ist mir schon klar. Ich habe mir auch gedacht, dass es an den Schaltjahren liegt, aber ich weiss nicht, wie ich es realisieren soll.

Mfg F4b

 
Quetschi
18-12-2005, 19:25 
 
Liegt noch nicht mal allein an den Schaltjahren - du berechnest auch noch nen Monat mit 30,5 Tagen :goth:

Allerdings scheint das Vorhaben auch nicht grad einfach zu sein - zumindest fallen mir jetzt keine fertigen Funktionen ein, die das gewünschte Ergebnis ohne weiteres Ausspucken - evtl. gibts aber sowas schon fertig für PHP -> Forumssuche oder Google

Denkansatz:
Zuerst die Differenz in Tagen berechnen - kein Problem -> Differenz der beiden Timestamps durch 86400 - nun vom Ausgangsdatum bis hierher zuerst die Jahre hochtickern und mit den Datumsfuntkionen jeweils prüfen, wieviele Tage das jeweilige Jahr hat, vom Rest genauso mit den Monaten verfahren - die Tage die dann noch übrigbleiben sind dann eh klar.

Ist jetz auch nicht ausgereift dieser Ansatz - aber evtl. könntest damit arbeiten - oder jemand weiß ne einfachere Methode das zu berechnen - selber denk ich halt gerne mal zu kompliziert :dontknow:

 
Quetschi
18-12-2005, 20:07 
 
Weil heut Sonntag ist:

<?php

$date1["t"] = 23;
$date1["m"] = 12;
$date1["j"] = 1997;

$date2["t"] = 18;
$date2["m"] = 12;
$date2["j"] = 2005;

$tsp1 = mktime(1,1,1,$date1["m"],$date1["t"],$date1["j"],0);
$tsp2 = mktime(1,1,1,$date2["m"],$date2["t"],$date2["j"],0);

$diff = $tsp2 - $tsp1;
$tage = $diff / 86400;

$tage_monat = date("t",$tsp1);

$days = 0;
$months = 0;
$years = 0;

while($tage > 0)
{
$days++;

if($days >= $tage_monat)
{
$days = 0;
$months++;

$tage_monat = date("t",$tsp1);
}

if($months >= 12)
{
$months = 0;
$years++;

}

$tage--;
$tsp1 = $tsp1 + 86400;

// echo date("d.m.Y",$tsp1)." : ".$years." Jahre ".$months." Monate ".$days." Tage<br />";

}

echo date("d.m.Y",$tsp1)." : ".$years." Jahre ".$months." Monate ".$days." Tage<br />";

?>

Ist nicht ausführlich getestet und die Namensgebung der Variablen hab ich in der Eile ein wenig verwurschtelt - scheint aber ein brauchbares Resultat zu liefern - zum Testen kannst den Kommentar vor dem echo in der Schleife entfernen, dann kannst jeden Tag prüfen.

Eigentlich widerstrebt es mir, so eine Berechnung durch ne Schleife zu jagen, aber mir fiel wirklich grad nix besseres ein.

 
ghostgambler
18-12-2005, 20:18 
 
afaik gabs dazu hier im Forum schonmal ein Snippet...am besten mal Suchfunktion benutzen!

[edit]
ein 100%tig funktionierendes ;)

 
Quetschi
18-12-2005, 21:42 
 
hmm, den direkt-link zum Thread hast ned grad zufällig? oder nen Suchbegriff mit dem man's findet?

ich hab zwar diverses zu solchen Berechnungen gefunden, aber nix, dass die Ausgabe in Jahr, Monat, Tag aufbereitet.

Würd mich interessieren obs ne 'schönere' Lösung gibt als meine Schleife - jetzt wo ich mir die Mühe schon gemacht hab :D

Hab jetzt auch ein paar Mal durchprobiert, meine Lösung scheint immerhin auch korrekt zu arbeiten.

 
ghostgambler
18-12-2005, 22:39 
 
Original geschrieben von Quetschi
hmm, den direkt-link zum Thread hast ned grad zufällig? oder nen Suchbegriff mit dem man's findet?
bin ich Gott? Oo,


google hat spontan mal das ausgespuckt

<?php
$birthdate="05.03.1987";
// geburtsdatum festlegen

$parth=explode(".",$birthdate);
// datum in teile zerlegen

$seconds=mktime(0,0,0,$parth[1],$parth[0],$parth[2]);
// anzahl sekunden seit 1970 errechnen

$seconds=time()-$seconds;
// sekunden seit der geburt errechnen

$age=date("Y",$seconds)-1970;
// nach jahreszahl formatieren

echo $age;
// alter ausgeben

?>

ka ob das funktioniert (bzw. das aktuelle Datum beachtet und somit das letzte Jahr), aber theoretisch sollte die Lösung einfacher sein, als eine Rumrechnung mit Schleifen ^_~

 
Quetschi
18-12-2005, 22:50 
 
Original geschrieben von ghostgambler
bin ich Gott? Oo,nö, bestimmt nicht...
Original geschrieben von ghostgambler
ka ob das funktioniert (bzw. das aktuelle Datum beachtet und somit das letzte Jahr), aber theoretisch sollte die Lösung einfacher sein, als eine Rumrechnung mit Schleifen ^_~ [/B]funktioniert bestimmt nicht so wie vom Threadstarter gewünscht...

Bei näherer Überlegung ist aber eine schleife wohl nicht unbedingt notwendig, aber ich hab jetzt keinen Bock mehr das auszudenken.

 
f4b
20-12-2005, 20:32 
 
Hi

Grosses Danke an alle Beteiligten, aber vorallem an Quetschi! :D

Deine Version ist unglaublich exakt ;)

Funktioniert nun alles bestens.

Wegen den der Schleife: Ich finde es nicht so schlimm, da die Seite für die ich das Script programmiere sowieso nicht extrem viele Besucher haben wird, denke ich zumindest mal. :D

Ausserdem liegt die andere Lösung, falls es sie gibt, nicht gleich auf der Hand und ich bin zufrieden mit dieser :)

Schönen Abend und danke nochmals!

Mfg F4b


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:52 Uhr.