Ich komm nicht hinter die Zeitfunktion

FipsTheThief

Erfahrenes Mitglied
Also ich bastel mir eben ein Script wo man innerhalb eines Monats mehere Tage in einen Kalender einzeichnen kann. Blos irgendwie spielt mir die Zeitfunktion einen Streich.

Das ist eine sehr interessante Sache die mich so langsam in den Wahnsin treibt , also um es mal kurz zu veranschaulichen.

Ich möchte vom 22.10.2005 bis zum 31.10.2005 alle Tage einfärben.

Nun wird es mystisch erstmal , jeder andere Monat geht soweit aber der Oktober ist ein Wahnsinn.

ich zähle den Tag ganz normal hoch , so also ein test gestartet :

PHP:
echo strftime("%d.%m.%Y",(mktime(0,0,0,10,30,2005))+(60*60*24));

Das sollte uns doch ganz normal den 31.10.2005 ausgeben , macht es aber nicht es gibt mir den 30.10.2005 aus aber warum ? was ist falsch ?

selbiges hier mal zum demonstrieren

PHP:
echo strftime("%d.%m.%Y",(mktime(0,0,0,10,30,2004))+(60*60*24));

hier wird korrekt der 31.10.2004 ausgegeben , ich hab alles abgerissen und neu gemacht in meinen Script aber diese Zeitfunktion will mich rollen , ich gebe es wirklich langsam auf hat wer einen Rat warum das so ist ?

Nutze Windows momentan bei mir , weiss nicht ob es daran liegt.

Also 2 Möglichkeiten ergeben sich da, entweder bin ich völlig dumm oder die Zeitfunktion arbeitet nicht korrekt.

Edit eben noch andere Jahre getestet , die arbeiten korrekt soweit nur 2005 nicht :/

hier nochmal von 1970 - 2037 alles durch

PHP:
for($i=1970;$i<=2037;$i++){
    echo strftime("%d.%m.%Y",(mktime(0,0,0,10,30,$i))+(60*60*24))."<br>";
}

Ausgabe
Code:
31.10.1970
31.10.1971
31.10.1972
31.10.1973
31.10.1974
31.10.1975
31.10.1976
30.10.1977
31.10.1978
31.10.1979
31.10.1980
31.10.1981
31.10.1982
30.10.1983
31.10.1984
31.10.1985
31.10.1986
31.10.1987
30.10.1988
31.10.1989
31.10.1990
31.10.1991
31.10.1992
31.10.1993
30.10.1994
31.10.1995
31.10.1996
31.10.1997
31.10.1998
31.10.1999
31.10.2000
31.10.2001
31.10.2002
31.10.2003
31.10.2004
30.10.2005
31.10.2006
31.10.2007
31.10.2008
31.10.2009
31.10.2010
30.10.2011
31.10.2012
31.10.2013
31.10.2014
31.10.2015
30.10.2016
31.10.2017
31.10.2018
31.10.2019
31.10.2020
31.10.2021
30.10.2022
31.10.2023
31.10.2024
31.10.2025
31.10.2026
31.10.2027
31.10.2028
31.10.2029
31.10.2030
31.10.2031
31.10.2032
30.10.2033
31.10.2034
31.10.2035
31.10.2036
31.10.2037
 
Zuletzt bearbeitet:
So hier nochmal das Script so komplett nun ich bekomme es einfach nicht hin seit ca 2 Tagen und verzweifle daran :


Die Kalender Mutter Klasse :

