Die Graßlbande: Wer kann mir helfen bei diesem Quelltext? Wo liegt der Fehler?

Hallo zusammen!

Ich habe auf meiner Homepage einen Datumsanzeiger für meinen Sohn eingebaut!

Heute ist er genau 6 Monate alt! Aber der Quelltext zeigt an: 5 Monate und 31 Tage!

Hier ist er:

http://www.grasslbande.de/html/timon.html

(Ich weiss nicht ob ich den ganzen Quelltext hier reinkopieren darf... Also auf der o.g. Seite findet ihr die Datumsanzeige)

Wäre nett wenn mir jemand helfen würde!

ich hab mal wieder keine Ahnung :)

LG aus München

Julia

  1. Hi,

    Heute ist er genau 6 Monate alt! Aber der Quelltext zeigt an: 5 Monate und 31 Tage!

    das erinnert mich an eine Uhrzeit angabe alla 21:60 anstatt 22:00

    Hier ist er:
    http://www.grasslbande.de/html/timon.html

    du meinst hier?:
    http://www.grasslbande.de/html/timon.html

    (Ich weiss nicht ob ich den ganzen Quelltext hier reinkopieren darf... Also auf der o.g. Seite findet ihr die Datumsanzeige)

    den relevanten code darfst du posten. den anderen darfst du weglassen.

    MfG

    1. http://www.grasslbande.de/html/timon.html

      den relevanten code darfst du posten. den anderen darfst du weglassen.

      DANKE schön !

      Dann hoff ich mal ich hab den relevanten Code rausgefischt :

      ACHTUNG HIER KOMMT ER:

      <b><font color="black"<font size="6" face="One Stroke Script LET"><center>
      <!--webbot bot="HTMLMarkup" startspan --> <script language="JavaScript">
      <!--
      today = new Date();
      bYear = 2004; // Start Jahr
      bMonth = 12; // Start Monat
      bDay = 07; // Start Tag
      tYear = today.getFullYear();
      tMonth = (today.getMonth() ) + 1 ;
      tDay = today.getDate();
      tHour = today.getHours();
      fYear = 0;
      fMonth = 0;
      fDay = 0;
      fHour = 0;
      x = 0;
      y = 0;
      z = 0;
      a = 0;
      b = 0;
      c = 0;
      function testMonth() {
      if (y==4 || y==6 || y==9 || y==11) x=30
      else if (y==2) x=28
      else x=31
      }
      function testDay() {
      fDay = (z - bDay) + tDay;
      if (fDay > a) {
      fMonth += 1;
      fDay = fDay - a;
      }
      }
      y = bMonth;
      testMonth();
      z = x;
      y = bMonth;
      testMonth();
      a = x;
      if (bMonth <= tMonth) {
      fYear = tYear - bYear;
      fMonth = (tMonth - bMonth);
      testDay();
      }
      fYear = (tYear - bYear) - 1
      fMonth = ((12 - bMonth) + tMonth) - 1;
      testDay();
      if (fMonth >= 12) {
      fYear += 1;
      fMonth -= 12;
      }
      with(Math) {
      theYear=fYear;
      tensYear=floor(theYear/10);
      onesYear=theYear-(tensYear*1);
      theMonth=fMonth
      tensMonth=floor(theMonth/10);
      onesMonth=theMonth-(tensMonth*1);
      theDay=fDay
      tensDay=floor(theDay/10);
      onesDay=theDay-(tensDay*1);
      var testArray = new makeArray("Januar","Februar","M&auml;rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
      for (z=1; z<=12; z++) {
      if (tMonth==z) {
      var b=testArray[z]
      }
      }
      for (z=1; z<=12; z++) {
      if (bMonth==z) {
      var c=testArray[z]
      }
      }
      }
      var page
      page = "Heute ist der <b>"+tDay+". "+b+" "+tYear+".</b><br>"
      page += "Geboren bin ich am <b>"+bDay+". "+c+" "+bYear+"</b><br>"
      page += "Ich bin jetzt genau <b>"
      if(parseInt(tensYear+onesYear) == 1) {
      page += tensYear + onesYear + " Jahr</b>,<b> "
      }
      else {
      page += tensYear + onesYear + " Jahre</b>,<b> "
      }
      if(parseInt(tensYear+onesYear) == 0) {
      page += ""
      }
      if(parseInt(tensMonth+onesMonth) == 1) {
      page += tensMonth + onesMonth + " Monat </b>und<b> "
      }
      else {
      page += tensMonth + onesMonth + " Monate </b>und<b> "
      }
      if(parseInt(tensDay+onesDay) == 1) {
      page += tensDay + onesDay + " Tag</b> alt."
      }
      else {
      page += tensDay + onesDay + " Tage</b> alt."
      }
      function makeArray() {
      this.length = makeArray.arguments.length
      for (var i = 0; i < this.length; i++)
      this[i+1] = makeArray.arguments[i]
      }
      document.write(page)
      // -->
      </script>
      <!--webbot bot="HTMLMarkup" endspan --></p></center>

      Sorry der war lang ! Aber ich weiss echt nicht was davon unwichtig ist!

      LG Julia

      1. Wie Ich sehe, hast du das Datum mit JavaScript erstellt. Versuch' es doch mal mit PHP. Falls du dich in der Sprache noch nicht auskennst, sag' ich dir jetzt mal die wichtigsten Dinge für deinen Fall:
        1. Du müsstest die Seite "timon.html" in "timon.php" umbenennen. Das ergibt keinen sichtbaren Unterschied, nur dein Server liest ein anderes Format.
        2. Du gibst über dem <html>-Tag folgende Zeilen ein:
          ~~~php <?
        //================================================================================================================================
        //=ANFANG Umwandlung in deutsche Monatsnamen==========================

        $dt_monate=array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
        $month=date("n", mktime(0, 0, 0, $month, $day, $year));
        $monat=$dt_tage[$month];

        //==ENDE Umwandlung in deutsche Monatsnamen===========================
        //================================================================================================================================

        $heute=date("j.$monat Y");                    //Datumsformat von Heute
        $timestamp=date("7.12.2004");
        $alter=date("Y Jahre, n Monate und j Tage",$timestamp);

          
        <!-- Das kommt in den BODY -->  
        Heute ist der <? echo $heute; ?>. Geboren bin ich am 7. Dezember 2004<br>  
        Ich bin jetzt genau <? echo $alter; ?> alt.  
        <!-- --------------------- -->  
          
        Bei mir funktionierts auf jeden Fall  
          
        Massi  
          
        PS.: Falls du dich ein bisschen in PHP reingewöhnen willst schau dir für den Anfang mal die Seite an: <www.schattenbaum.net/php/>
        
        1. Hallo zusammen!

          Vielen Dank erstmal für Eure Antworten!

          Ja die Homepage ist mit NetObjectsFusions gemacht! Aber nachdem sie jetzt schon über 100 Seiten fasst wollt ich nicht nochmal anfangen :)

          Ausserdem soll sie ja gar kein Meisterwerk sein... Ist eigentlich nur für unsere Familie und Freunde gedacht die weiter weg wohnen und unseren Sohn nicht so oft sehen!
          Die freuen sich dann wenn sie in Amiland und überall Fotos von ihm sehen können!

          Diesen Code hat mir übrigens jemand zugeschickt und ich hab ihn dann einfach in die Seite eingebaut. Ich kenn mich mit HTML und PHP gar nicht aus! Also wirklich kein Stück! Ich hab aber jetzt schon ein bisschen rumgeschnüffelt und glaub ich werd mich da jetzt ein bisschen einarbeiten!

          So jetzt zur eigentlichen Sache:

          HEUTE Funktioniert der Ticker ja wieder! 6 Monate und einen Tag!  es ist also nur ein kleiner Fehler: Er zeigt nie an wenn ein Monat voll ist also: 6 Monate und 0 Tage ! Sondern bringt da immer 6 Monate und 31 Tage!

          Also ich dacht jetzt nur das wär ein ganz kleines Problem! Wenn das so aufwendig ist, muss sich jetzt echt keiner wegen mir das Gehirn zermatern!

          Vielen Dank für Eure Hilfe!

          Und Grüße aus München

          Julia

      2. hallo,

        an dieser Stelle:

        var page [...]

        bis

        </script>

        fügst du bitte statt der bisherigen Zeilen folgendes ein:

          
        var page  
        page = "Heute ist der <b>"+tDay+". "+b+" "+tYear+".</b><br>"  
        page += "Geboren bin ich am <b>"+bDay+". "+c+" "+bYear+"</b><br>"  
        page += "Ich bin jetzt genau <b>"  
        if(parseInt(tensYear+onesYear) == 1) {  
        page += tensYear + onesYear + " Jahr</b>,<b> "  
        }  
        else if(parseInt(tensDay+onesDay) == 31) {  
        page += tensYear + onesYear + " Jahre "  
        }  
        else {  
        page += tensYear + onesYear + " Jahre</b>,<b> "  
        }  
        if(parseInt(tensYear+onesYear) == 0) {  
        page += ""  
        }  
        if(parseInt(tensMonth+onesMonth) == 1) {  
        page += tensMonth + onesMonth + " Monat "  
        }  
        else if(parseInt(tensDay+onesDay) == 31) {  
        page += "und "  
        page += tensMonth + onesMonth +1 + " Monate alt."  
        }  
        else {  
        page += tensMonth + onesMonth + " Monate"  
        }  
        if(parseInt(tensDay+onesDay) == 1) {  
        page += tensDay + onesDay + "und<b> Tag</b> alt."  
        }  
        else if(parseInt(tensDay+onesDay) == 31) {  
        page += ""  
        }  
        else {  
        page += tensDay + onesDay + "und<b> Tage</b> alt."  
        }  
        function makeArray() {  
        this.length = makeArray.arguments.length  
        for (var i = 0; i < this.length; i++)  
        this[i+1] = makeArray.arguments[i]  
        }  
        document.write(page)
        

        Allerdings ist der gesamte Code gräßlich und was ich hier rasch gebastelt habe, ist auch nur ein Notbehelf, der wahrscheinlich auch nur heute gilt, morgen könnte dann schon wieder alles zermurkst sein. Und deine Seite ist auch zu breit, rechts wird die Bilderleiste einfach abgeschnitten und scrollen kann man nicht. Das Problem ist dabei, daß du NetObjects Fusion verwendest. Versuche es einmal ohne einen solchen Editor.

        Grüße aus Berlin

        Christoph S.

        1. Hej,

          ist auch nur ein Notbehelf, der wahrscheinlich auch nur heute gilt, morgen könnte dann schon wieder alles zermurkst sein.

          Da kannste dich ja direkt jeden Tag hinsetzt und Zähler manuell um eins hochdrehen! So als Ein-Euro-Job oder so.

          Beste Grüße
          Biesterfeld

          --
          "Das ist trivial!"
          1. hallo,

            ist auch nur ein Notbehelf, der wahrscheinlich auch nur heute gilt, morgen könnte dann schon wieder alles zermurkst sein.
            Da kannste dich ja direkt jeden Tag hinsetzt und Zähler manuell um eins hochdrehen! So als Ein-Euro-Job oder so.

            Nee, aber bei der Korrektur der Bedingungen (if/else if/else), die ich reingschrieben habe, wird das Kind morgen wahrscheinlich einen Monat jünger sein. Es müßten also noch zwei weitere solche if/else if/else-Geschichten reingefummelt werden, wenn man den ganzen Quatsch nicht völlig neu (und deutlich kürzer) machen möchte. Es ist immer ein Problem, wenn man die Scriptfunktionen von einem Editor zusammenschubsen läßt.

            Grüße aus Berlin

            Christoph S.

      3. Hej,

        oh je! Ich hoffe, du hast den Code selber geschrieben, weil du dann a) wenigstens keinen Grund hast dich über andere zu ärgern und b) du ihn wahrscheinlich auch selber flicken musst! Er ist gelinde gesagt ziemlich extravagant.

        Jedenfalls bin ich nicht ganz durchgestiegen und gebe nur ein paar Anmerkungen:

          
          today = new Date();  
          
          bYear = 2004; // Start Jahr  
          bMonth = 12;  // Start Monat  
          bDay = 07;    // Start Tag  
          
          // ^ Sauberer wäre es hier auch eine neues [link:http://de.selfhtml.org/javascript/objekte/date.htm@title=Date]  
          // für den Geburtstag zu erzeugen  
          
          tYear  = today.getFullYear();  
          tMonth = (today.getMonth() ) + 1 ;  
          tDay   = today.getDate();  
          tHour  = today.getHours();  
          
          // ^ Die Zuweisungen sind m.E. nicht nötig, da die Werte ja  
          // im Date-Objekt gespeichert sind  
          
          x = 0;  
          y = 0;  
          z = 0;  
          a = 0;  
          b = 0;  
          c = 0;  
          
          // ^ Ich bin mir sicher, dass du diese Variablen alle nicht brauchts  
          
          // Bitte setze dich nochmal mit [link:http://de.selfhtml.org/javascript/sprache/funktionen.htm@title=Funktionen]  
          // auseinander, suche nach den Stichworten "return" und "Übergabeparameter"  
          function testMonth() {  
            if (y==4 || y==6 || y==9 || y==11) x=30  
            else if (y==2) x=28  
            else x=31  
          }  
          
          function testDay() {  
            fDay = (z - bDay) + tDay;  
            if (fDay > a) {  
              fMonth += 1;  
              fDay = fDay - a;  
            }  
          }  
          
          y = bMonth;  
          testMonth();  
          z = x;  
          y = bMonth;  
             ^^^      <--- Hier ist entweder ein Fehler oder eine unnötige Zeile!  
          testMonth();  
          a = x;  
          
          // Ab hier blick ich nur noch partiell durch  
          
          if (bMonth <= tMonth) {  
          // [...]  
          
          // die folgenden 4 Blöcke sind das schärfste was ich bisher je an  
          // Programmcode gesehen habe.  
          var testArray  
            = new makeArray("Januar","Februar","M&auml;rz","April","Mai","Juni",  
                    "Juli","August","September","Oktober","November","Dezember");  
          
          for (z=1; z<=12; z++) {  
            if (tMonth==z) {  
              var b=testArray[z]  
            }  
          }  
          
          for (z=1; z<=12; z++) {  
            if (bMonth==z) {  
              var c=testArray[z]  
            }  
          }  
          
          function makeArray() {  
            this.length = makeArray.arguments.length  
            for (var i = 0; i < this.length; i++)  
              this[i+1] = makeArray.arguments[i]  
          }  
          
          // Bitte setz dich mit [link:http://de.selfhtml.org/javascript/objekte/array.htm@title=Arrays] auseinander.  
        
        

        ##############################

        So also zunächst zu den Arrays:

          
        var myArray = new Array("Jan", "Feb", [...], "Dez");  
        
        

        So erzeugst du bereits einen Array. Fertig! makeArray() macht nichts anderes als einen Argument array Element für Element zu kopieren.

        ###################################

        Dann dein Konstrukt mit der for(z = [...] )-Schleife um den entsprechenden Arraywert auszulesen ist mir nicht klar geworden: var c = myArray[bMonth] tut vollkommen.

        Soviel dazu, dann allgemein: Bitte achte auf saubere Syntax. Sowas

          
        function testMonth() {  
        if (y==4 || y==6 || y==9 || y==11) x=30  
        else if (y==2) x=28  
        else x=31  
        }  
        
        

        darf man zwar machen, aber es erhöht die Les- und Wartbarkeit nicht!

          
          function testMonth() {  
            if(   y==4  
               || y==6  
               || y==9  
               || y==11  
              ){  
                x=30  
            }  
            else if(y==2){  
              x=28  
            }  
            else{  
              x=31  
            }  
          }  
        
        

        Immer auf Eindrückungen und Klammern achten!

        ####################################
        Jetzt zu deinem eigentlichen Problem!

        Machs dir nicht so schwer: Erzeuge das Geburtstags-Date-Objekt und das aktuelle Date-Objekt!
        Ziehe die beiden in Sekunden von einander ab und zerlege die Anzahl der Sekunden wieder in Stunden, Tage, Monate, Jahre. Das macht einen sehr schlanken und übersichtlichen Programmcode. Vielleicht hilft dir dieser Feature-Artikel etwas.

        Das Prinzip ist einfach:

        # Bestimme die Anzahl von Sekunden x zwischen den Ereignissen
          # Teile x durch die Anzahl der Sekunden xA die ein Jahr hat
          # Der ganzzahlige Wert sind die Jahre, mit dem Rest x = (xA % x) verfahre weiter
          # Teile x durch die Anzahl der Sekunden xT die ein Tag hat
          # Der ganzzahlige Wert sind die Tage, der Rest ...

        Das Problem, des unregelmäßigen Überschlages, den du bei den Monaten bekommen wirst umgehst du folgender maßen.

        # Erzeuge ein Array, dass dir ab dem 7. Dezember immer die Anzahl der Tage
            bis zum Monatsüberschlag gibt: also
            var uebersch = new Array(31, 62, 90, [...] )
          # Schau in welchem Arrayelement sich deine berechneten Tage befinden.
            (Bsp: 60 Tage sind kleiner uebersch[1] also sind 2 Monate vergangen)
          # Bilde die Differenz zum nächst höheren Arraryelement, um die Anzahl der
            Resttage zu bestimmen. (Bsp: uebersch[2] - 60 = 2)

        So das war jetzt sehr ausführlich, wenn du was nicht verstanden hast, kannst du ja gerne nochmal nachfrage.

        Beste Grüße
        Biesterfeld

        --
        Man soll schon Informatiker gesehen haben, die im Aufzug die 3 drückten, wenn sie in den 4. Stock wollten.
        1. hallo,

          oh je! Ich hoffe, du hast den Code selber geschrieben

          Nein. Das ist von ColdFusion erzeugter Code, und ich fürchte, deine gutgemeinten Erläuterungen sind zu "hoch".

          Er ist gelinde gesagt ziemlich extravagant.

          Er ist gräßlich.

          Grüße aus Berlin

          Christoph S.

          1. ups,

            Das ist von ColdFusion erzeugter Code

            Falsch. Konkret ist es "NetObjects Fusion".

            Er ist gelinde gesagt ziemlich extravagant.
            Er ist gräßlich.

            Richtig ;-)

            Grüße aus Berlin

            Christoph S.

            1. Hej,

              Das ist von ColdFusion erzeugter Code

              Falsch. Konkret ist es "NetObjects Fusion".

              Vollkommen egal welches Produkt das zusammengeschustert hat, ich bin absolut fasziniert wie ein Programm nur so falschen Code (siehe z.B. dieses Monstergeile Arraykonstrukt) produzieren kann.

              Beste Grüße
              Biesterfeld

              --
              Wussten sie, dass die meisten Menschen mehr Beine haben als der Durchschnitt?