Datumsdifferenz in Tagen?

Guter Mann…das wars und läuft jetzt.

Danke.

Gibt es einen Trick den auf „Heute“ folgenden, nächsten Geburtstag in eine Variable zu schreiben ?

Aktuell zeigt das Script ja den letzten Geburtstag im Array an an schreibt diese in eine vorhandene Variable.

Ideal wäre jedoch den kommenden Geburtstag zu sehen, den man beachten sollte.

Wäre eine feine Abrundung Deiner perfekten Arbeit hier.

Gruss
b71

Also ich benutze das Script von Ferengi und das läuft einwandfrei (danke nochmals!).

Ich habe zwei Stringvariablen angelegt und ein Mix aus den Scripten gemacht:

  • Wer hat heute Geburtstag
  • Wer hat als nächstes und wieviele Tage bis dahin

Zyklisches Ereignis ans Script (täglich 1x um 0:00 Uhr) und fertig.

<?php
    $geburtstage = array("12-1-1950" => "Anna",
                        "24-1-1950" => "xx",
                        "6-2-1950" => "xxx",
                        "17-2-1950" => "xxxx",
                        "20-2-1950" => "xxxxx",
                        "25-2-1950" => "xxxxxx",;
    $datum = getdate(time());
    foreach ($geburtstage as $geburtstag => $name)
        {
        $geburtstag = split("-", $geburtstag);
            	if ($datum["mday"] == $geburtstag[0] and $datum["mon"] == $geburtstag[1])
                {
                echo "Heute hat ".$name." Geburtstag! <br />"."
";
                SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name");
                }
		else
					{
		SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "--");
				   }
         	}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		foreach ($geburtstage as $datum => $name)
		{
		  $datum         = explode("-", $datum);
		  $heute         = cal_to_jd(0,date("m"),date("d"),date("y"));
		  $geburtstag    = cal_to_jd(0,$datum[1],$datum[0],date("y"));
		  if($heute<$geburtstag)
		  {
		    $diff = $geburtstag-$heute;
		    echo $name." hat in ".$diff." Tagen Geburtstag.";
		    SetValueString(41256 /*[Geburtstage\Nächster Geburtstag]*/, "$diff Tage: $name");
		    return;
		  }
		}

?>

Hi B71,
die Idee stammt von dreamy1.

Ich persönlich nutze im Dashboard die Teminverwaltung von Thomas:
http://www.ip-symcon.de/forum/f20/ferengi-masters-terminverwaltung-v2-6993/#post57534

Hallo,

im Script oben ist noch ein kleiner Fehler und ich komm nicht drauf :slight_smile:

Problem:
Die erste if-Schleife im oberen Teil des Scriptes wird ja für jeden Geburtstag durchlaufen. Wenn nun heute jemand Geburtstag hat, wird zwar der Name richtig in die Stringvariable geschrieben…aber sofort wieder auf „–“ gesetzt. Oder anders ausgedrückt: in der Stringvariable steht immer „–“. Das kommt vermutlich davon, dass die else-Anweisung bei allen Geburtstagen nach heute zum Tragen kommt.

Ziel soll sein, dass nur bei einem Geburtstag in der Stringvariable der Namen steht und sonst ein „–“.

Jemand eine Idee, wie man das lösen könnte?

Vielen Dank vorab!

I told you so :slight_smile:

Gruss
B71

Sodele,

habe ein bissel umgebaut und schon gehts…naja, elegant ist sicher etwas anderes :slight_smile:

    
    $geburtstage = array("12-1-1950" => "Anna", 
                        "24-1-1950" => "xx", 
                        "6-2-1950" => "xxx", 
                        "17-2-1950" => "xxxx", 
                        "20-2-1950" => "xxxxx", 
                        "25-2-1950" => "xxxxxx",;
    $datum = getdate(time());
    $merker = 0;
    foreach ($geburtstage as $geburtstag => $name)
        {
        $geburtstag = split("-", $geburtstag);
            if ($datum["mday"] == $geburtstag[0] and $datum["mon"] == $geburtstag[1])
                {
                echo "Heute hat ".$name." Geburtstag! <br />"."
";
                $merker = 1;
                SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name");
                }
				else
					{
					   if ($merker == 1)
					   {}
					   else
               	{
						SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "--");
						}
				   }
         }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		foreach ($geburtstage as $datum => $name)
		{
		  $datum         = explode("-", $datum);
		  $heute         = cal_to_jd(0,date("m"),date("d"),date("y"));
		  $geburtstag    = cal_to_jd(0,$datum[1],$datum[0],date("y"));
		  if($heute<$geburtstag)
		  {
		    $diff = $geburtstag-$heute;
		    echo $name." hat in ".$diff." Tagen Geburtstag.";
		    SetValueString(41256 /*[Geburtstage\Nächster Geburtstag]*/, "$diff Tage: $name");
		    return;
		  }
		}




?>

Hallo dreamy,

hatte das einen Grund, das du das Datum mit „-“ aufteilst anstelle vom „.“ oder kann man den auch nehmen?
Müßte beim String doch eigentlich egal sein?