PHP:
/*******************************************************************************
                                Klasse Kalender
*******************************************************************************/
CLASS Kalender{
    /**
    * Array für den Starttag
    */

    var $Weekdays   = array(1 =>"Monday",
                                "Tuesday",
                                "Wednesday",
                                "Thursday",
                                "Friday",
                                "Saturday",
                                "Sunday");
                                

    /**
    * Array für den Kalender Header
    */
    
    var $Wochentage = array (1 =>"Mo",
                                 "Di",
                                 "Mi",
                                 "Do",
                                 "Fr",
                                 "Sa",
                                 "So");
                                 
    /**
    * Variablen für den Kalender setzen
    */
                                 
    var $TKopf;     // TabellenKopf Monate einzeichnen
    var $KGrid;     // Kalender Grid Tage einzeichnen
    var $KalenderG; // Gesammter Kalender
    var $AktuDatum; // Aktuelles Datum
    
    /***************************************
    *          Farben für die Tabelle      *
    ***************************************/
    
    var $TableColor             = '#00CCCC'; // Hintergrund Farbe der Tabelle
    var $TableDeskColorBody     = '#00FF00'; // Farbe des Tabellenkopfes/Monat
    var $FontColorHeader        = '#000000'; // Schrift Farbe für den Tabellenkopf
    var $FontColorTD            = '#000000'; // Schrift Farbe der Tage 1- 31
    var $MarkDayColor           = '#00FF00'; // Farbe des aktuellen Tages

/*******************************************************************************
Section KalenderHeader
    Kalender Kopf Mo Di ...
*******************************************************************************/

    function KalenderHeader(){
      for($i = 1;$i <= count($this->Wochentage);$i++){
        $this->TKopf .= "<td align='center'
                             width='15'
                             height='15'
                             bgcolor='".$this->TableDeskColorBody."'
                             style='font-size:10pt;
                                    color:".$this->FontColorHeader.";
                                    border:1px solid;
                                    padding:0px;'>"
                            .$this->Wochentage[$i]."</td>";
      }
      return $this->TKopf."<tr>";
    }
/*******************************************************************************
Section Aktueller Tag
    Aktuellen Tag ermitteln und hintergrundfarbe zurückgeben
*******************************************************************************/

    function AktuellerTag($Tag,$Monat,$Jahr){
      $LaufDatum = $Tag.".".$Monat.".".$Jahr;

      if($this->AktuDatum == $LaufDatum){
        return $this->MarkDayColor;
        // Farbe für das Tabellenfeld im aktuellen Tag
      }else{
        return "";
      }
    }
    
    function termine($tag,$monat,$jahr){
      //Datenbankanbindung herstellen
      //ergebnisse abrufen und als link kennzeichnen lassen wenn ein Eintrag
      //gefunden wurde
      //ansonsten nur den $tag zurückgeben lassen wieder.
    }
    
/*******************************************************************************
Section KalenderGrid
    Kalender Körper für die einzelenen Tage einzeichen
*******************************************************************************/

    function KalenderGrid($Monat,$Jahr=""){

      $MonatsTage = 1;
      $tag = 1; // LaufzeitVariable für den aktuellen Monatstag
      
      // Ersten Tag ermitteln
      for($i=1 ; $i <= 7;$i++){

          /* wenn der aktuelle wochentag (voll ausgeschrieben englische Namen
             gleich dem aktuellen Wert des Array Elements ist brich die Schleife
             ab $i bleibt derweil erhalten*/
             
          if(date("l", mktime(0,0,0,$Monat,1,$Jahr)) == $this->Weekdays[$i]){
                break;
          }else{
                // ansonsten zeichne ein leeres Tabellenfeld
                $this->KGrid .= "<td width='10' height='10'></td>";
          }
      }

      /*************************************************************************
      2. Zeile in der Kalender Tabelle einzeichnen
      jede weitere Zeile wird zu der Variablen KGrid hinzugefügt
      Jeder Tag der eingezeichnet wird wird überprüft ob es der aktuelle Tag ist
      *************************************************************************/

      /*Solange wie $tag kleiner ist als die Azahl der Tage des Monats
        date("t") gibt die Anzahl der Monate zurück
        $i = 1-7 */
        
      while($tag <= date("t",mktime(0,0,0,$Monat,1,$Jahr))){
           if($i%7 == 0){
             // Wenn der Tag Sonntag ist $i = 7 , $i = 14 , $i = 21 ...
                $this->KGrid .= "<td align='right'
                                     width='10'
                                     height='10'
                                     bgcolor='".
                                         $this->AktuellerTag($tag,$Monat,$Jahr)
                                     ."'style='padding:0px;
                                               border:1px solid;
                                               font-size:8pt;
                                               color:".$this->FontColorTD."'>".
                                         $tag
                                     ."</td></tr>";
                $i++;
                $tag++;
            }else{
              // von Montag bis Samstag durchlaufen und Tage einzeichen
              $this->KGrid .= "<td align='right'
                                   width='10'
                                   height='10'
                                   bgcolor='".
                                        $this->AktuellerTag($tag,$Monat,$Jahr)
                                   ."'style='padding:0px;
                                             border:1px solid;
                                             font-size:8pt;
                                             color:".$this->FontColorTD."'>".
                                        $tag
                                   ."</td>";
              $i++;
              $tag++;
            }
        }

      /* Ausgabe der Zeit in deutsch */
      setlocale(LC_TIME,'de_DE','ge');

      // Hier wird nur der Monat eingefügt noch hinter dem Kalender Grid
      return $this->KGrid.'<tr><td colspan="7"
                                   align="center"
                                   bgcolor="'.$this->TableDeskColorBody.'"
                                   style="padding:0px;
                                          border:1px solid;
                                          font-size:8pt;
                                          color:'.$this->FontColorHeader.';"
                                   height="10"
                                   width ="100">'.
                                     strftime("%B", mktime(0,0,0,$Monat,1,$Jahr))."/".$Jahr
                                   .'</td></tr>';
      }
/*******************************************************************************
Section Kalender Gesammt
  Der Kalender wird hier zusammen gefügt
  [Tabelle]-Kalender Header + Kalender Grid-[/Tabelle]
  Danach werden die Variablen Kalender Grid und KalenderKopf(Tkopf) wieder geleert
  sonst zeigt er wenn man sich einen weiteren Monat ainzeigen lassen  will nochmal
  den ersten Monat extra an .
*******************************************************************************/

    function KalenderG($Monat,$Jahr=""){

        if(empty($Jahr)){
          $Jahr = date("Y");
        }

        $this->KalenderG = '<table style="border:1px solid;
                                          padding:0px 2px 0px 2px;"
                                   height="145"
                                   width ="145"
                                   bgcolor="'.$this->TableColor.'"
                                   background="">
                                <tr>'.
                                   $this->KalenderHeader().
                                   $this->KalenderGrid($Monat,$Jahr).
                               '</tr></table>';
        $this->KGrid = '';
        $this->TKopf = ''; 
        return $this->KalenderG;
    }
}// Klasse Kalender schliessen

