Anzeige - [Hier werben / Mediadaten]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
> [S] PHP-Programmierer, exaktes Alter ausrechnen
memoriam
Geschrieben am: Mo 19.11.2007, 08:50
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 436
Mitglied seit: 30.03.2005


HI,

in PHP:

ich habe zwei Termine:

1. Geburtstag (Tag, Monat, Jahr)

2. Stichtag (Tag, Monat, Jahr) - der 1. des nächsten Monats und der anderen folgenden Monate

Jetzt brauche ich:

Wie alt ist man am Stichtag - auf den Tag genau!

Besonderheit: Wenn Geburtstag innerhalb des nächsten halben Jahres (ab Stichtag) - dann Alter gleich ein Jahr älter.

Für einen erfahrenen Programmierer sicherlich nicht allzu schwierig. Das Problem dürfte sein: das EXAKTE Alter zu errechnen.


Beispiel: Geburtstag ist 10.12.1962
Stichtag: 01.12.2007

Alter ist (da im nächsten halben Jahr Geburtstag) 45

Soweit klar? Über Angebote freue ich mich.

memoriam

Top
PMEmail PosterUsers Website
Top
 
 
David T.
#2 Geschrieben am: Mo 19.11.2007, 14:43 (+05:52)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 110
Mitglied seit: 30.07.2006


Am einfachsten ist sicher, die beiden Daten in einen Timestamp umzuwandeln um dann das Alter in Sekunden zu berechnen, das man dann durch die Sekunden pro Jahr teilt:
CODE
<?php
/**
* This function returns the age in days from the birthday to a specified day.
*
* @param string $birhday: Point-seperated date (e.g. 31.12.2006)
* @param string $reference_day: Point-seperated date, empty for today
*/
function age_in_seconds($birthday, $reference_day = null) {
$birthday = explode('.', $birthday);
$birthday = mktime(0, 0, 0, $birthday[1], $birthday[0], $birthday[2]);
if($reference_day == null) {
 $reference_day = time();
} else {
 $reference_day = mktime(0, 0, 0, $reference_day[1], $reference_day[0], $reference_day[1]);
}
return ($reference_day - $birthday);
}

echo 'Alter: ' . round(age_in_seconds('13.04.1962') / 3600 / 24 / 365.25) . "\n";
?>


Wobei natürlich die Frage ist, wie genau das Alter sein muss. Hier wird für ein Jahr 365.25 Tage angenommen, obwohl das eigentlich nicht ganz korrekt ist. Deshalb das obige Script eher als Denkanstoß...


--------------------
Top
PMEmail PosterUsers Website
Top
 
Maik
power-labels AG
#3 Geschrieben am: Mo 19.11.2007, 16:41 (+01:58)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 485
Mitglied seit: 16.03.2006


Mit Unix-Timestamps schießt du dir bei Geburtstagen ordentlich ins Knie. Wenn einer vor 1970 geboren wurde, wird deine Rechnung versagen.

QUOTE
Der Zeitstempel ist ein long-integer-Wert, der die Anzahl der Sekunden zwischen der UNIX Epoche (January 1 1970 00:00:00 GMT) und der angegebenen Zeit enthält.




--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
sven_b
INTERMEDIA bürogemeinschaft
#4 Geschrieben am: Mo 19.11.2007, 19:05 (+02:23)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (aktiv)
Beiträge: 9
Mitglied seit: 18.07.2007


Hi,

hier mal eine Funktion:
CODE

function alter($gebdat) //  funktion zum berechnen von alter datum englisch-year-month-day
   {
 list($geby,$gebm,$gebd)=explode("-",$gebdat);  
   
   $time=time();
   $akty=date("Y", $time);
   $aktm=date("m", $time);
   $aktd=date("d", $time);
   $alter=$akty-$geby;
   $v=$aktm-$gebm;
   if ($v < 0)
       $alter=$alter-1;
   if ($v == 0)
   {
     $d=$aktd-$gebd;
     if ($d < 0)
       $alter=$alter-1;
   }
   return $alter;
}

Gruß Sven
Top
PMEmail PosterUsers Website
Top
 
Jörg Kruse
#5 Geschrieben am: Mo 19.11.2007, 23:36 (+04:31)
Report PostQuote Post

AyomRank 5
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 418
Mitglied seit: 19.12.2004


QUOTE (Maik @ Mo 19.11.2007, 16:41)
Mit Unix-Timestamps schießt du dir bei Geburtstagen ordentlich ins Knie. Wenn einer vor 1970 geboren wurde, wird deine Rechnung versagen.

QUOTE
Der Zeitstempel ist ein long-integer-Wert, der die Anzahl der Sekunden zwischen der UNIX Epoche (January 1 1970 00:00:00 GMT) und der angegebenen Zeit enthält.

Der Timestamp kann auch negative Werte annehmen, sofern das betreffende Script nicht unter Windows läuft

