Biker: Funktion kommt mit Monatswechsel nicht klar

Hallo erstmal.

ich habe eine Funktion, die mir ein ein Datum Dropdown generiert.

  
function datesel($name,$default,$low,$high,$step) {  
	echo("<SELECT NAME=\"$name\">");  
	for ($i=$low;$i<=$high;$i+=$step) {  
		if ($i < 10) { $i=sprintf("%02d", $i); }// 2-stellig  
		if ($i == $default) {  
			echo("\n\t\t\t<OPTION VALUE=\"".$i."\" SELECTED>".$i."</OPTION>\n");  
		} else {  
			echo("\n\t\t\t<OPTION VALUE=\"".$i."\">".$i."</OPTION>\n");  
		}  
	}  
	echo("</SELECT>");  
}  

Aufgerufen wird sie über

  
// Variablen  
$tagmin="01";  
$tagmax="31";  
$monmin="01";  
$monmax="12";  
$jahrmin="1980";  
$jahrmax="2036";  
  
  
datesel("tag",$defaulttag,$tagmin,$tagmax,1);  
datesel("mon",$defaultmon,$monmin,$monmax,1);  
datesel("jahr",$defaultjahr,$jahrmin,$jahrmax,1);  

Das funktioniert auch dann noch gut, wenn ich die Variablen auf einen Zeitraum zusammenstutze, der für den entsprechenden Gebrauch angemessen ist.

Es funktioniert ebenfalls, wenn nur 1 Woche angemessen ist. Aber genau hier fängt mein Problem an. Denn es darf von $tagmin bis $tagmax kein Montaswechsel stattgefunden haben. Denn z.B. 29 als $tagmin und 04 als $tagmax ist für die Funktion so nicht handlebar. Abgesehen davon, dass sich der Umbruch des Monats ja auch ändert.

Hat einer eine Idee, wie die Funktion ändern kann, damit sie auch so etwas generieren kann?