Der Teil der uns die Tage einfäben soll :

PHP:
CLASS FromDayToDay extends Kalender{
  var $AktuDatu = array(); // Array für die aktuellen Tag
  var $startDay; // StartTag
  var $endDay;   // EndTag
  var $AktuDay;
  var $dateS;
  var $dateE;
  
/******************************************************************************/

    function FromDay1ToDay2($date=""){

        /* Wenn kein Datum in Form eines Arrays übergeben wurde
           Fehlermeldung generieren und Script abbrechen ansonsten
           ein neues Array AktuDatu mit den Daten füllen zu weiteren
           Verarbeitung */

        if(empty($date) OR !is_array($date)){
          echo "Keinen gültigen Zeitraum übergeben";
          echo "<pre>
             \$date =array(\"StartDatum1\" => \"EndDatum1\",
                          \"StartDatum2\" => \"EndDatum2\");
                </pre>";
          DIE("Verarbeitung wurde abgebrochen !");
        }else{

           for($i = 0;$i<count($date);$i++){
                $this->AktuDatu[key($date)] = current($date);
                next($date);
            }

        }

        $this->setDayToCollorate();
        return $this->KalenderG($this->dateS[1],$this->dateS[2]);
    }

/******************************************************************************/

    function setDayToCollorate(){

      $this->dateS = explode(".",key($this->AktuDatu));
      $this->dateE  = explode(".",current($this->AktuDatu));

      
      $this->startDay = mktime(0,0,0,$this->dateS[1]
                                    ,$this->dateS[0]
                                    ,$this->dateS[2]);

      $this->endDay  = mktime(0,0,0,$this->dateE[1]
                                   ,$this->dateE[0]
                                   ,$this->dateE[2]);
    }

/******************************************************************************/

   function AktuellerTag($Tag,$Monat,$Jahr){
      $LaufDatum = $Tag.".".$Monat.".".$Jahr;
      $this->AktuDay = date("j.n.Y",$this->startDay);

      if($this->AktuDay == $LaufDatum){

        if($this->startDay < $this->endDay){
            $this->startDay = $this->startDay+3600*24;
            
         }elseif($this->startDay == $this->endDay && next($this->AktuDatu)){
           $this->setDayToCollorate();
         }

       // Farbe für das Tabellenfeld im aktuellen Tag
       return $this->MarkDayColor;
        
      }else{
        return "";
      }
    }

/******************************************************************************/

}// Klasse FromDayToDay schliessen

und hier mal eine Ausgabe wo man mal gut sehen kann was er nicht macht , zum beispiel hört er im Jahre 2007 einfach auf beim 28.Oktober zu zählen.
Im Jahre 2008 schon am 27. Oktober im Jahre 2010 am 25. Oktober und im Jahre 2011 zählt er fröhlich durch bis zum 31.10. Irgendwas stimmt doch da nicht mehr.

Wie gesagt er macht wirklich jeden Monat , nur den Oktober nur an gewissen Jahren.

PHP:
$Kalender = new FromDayToDay;
$date = array("1.10.2007" => "4.10.2007",
              "10.10.2007" => "15.10.2007",
              "17.10.2007" => "19.10.2007",
              "22.10.2007" => "31.10.2007");
echo $Kalender->FromDay1ToDay2($date);

$Kalender2 = new FromDayToDay;
$date = array("1.1.2007" => "4.1.2007",
              "10.1.2007" => "15.1.2007",
              "17.1.2007" => "19.1.2007",
              "22.1.2007" => "31.1.2007");
echo $Kalender2->FromDay1ToDay2($date);

$Kalender2 = new FromDayToDay;
$date = array("1.3.2007" => "1.3.2007",
              "10.3.2007" => "15.3.2007",
              "17.3.2007" => "19.3.2007",
              "22.3.2007" => "31.3.2007");
echo $Kalender2->FromDay1ToDay2($date);

Und das zeigt er mir an wenn ich diese Zeitspannen angebe :

Von Bis einzeichnen Oktober Fehler

Wäre fantastisch wenn da jemand noch rat wüsste.
 
Zuletzt bearbeitet:
Zugegebenermaßen ein echt entnervender Fehler: Ich hab mal folgendes gemacht...

mktime(0,0,0,10,30,2005)=1130623200
mktime(0,0,0,10,31,2005)=1130713200
mktime(0,0,0,11,11,2005)=1130799600

Wenn man sich jetzt den Sprung von 30.10 auf 31.10 anschaust, dann macht er da 90000 Sekunden drauf... Aber eigentlich hat der Tag ja nur 86400 Sekunden?

Scheint ein Fehler in der mktime Funktion zu sein. Evtl. mal bei den Entwicklern melden ...

PS: Ich hab auch Windows :-(
 
Jops das Ding ist folgendes auch wenn es nun bekloppt klingt.

Wenn die Uhr um eine Stunde zurückgestellt wird. Also von Sommer auf Winterzeit hat der Tag auf einmal nicht mehr 24 Stunden sondern 25 Stunden. Was rein logisch betrachtet ja stimmt , aber nun heisst es den Tag rauszufinden wo von der Sommerzeit auf die Winterzeit umgestellt wird. Bzw was passiert wenn nun der Tag von der Winterzeit wieder auf Sommerzeit gestellt wird , dann hat der Tag ja nur noch 23 Stunden.

PHP:
echo strftime("%d.%m.%Y", mktime(0,0,0,10,30,2005)+3600*25);

Bzw ein weiteres Problem ergibt sich dann wenn man zum Beispiel über mehere Jahre geht , da ging es richtig los.

Also gehen wir mal von 2004 los , da zeichnet er im Oktober alle Tage ein.
2005 fehlt bereits 1 Tag besser gesagt nur 1 Stunde somit zählt er nicht mehr hoch auf den 31.
2006 fehlen aber bereits 2 Tage , 2007 sind es schon 3 etc etc erst im Jahre 2011 macht er es wieder normal alle Tage bis zum 31. auffüllen.

Das wird richtig unheimlich.
 
Zuletzt bearbeitet:
Juhu ich habs , 2 Tage Hölle und es ist so einfach , naja man muss natürlich auch erstmal wissen woran es liegt -.-

die Lösung ist nen bissel doof denk ich aber es funktioniert *G*

PHP:
...
            if(date("I",mktime(0,0,0,$Monat,$Tag+1,$Jahr)) == 0  &&  $Monat == 10){
                $this->startDay = $this->startDay+3600*25;
            }else{
                $this->startDay = $this->startDay+3600*24;
            }
...

Im Prinzip hab ich einfach überprüft ob der Tag der darauf kommt schon die Winterzeit hat , da die Probleme nur im Oktober auftreten sage ich einfach mal das der Tag indem man von Sommerzeit auf Winterzeit umschaltet im Oktober sein muss.
Wenn nun der Tag gefunden wurde dann rechne ich einfach den folgenden Tag um 25 Stunden rauf aber nur solange wir im Monat Oktober sind. Somit färbt er alle ein. Ist zwar etwas komisch immer 25 Stunden drauf zu rechnen dann erstmal , aber es klappt irgendwie *G*
Wenn es zu Problemen kommt , dann müsste schon eher auf Winterzeit gestellt werden das heisst spätestens am 7.10. was wohl nie vorkommen wird hoffe ich.

So nun noch die anderen Monate testen wegen Winterauf Sommerzeit und dann schaun wir mal weiter das die Klasse es eventuell doch noch den Aufstieg in die Codeschnippsel und ich finde endlich ein Ende daran rumzuschrauben :)

Ende März stellt er wieder von Winter auf Sommerzeit um aber auch am Ende somit überhaut keine Probleme mehr :)