QUOTE
Anmerkung: Der gültige Bereich eines Timestamp liegt typischerweise zwischen Fri, 13 Dec 1901 20:45:54 GMT und Tue, 19 Jan 2038 03:14:07 GMT. (Das entspricht den minimalen und maximalen Werten für einen vorzeichenbehafteten 32-Bit Integer). Unter Windows-Betriebssytemen ist dieser Bereich auf 01-01-1970 bis 19-01-2038 beschränkt.


--------------------
Top
PMEmail PosterUsers Website
Top
 
Maik
power-labels AG
#6 Geschrieben am: Di 20.11.2007, 00:00 (+00:24)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 485
Mitglied seit: 16.03.2006


dieser Hinweis gilt erst ab Version 5.1 und auch nur ausschließlich für diese Funktion


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
bowling-liga
#7 Geschrieben am: Di 20.11.2007, 01:21 (+01:20)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 66
Mitglied seit: 16.05.2007


QUOTE
Der Timestamp kann auch negative Werte annehmen, sofern das betreffende Script nicht unter Windows läuft


Das bleibt in jedem Fall nicht ohne Tuecken ... ich habe dazu auch schon einmal etwas geschrieben.

MySQL (ab 4.1.1) beispielsweise erlaubt so ein Konstrukt mit einem beliebigen Datum:

SELECT DATEDIFF(NOW(), '1962-12-10');

Das Ergebnis wird in Tagen geliefert. Nun gibt es sicher elegantere Moeglichkeiten Tage in Jahre umzurechen. Aber hier findet man zumindest die interessanteste Moeglichkeit, die dann

SELECT DATEDIFF(NOW(), '1962-12-10') * 0.00274;

aufzeigt (was auch nichts anderes ist, als mit 365.25 zu rechnen). Um die urspruengliche Aufgabe zu loesen, muss man doch an sich nur vom 1. des naechsten Monats + 6 Monate in die Zukunft rechnen, oder?

SELECT FLOOR((DATEDIFF(LAST_DAY(DATE_ADD(now(), INTERVAL 6 MONTH)), '1962-12-10') + 1) * 0.00274) AS AGE;

Cheers,
Den.


--------------------
Top
PMEmail PosterUsers Website
Top
 
David T.
#8 Geschrieben am: Di 20.11.2007, 16:54 (+15:32)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 110
Mitglied seit: 30.07.2006


QUOTE (Maik @ Mo 19.11.2007, 17:41)
Mit Unix-Timestamps schießt du dir bei Geburtstagen ordentlich ins Knie. Wenn einer vor 1970 geboren wurde, wird deine Rechnung versagen.

QUOTE
Der Zeitstempel ist ein long-integer-Wert, der die Anzahl der Sekunden zwischen der UNIX Epoche (January 1 1970 00:00:00 GMT) und der angegebenen Zeit enthält.

Wie Jörg Kruse auch schon geantwortet hat, es hilft immer, die richtige Dokumentation zu lesen bevor man seine Weisheiten verbreitet. Ich habe den Snippet als Denkanstoß gepostet. Da ich eine aktuelle PHP-Version unter Linux einsetze für mich kein Problem. Was mich mehr interessierte war, wie andere das Problem angehen würden (und damit meine ich nicht, richtige Dinge falsch aus Dokumentationen zu zitieren, sondern wie sven_b und bowling-liga einen anderen Vorschlag zu posten).

Ich habe mir den Ansatz von sven_b angeschaut und bin zu dem Schluss gekommen, dass es davon abhängt, was man nun genau errechnen will:
a) Die genaue Zeit in Sekunden/Tagen, die dieser Mensch bereits lebt.
b) Wieviele Jahreswechsel dieser Mensch bereits erlebte (+ evtl. 1 zusätzlicher falls er schon nahe dran ist).
Der Unterschied besteht darin, dass a) zwar theoretisch genauer ist, aber da in unserer Zeitrechnung ein Jahr nicht immer der gleichen Zahl an Sekunden entspricht, kann es zu Fehlern kommen. b) hingegen ist zwar theoretisch nicht ganz korrekt, dafür aber vermutlich das, was eher gewünscht wird.


--------------------
Top
PMEmail PosterUsers Website
Top
 
sven_b
INTERMEDIA bürogemeinschaft
#9 Geschrieben am: Di 20.11.2007, 18:15 (+01:20)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (aktiv)
Beiträge: 9
Mitglied seit: 18.07.2007


Hi David,

QUOTE
a) Die genaue Zeit in Sekunden/Tagen, die dieser Mensch bereits lebt.


Nun mal ehrlich, wen interessieren hier die Sekunden. ;-)
Vor allem wirst du hierfür noch den genauen Zeitpunkt der Geburt wissen müssen.

Also ich bin da nicht so kleinlich und mir ist egal um welche Stunde ich am Geburtstag wirklich ein Jahr älter werde. Ab meinem Alter wird man dann sowieso in der Altersfrage nicht mehr kleinlich. ;-)

