problem mit geburtstagsscript...

  • Themenstarter Themenstarter itsnogood13
  • Beginndatum Beginndatum
I

itsnogood13

hallöchen... i habe nen kleines problem mit einem geburtstagsscript... es funktioniert zwar soweit ganz gut, nur leute, die vor 1969 geboren sind, werden alle als geburtstagskinder angezeigt und sind alle 37 jahre alt... :(

die geburtsdaten lese ich aus einer textdatei (geburtstage.txt) aus und habe diese im format name:JJJJ.MM vorzuliegen...

da ich net so die ahnung von datenbanken habe, würde es mich sehr freuen, wenn jemand eine lösung für mich hat, mit der ich weiterhin die textdatei als "quelle" nutzen kann...

hier nun mein quellcode...
PHP:
<?

setlocale(LC_ALL, "deu_deu");


$geburtstagskinder = verarbeite_geburtstagsdatei("geburtstage.txt", 7, 14);


if ($geburtstagskinder)
{
for ($f=0; $f<count($geburtstagskinder); $f++)
{
$val = $geburtstagskinder[$f];
echo "Wir " . "gratulieren " . $val["name"] . " zum " . "<strong>" . $val["age"] . "</strong>" . " Geburtstag! " . "<br>";
}
}
else
echo "Heute hat niemand Geburtstag!" . "<br>";




function verarbeite_geburtstagsdatei($datei, $zeitraum_vor, $zeitraum_danach)
{
$counter = 0;
$geburtstage = file($datei);

foreach ($geburtstage as $key => $data)
{
$vals = explode(":", $data);

if (count($vals)>1)
{
$name = $vals[0];
$bday = string2stamp($vals[1]);

$date_start = mktime(0, 0, 0, date("m"), date("d"), date("Y", $bday)) - $zeitraum_vor * (1 * 60 * 60);
$date_end = mktime(0, 0, 0, date("m"), date("d"), date("Y", $bday)) + $zeitraum_danach * (1 * 60 * 60);

if (($bday > $date_start) && ($bday < $date_end))
{
$age = date("Y") - date("Y", mktime(0, 0, 0, date("m"), date("d"), date("Y", $bday)));
$datum = strftime("%#d. %B", $bday);

$geburtstagskinder[$counter]["name"] = $name;
$geburtstagskinder[$counter]["age"] = $age;
$geburtstagskinder[$counter]["datum"] = $datum;
$geburtstagskinder[$counter]["tstamp"] = mktime(0, 0, 0, date("m", $bday), date("d", $bday));

$counter++;
}
}
}

$geburtstagskinder = sort_array($geburtstagskinder, "tstamp");

return $geburtstagskinder;
}



function string2stamp($string)
{
$date = explode(".", $string);
return mktime(0, 0, 0, $date[1], $date[2], $date[0]);
}



function sort_array($array, $sortby, $order=1)
{
$arr = &$array;
$count = 0;

for ($f=0; $f<count($arr); $f++)
{
$sort[$count] = $arr[$f][$sortby];
$count = $count + 1;
}

if ($order==1) @asort($sort);
if ($order==-1) @arsort($sort);

@reset($sort);

$count = 0;
while (list($key, $val)=@each($sort))
{
$new_arr[$count] = $arr[$key];
$count = $count + 1;
}
return $new_arr;
}
?>

i bedanke mich jetzt schonmal für eure antworten...
 
das liegt daran, dass deine Funktion mktime() UNIX-Timestamps verwendet. Diese sind erst ab dem 1.1.1970 (?) "definiert"..
 
Hallo hier eine Funktion von Matthis Reitinger die so etwas umsetzt.

PHP:
<?php 

   $birthday = array('mday' => 17, 'mon' => 8, 'year' => 1968);

   function getdate_for_day($year, $month, $day) {
    return getdate(mktime(0, 0, 0, $month, $day, $year));
   }

   function age($birthday) {
      $now = getdate();

      $age = array('years' => $now['year'] - $birthday['year'], 'days' => -1);
    
      if (($now['mon'] < $birthday['mon']) || ($now['mon'] == $birthday['mon'] && $now['mday'] < $birthday['mday'])) {
          $age['years']--;        
          $last_birthday = getdate_for_day($now['year']-1, $birthday['mon'], $birthday['mday']);
          $last_nye = getdate_for_day($now['year']-1, 12, 31);
          $age['days'] = $now['yday'] + ($last_nye['yday'] - $last_birthday['yday'] + 1);
      } else {
          $last_birthday = getdate_for_day($now['year'], $birthday['mon'], $birthday['mday']);
          $age['days'] = $now['yday'] - $last_birthday['yday'];
      }

      return $age;
   }

   print_r(age($birthday));


?>
 
Hallöschen Ihrs!

@RS9999
kennst du dich mit der Funktion aus die du gepostet hast?
und zwar ist das bei mir die Ausgabe von dem Datum
PHP:
Array ( [years] => 38 [days] => 2 )
was sagt mir das jetzt?
bzw. was muss ich damit jetzt machen?

Ich hab nämlich ein Geburtstagskalender gebaut mit Timestamp daher hab ich auch das Problem mit den Jahren von 69
Danke schon mal

MfG
Evo
 
Okay das ist ja schonmal toll!

Gibt es aber noch eine möglichkeit, trotzdem das Geburtsdatum in ein Timestamp umzuwandeln, oder muss ich es doch als normales Datum in der DB speichern

Tschau
Evo
 
Zurück