Danke für den Denkanstoss nochmal.
 
Zuletzt bearbeitet:
FipsTheThief hat gesagt.:
Edit eben noch andere Jahre getestet , die arbeiten korrekt soweit nur 2005 nicht :/

hier nochmal von 1970 - 2037 alles durch

PHP:
 for($i=1970;$i<=2037;$i++){
     echo strftime("%d.%m.%Y",(mktime(0,0,0,10,30,$i))+(60*60*24))."<br>";
 }

Ausgabe
Code:
 31.10.1970
 31.10.1971
 31.10.1972
 31.10.1973
 31.10.1974
 31.10.1975
 31.10.1976
 30.10.1977
 31.10.1978
 31.10.1979
 31.10.1980
 31.10.1981
 31.10.1982
 30.10.1983
 31.10.1984
 31.10.1985
 31.10.1986
 31.10.1987
 30.10.1988
 31.10.1989
 31.10.1990
 31.10.1991
 31.10.1992
 31.10.1993
 30.10.1994
 31.10.1995
 31.10.1996
 31.10.1997
 31.10.1998
 31.10.1999
 31.10.2000
 31.10.2001
 31.10.2002
 31.10.2003
 31.10.2004
 30.10.2005
 31.10.2006
 31.10.2007
 31.10.2008
 31.10.2009
 31.10.2010
 30.10.2011
 31.10.2012
 31.10.2013
 31.10.2014
 31.10.2015
 30.10.2016
 31.10.2017
 31.10.2018
 31.10.2019
 31.10.2020
 31.10.2021
 30.10.2022
 31.10.2023
 31.10.2024
 31.10.2025
 31.10.2026
 31.10.2027
 31.10.2028
 31.10.2029
 31.10.2030
 31.10.2031
 31.10.2032
 30.10.2033
 31.10.2034
 31.10.2035
 31.10.2036
 31.10.2037