Ach ja, bei meinem Lösungsvorschlag wird garnicht mit dem Timestamp gerechnet (hoffe hab dich richig interpretiert).

Gruß Sven
Top
PMEmail PosterUsers Website
Top
 
bowling-liga
#10 Geschrieben am: Di 20.11.2007, 19:30 (+01:14)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 66
Mitglied seit: 16.05.2007


QUOTE
Ach ja, bei meinem Lösungsvorschlag wird garnicht mit dem Timestamp gerechnet (hoffe hab dich richig interpretiert).


Naja, garnicht kann man auch nicht sagen ;-) ... immerhin rufst Du einmal time auf.

Aber mal im Ernst, die Aufgabe widerspricht sich selbst in dem Punkt mit dem genauen Alter. Meiner Meinung nach liegt der Schluessel in der Ausnahme, die angegeben wurde. Insofern kann man den Code etwas umstrukturieren:

CODE

function alter($gebdat){
 list($geby,$gebm,$gebd)=explode("-",$gebdat);
 $ts=mktime(0,0,0,date("m")+7,1,date("Y"));
 $alter=date("Y", $ts)-$geby;
 if(($v=date("m", $ts)-$gebm) < 0){
   $alter-=1;
 }
 if ($v == 0){
   if(date("d", $ts)-$gebd < 0){
     $alter-=1;
   }
 }
 return $alter;
}

echo alter('1962-12-10'); #45


So long,
Den.


--------------------
Top
PMEmail PosterUsers Website
Top
 
sven_b
INTERMEDIA bürogemeinschaft
#11 Geschrieben am: Di 20.11.2007, 20:49 (+01:19)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (aktiv)
Beiträge: 9
Mitglied seit: 18.07.2007


QUOTE
Naja, garnicht kann man auch nicht sagen ;-) ... immerhin rufst Du einmal time auf.


Witzbold ;-))

Das deine Routine aber verkehrt rechnet ist dir bewußt?

Gib mal das Geburtsdatum ein: 1967-11-30, wieso kommt dann als Alter 40 raus? ;-)

Gruß Sven
Top
PMEmail PosterUsers Website
Top
 
bowling-liga
#12 Geschrieben am: Mi 21.11.2007, 00:27 (+03:37)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 66
Mitglied seit: 16.05.2007


Nee, die rechnet nicht verkehrt ... der Punkt ist doch der, wenn ich noch einmal zitieren darf:

QUOTE
Besonderheit: Wenn Geburtstag innerhalb des nächsten halben Jahres (ab Stichtag) - dann Alter gleich ein Jahr älter.


Der Witzboild ist in meinen Augen eigentlich derjenige, der den Thread gestartet hat und sich im Augenblick nicht aeussert ...

Cheers,
Den.


--------------------
Top
PMEmail PosterUsers Website
Top
 
memoriam
#13 Geschrieben am: Fr 23.11.2007, 09:10 (+2d 08:43)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 436
Mitglied seit: 30.03.2005


Hallo Leute,

vielen Dank für Eure Hilfe, allerdings funktioniert auch der letzte Vorschlag nicht so ganz exakt. Ich brauche das taggenaue Alter - mit dem eventuellen halben Jahr - und das ist offensichtlich nicht so einfach hinzukriegen. (Hängt übrigens mit Versicherungsmathematik zusammen...)

Wenn also jemand einen Vorschlag hat, ich bin gerne bereit, die Arbeit zu bezahlen. Aus gegebenem Anlass: Aber bitte nur jemand, der es auch kann. Ich habe keine Lust, wieder für eine halbgare Lösung zu bezahlen... sad.gif

Ich freue mich also auf Kontaktaufnahmen smile.gif
Top
PMEmail PosterUsers Website
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/21658

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
PHP programmierer gesucht shopic 735 11 So 16.11.2008, 15:07
Suche Joomla PRogrammierer finanzcheck 170 3 Mi 5.11.2008, 22:14
[S] Programmierer für Wordpress Plugin Anpassung decision 167 4 Do 16.10.2008, 13:18
Suche Programmierer Praktikum / TZ / VZ / Freelanc Daniel Cieslar 107 0 Do 9.10.2008, 13:13
Suche einen PHP / SQL Programmierer Swisstiger 464 7 So 21.09.2008, 09:08
Gesucht: Delphi-Programmierer dandelion 109 0 Mi 17.09.2008, 12:46
vBulletin / PHP Programmierer für Forum gesucht BlueEyes82 117 0 Mo 1.09.2008, 19:05
Suche Programmierer für Yel Nats 221 4 So 31.08.2008, 11:39
Suche PHP/MYSQL Programmierer Paidunion 201 0 So 17.08.2008, 12:56




Anzeige - [Hier werben / Mediadaten]



Anzeigen


[Hier werben / Mediadaten]