Biker

  1. Tach.

    Es funktioniert ebenfalls, wenn nur 1 Woche angemessen ist. Aber genau hier fängt mein Problem an. Denn es darf von $tagmin bis $tagmax kein Montaswechsel stattgefunden haben. Denn z.B. 29 als $tagmin und 04 als $tagmax ist für die Funktion so nicht handlebar. Abgesehen davon, dass sich der Umbruch des Monats ja auch ändert.

    Deine Beschreibung ist etwas wirr. Verstehe ich richtig, daß Du einen Zeitbereich per Anfangsdatum und Enddatum vorgeben möchtest, für den dann alle enthaltenen Tage nach Tag, Monat und Jahr generiert werden? Falls ja:

    Benutze, wenn möglich, nicht das Enddatum sondern lieber direkt die Anzahl der Tage, die Du abdecken möchtest. Addiere jeweils einen Tag auf Dein Anfangsdatum und stecke diese Angabe in die Funktion mktime(). Aus dem so erhaltenen Timestamp läßt Du Dir über getdate() jeweils Tag, Monat und Jahr für Deine Dropdown-Listen ermitteln, z. B. so:

      
    for ($i = 0; $i < $tage; $i++) {  
    	$d = getdate(mktime(0, 0, 0, $monmin, $tagmin + $i, $jahrmin));  
    	// mach was mit den Einträgen in $d ...  
    }  
    
    
    --
    Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.
    1. Verstehe ich richtig, daß Du einen Zeitbereich per Anfangsdatum und Enddatum vorgeben möchtest, für den dann alle enthaltenen Tage nach Tag, Monat und Jahr generiert werden? Falls ja:

      Ja. Korrekt.

      Benutze, wenn möglich, nicht das Enddatum sondern lieber direkt die Anzahl der Tage, die Du abdecken möchtest.

      So mache ich das ja. Nur von heute rückwärts rechnend.

      $d = getdate(mktime(0, 0, 0, $monmin, $tagmin + $i, $jahrmin));

      Rechnet mktime denn auch mit Werten über 31 noch korrekt? Denn dazu kommt es ja in Deiner Lösung. Vielleicht wäre es sinnvoller, Deine Lösung, allerdings gleich mit Zeitstempel + 86400 zu verwenden und sich über getdate dann das Datum zu holen.

      Noch suche ich aber nach einer anderen Lösung. Denn ich verwende die Funktion nicht nur für Datum, sondern auch sonstige Aufzählungen, die per Dropdown in Formularen erscheinen sollen. Deshalb wäre mir lieber, die Funktion etwas zu erweitern, als sie umzustricken.

      Vg, Biker

      1. $d = getdate(mktime(0, 0, 0, $monmin, $tagmin + $i, $jahrmin));

        Vielleicht wäre es sinnvoller, Deine Lösung, allerdings gleich mit Zeitstempel + 86400 zu verwenden und sich über getdate dann das Datum zu holen.

        Es kommt darauf an, was Du ausrechnen willst. (alles lesen)

        1. Es kommt darauf an, was Du ausrechnen willst. (alles lesen)

          Hallo Texter,

          den Thread kenne ich. Ist auch durchaus lesenswert. Für meinen Fall aber nicht wirklich relevant. Ich kann selbst mit den beiden Zeitsprüngen pro Jahr noch ganz gut leben.

          Mir schwebt eine Lösung in folgendem Stil vor:

            
          function datesel($name,$default,$low,$high,$step)  
          {  
                if ($high < $low)  
               { /* funktioniert natürlich nicht mehr bei Sprüngen über 2 Monatsgrenzen hinweg.  
                    Könnte man wohl eine zusätzl. Kontrolle einbauen. Für meinen Zweck aber derzeit unnötig.*/  
                    $low=$alt_low;  
                    $high=$alt_high;  
                    $lastdayinmonth = strftime("%d", mktime(0, 0, 0, date("m", time()), 0, date("Y", time())));  
                    $high=$high+$lastdayinmonth;  
               }  
               echo("<SELECT NAME=\"$name\">");  
               for ($i=$low;$i<=$high;$i+=$step)  
               {  
                    if  (($alt_high < $alt_low) && ($i > $lastdayinmonth))  
                    {  
                         $i=1;  
                         $high=$alt_high;  
                    }  
                    if ($i < 10)  
                    {  
                         $i=sprintf("%02d", $i);  
                    }// 2-stellig  
            
                    if ($i == $default)  
                    {  
                         echo("\n\t\t\t<OPTION VALUE=\"".$i."\" SELECTED>".$i."</OPTION>\n");  
                    }  
                    else  
                    {  
                         echo("\n\t\t\t<OPTION VALUE=\"".$i."\">".$i."</OPTION>\n");  
                    }  
               }  
               echo("</SELECT>");  
          }  
          
          

          Leider komme ich mit meinem if-Statement aber zu spät für die for-Schleife. Dasselbe gilt wohl für eine while-schleife.

          Aber diese Lösung wäre (für meinen Zweck) etwas universeller. Wenn sie funktionierte. ??

          Vg, Biker

          1. Leider komme ich mit meinem if-Statement aber zu spät für die for-Schleife. Dasselbe gilt wohl für eine while-schleife.

            Aber diese Lösung wäre (für meinen Zweck) etwas universeller. Wenn sie funktionierte. ??

            Der Vollständigkeit halber. Ich habe es mit einer while schleife mit break-anweisung gelöst. Jetzt lauft sie sauber durch und produziert, was ich haben wollte.

            VG, Biker

      2. Tach.

        Rechnet mktime denn auch mit Werten über 31 noch korrekt?

        Ja, wenn Du für den Tag größere Werte angibst als der Monat tatsächlich hat, wird das auf den entsprechenden Tag in den Folgemonaten umgrechnet.

        Vielleicht wäre es sinnvoller, Deine Lösung, allerdings gleich mit Zeitstempel + 86400 zu verwenden und sich über getdate dann das Datum zu holen.

        Vielleicht auch nicht. Wenn Du beispielsweise ein paar Tage ab dem 25.10. losläufst, hast Du mit Deiner Methode wegen der Zeitumstellung den 26.10. zweimal drin.

        Noch suche ich aber nach einer anderen Lösung. Denn ich verwende die Funktion nicht nur für Datum, sondern auch sonstige Aufzählungen, die per Dropdown in Formularen erscheinen sollen.

        Das ist natürlich ziemlich unpraktisch, wenn sie in diesem Fall etwas sehr datumsspezifisches machen soll …

        --
        Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.