da aber viel mehr nicht als nur 2005 ...

naja, wenn du WIndows hast, warum lädstes dann net ma irgendwo hoch (hast ja sicher irgenden space) und testest es mal dort ?
 
Ja hab ich ja auch auf meinen Webspace dort läuft ein Linux Server aber es traten die gleichen Probleme auf , wie gesagt es lag nur an der Umstellung von der Sommerzeit zur
Winterzeit so das 1 Stunde fehlte.

Das war gut zu sehen das die Winterzeit im Jahre 2005 am 30.10 eintritt , 2006 aber am 29.10 und 2007 am 28.10. Somit macht er immer an einen anderen Tag die Probleme aber die Umrechnung vom 30.10 auf den 31.10 nur an gewissen Jahren.

Somit fehlte mir immer 1 weiterer Tag.

Also 2007 ja 3 Tage , der 29.10 , 30.10 und der 31.10.

Umstellung war am 28.10 so da konnte er nicht auf den 29 zählen da eine Stunde zu wenig existierte. Somit blieb er auf diesen Tag hocken und es ging nicht weiter hoch also hat er es am nächsten Tag nochmal probiert vom 28.10 auf den 29.10 zu zählen klappte wieder nicht und somit bildet sich ein Teufelskreis.

Wenn man die Lösung kennt kann man sich auf einmal auch all den Irrsinn erklären den die Zeitfunktion zu machen schien.

Ich bekomme langsam einen Kalenderfetisch...
 
Zuletzt bearbeitet:
Zurück