Grüße,
Doc

Hi Doc,

ich hatte das mit „.“ auch probiert, aber das hat nicht funktioniert. Warum…keine Ahnung, da sind meine PHP-Kenntnisse zu begrenzt :frowning:

Hi dreamy1,

dein erstes Script mit einer kleinen Änderung:

SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name"); 
break;

…sollte auch funktionieren.

Warum das mit dem Punkt jetzt genau nicht geht weiss ich auch nicht genau, evtl. was mit dem array Format?

Aber ich verstehe auch dein Script nicht so ganz? Was soll das mit dem Merker?
Warum läßt du das nicht weg und fügst nach dem ersten ELSE direkt

SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "--");

ein, oder hab’ ich was übersehen?

Grüße,
Doc

@Doc:

Genau so funktioniert es ja eben nicht - aus dem von mir genannten Grund.

@Nancilla:

Danke, das wäre natürlich vieel schöner :slight_smile: Als PHP-Noob wie ich hat man es nicht leicht…

Ich meinte natürlich das vorletzte Script, was du hier gepostet hast :wink:

Schon probiert?
Wenn das „break“ dort nicht steht, wird das ganze Array durchlaufen, bis zum letzten Datum und danach in „else“, was natürlich das „–“ bringt.
Jetzt stoppt es beim ersten passendem Datum.

Vielen lieben Dank nochmal an Nancilla, der Tipp mit dem „break“ war goldrichtig. Funktioniert jetzt wie es soll!

Hier nochmal der komplette Code für die Nachwelt:


<?php  
$geburtstage = array("12-1-1950" => "Anna", 
                        "24-1-1950" => "xx", 
                        "6-2-1950" => "xxx", 
                        "17-2-1950" => "xxxx", 
                        "20-2-1950" => "xxxxx", 
                        "25-2-1950" => "xxxxxx",;

    $datum = getdate(time());
    foreach ($geburtstage as $geburtstag => $name)
        {
        $geburtstag = split("-", $geburtstag);
            if ($datum["mday"] == $geburtstag[0] and $datum["mon"] == $geburtstag[1])
                {
                echo "Heute hat ".$name." Geburtstag! <br />"."
";
                SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name");
                break;
                }
				else
					{
						echo "Heute hat niemand Geburtstag! <br />"."
";
						SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "--");
				   }
         }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		foreach ($geburtstage as $datum => $name)
		{
		  $datum         = explode("-", $datum);
		  $heute         = cal_to_jd(0,date("m"),date("d"),date("y"));
		  $geburtstag    = cal_to_jd(0,$datum[1],$datum[0],date("y"));
		  if($heute<$geburtstag)
		  {
		    $diff = $geburtstag-$heute;
		    echo $name." hat in ".$diff." Tagen Geburtstag.";
		    SetValueString(41256 /*[Geburtstage\Nächster Geburtstag]*/, "$diff Tage: $name");
		    return;
		  }
		}




?>

… ah prima.

Jetzt tut’s nicht mehr ganz so in den Augen weh :wink:

Fehlen nur noch ein paar Anpassungen in der Ausgabe wenn 2 Leute an einem Tag Geburtstag haben.

Dann werde ich mein Geburtstagsscript demnächst doch mal umbauen, das sieht so etwas übersichtlicher aus …

Grüße,
Doc

Ich habe die beiden Namen im Array einfach hintereinader ins selbe Datum geschrieben (mit Komma getrennt).

Ja, aber du musst noch irgendwie unterscheiden ob „heute hat …“ oder „heute haben …“?

Grüße,
Doc

Achso…stimmt. Das ist bei mir nicht so tragisch, da die Namen per XBEE auf meine DIY-Wetterstation gebeamt werden - und dort gibts ein Geburtstagssymbol…das ist dann praktisch selbsterklärend. Die Namen trenne ich übrigens nicht per Komma, sondern mit „+“…da habe ich mich vorhin verkuckt.

Steht dann in etwa so da wenn heute zwei Personen gleichzeitig Geburtstag haben:

Heute: Lisa L. + Stefan P.
In 3 Tagen: Paul

Du kannst ja zählen, wieviele Werte das Array hat und dann entsprechend die Ausgabe setzen:

if ($datum["mday"] == $geburtstag[0] and $datum["mon"] == $geburtstag[1])
                {
                if (count(explode(", ", $name)) > 1)
						{
               	echo "Heute haben Geburtstag: ".$name."
";
                SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name"); 
               	}
               		else
               		{
                		echo "Heute hat ".$name." Geburtstag! <br />"."
";
                		SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name");
                		}
                break;

Array müsste in dem Fall so aussehen:

$geburtstage = array("12-1-1950" => "Anna, Tom",
                        "15-1-1950" => "xx",
                        "30-1-1950" => "xxx",
                        "17-2-1950" => "xxxx",
                        "20-2-1950" => "xxxxx",
                        "25-2-1950" => "xxxxxx");