David: Verständnisproblem bei Code

Hallo,

ich habe folgenden Codeausschnitt von einem Freund von mir. Gegen Ende wird berechnet, wie viele Wochen der aktuelle Monat hat, aber ich verstehe absolut nciht, wie er darauf kommt und fragen kann ich ihn nicht, weil er im Urlaub ist. Kann mir hier vielleicht jemand helfen? Das Verständnisproblem setzt bei Berechnung von numrows an. Das ganze soll hinterher einen Kalender ergeben, aber hier erstmal der kleine Code-Schnipsel:

// -- Wochen --
 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
 {
  numdays = 31;
 }
 else if (month == 4 || month == 6 || month == 9 || month == 11)
 {
  numdays = 30;
 }
 else if (month == 2 && year % 4 == 0 && year % 100 != 0)
 {
  numdays = 29;
 }
 else
 {
  numdays = 28;
 }
 day = date.getDay();
 numrows = 1;
 if (day != 0)
 {
  numrows += Math.ceil((numdays - 8 + day) / 7);
 }
 else if (day == 0)
 {
  numrows += Math.ceil((numdays - 1) / 7);
 }

Wisst ihr vielleicht, wie der Code mit "ceil" usw. zu verstehen ist?

Liebe Grüße,
David

  1. Hallo,

    Hi!

    day = date.getDay();

    Wo wird Date Deklariert? Ich gehe davon aus, dass der Momentane Tag der Woche ausgelesen wird (0 => Sonntag, 6 => Montag)

    numrows = 1;
    if (day != 0)
    {
      numrows += Math.ceil((numdays - 8 + day) / 7);
    }

    Wenn es nicht Sonntag ist, dann ziehe von der Anzahl der Tage des Monats 8 ab und füge den (heutigen?) Tag hinzu, teile das ganze durch 7 und runde dann auf, dass Ergebniss wird zu numrows hinzugerechnet.

    else if (day == 0)
    {
      numrows += Math.ceil((numdays - 1) / 7);
    }

    Wenn es Sonntag ist, dann Ziehe von der Anzahl der Tage des Monats 1 ab und teile es durch 7, runde es dann auf und addiere es zu numrows hinzu.

    Wisst ihr vielleicht, wie der Code mit "ceil" usw. zu verstehen ist?

    Mal davon abgesehen, dass Teile zu fehlen scheinen ist das kein besonders guter Code um einen Kalender zu basteln, ich mache gerade exakt das selbe für einen Kunden und komme prima mit den Datumsfunktionen von JavaScript aus, ohne sinnlose Berechnung der Anzahl der Wochen, zumal diese sowieso sehr krum ist, im Durchschnitt  exakt 4.348125, also was hast du damit vor?

    1. Also, es fehlen wirklich keine Teile, wie gesagt, ich habe nur einen kleinen Teil gepostet.

      also was hast du damit vor?

      Ich würde gerne wissen, wie man die Anzahl der Wochen in einem Monat berechnet, und zwar nicht die generellen vier Wochen, sondern die Anzahl an Reihen in einem Kalender:

      http://img488.imageshack.us/img488/6769/namenlosnx8.png

      Das ist jetzt nur ein Bild von dem kleinen Gnome Kalender, aber ich will die Anzahl der Reihen berechnen, die in dem Bild mit den roten Zahlen dargestellt sind.

      Liebe Grüße,
      David

      1. Hallo,

        Das ist jetzt nur ein Bild von dem kleinen Gnome Kalender, aber ich will die Anzahl der Reihen berechnen, die in dem Bild mit den roten Zahlen dargestellt sind.

        Geht möglicherweise noch eleganter, aber ich würde mir über die JS-Funktionen die Kalenderwoche des ersten Tages und des letzten Tages ausgeben lassen und dann die Differenz bilden.

        Jonathan

        1. Hallo,

          Das ist jetzt nur ein Bild von dem kleinen Gnome Kalender, aber ich will die Anzahl der Reihen berechnen, die in dem Bild mit den roten Zahlen dargestellt sind.

          Geht möglicherweise noch eleganter, aber ich würde mir über die JS-Funktionen die Kalenderwoche des ersten Tages und des letzten Tages ausgeben lassen und dann die Differenz bilden.

          Jonathan

          Hallo,

          ich verstehe nicht ganz, wie du das meinst, magst du mir das erklären? In Selfhtml lassen sich auch keine Funktionen zu den Kalenderwochen finden.

          Liebe Grüße,
          David

          1. Hallo,

            ich verstehe nicht ganz, wie du das meinst, magst du mir das erklären? In Selfhtml lassen sich auch keine Funktionen zu den Kalenderwochen finden.

            Stimmt. Da hab ich wohl Javascript mit PHP verwechselt. Folgendes hab ich zusammengebastelt. Scheint auch zu funktionieren, wobei ich mir da nicht sicher bin wie sich das ganze bei verschiedenen Zeitzonen, Sommerzeit usw. verhält.

              
            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">  
            <html>  
              <head>  
                <title>Test</title>  
              </head>  
              <body>  
              <script type="text/javascript">  
              var day = new Date();  
              day.setDate(1); //erster Tag des Monats  
              document.write("Der erste Tag dieses Monats:" + day.toLocaleString());  
              document.write("<br> Kalenderwoche:" + KalenderWoche(day));  
              day.setMonth(day.getMonth()+1); //erster Tag des nächsten Monats  
              day = new Date(day - 24*60*60*1000); //Minus 1 Tag  
              document.write("<br>Der letzte Tag dieses Monats:" + day.toLocaleString());  
              document.write("<br> Kalenderwoche:" + KalenderWoche(day));  
              
              
              function KalenderWoche(day) {  
              //teilweise aus dem Internet zusammengebastelt. Keine Ahnung, wie das Funktioniert. Find ich sehr schade, dass JS keine eingebaute Funktion zu haben scheint.  
              Datum = new Date(day);  
              var tag = Datum.getDay(); if (tag == 0) tag = 7;  
              var d = new Date(2004,0,1).getTimezoneOffset();  
              Datum.setTime(Number(Datum) - (tag-1)*86400000);  
              var Jahr = Datum.getYear(); if (1900 > Jahr) Jahr +=1900;  
              var kw = 1;  
              if (new Date(Jahr,11,29) > Datum) {  
                var Start = new Date(Jahr,0,1);  
                Start = new Date(Number(Start) + 86400000*(8-Start.getDay()));  
                if(Start.getDate() > 4) Start.setTime(Number(Start) - 604800000);  
                kw = Math.ceil((Datum.getTime() - Start) /604800000);  
              }  
              return kw;  
            }  
              
              </script>  
              </body>  
            </html>  
            
            

            Jonathan

      2. Hi!

        aber ich will die Anzahl der Reihen berechnen, die in dem Bild mit den roten Zahlen dargestellt sind.

        Dazu teilst du die Tage des Monats durch Sieben und rundest auf. Um herauszufinden, ob du außer den so berechneten Zeilen noch eine weitere benötigst, machst du folgendes:
        Du setzt du den Tag mit setDate() auf 1 und checkst mit getDay(), welcher Wochentag der 1. Tag des Monats ist. Wenn es ein Sonntag ist (0) benötigst du in jedem Fall eine weitere Zeile. Ansonsten nur, wenn Wochentag-1 + (TageDesMonats % 7) > 7 ist.
        (TageDesMonats % 7 sind die "überschüssigen" Tage, die also keine volle Woche ergeben.)
        Alternativ könnte man das ganze auch per switch/Schleifen oder was weiß ich machen, dürfte aber länger sein. Bei Monaten mit 30 Tagen braucht man nur eine zusätzliche Zeile, wenn der erste Tag ein Sonntag ist. Bei 31 Tagen, wenn der 1. ein Sonntag oder Samstag ist.
        Wenn der Februar 28 Tage hat, braucht man immer eine Zeile mehr, es sei denn  er beginnt mit einem Montag. Hat er 29 Tage, braucht man immer eine Zeile mehr, es sei denn er beginnt mit Montag oder Dienstag.

        mfG

        --
        Selfcode: ie:} fl:{ br:> va:) ls:< fo:( rl:? n4:# ss:| de:] js:| ch:? sh:( mo:? zu:)
        "And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."
        (Terry Pratchett)
  2. Hi!

    day = date.getDay();
    numrows = 1;
    if (day != 0)
    {
      numrows += Math.ceil((numdays - 8 + day) / 7);
    }
    else if (day == 0)
    {
      numrows += Math.ceil((numdays - 1) / 7);
    }

    Wisst ihr vielleicht, wie der Code mit "ceil" usw. zu verstehen ist?

    http://de.selfhtml.org/javascript/objekte/date.htm#get_day@title=getDay() Liefert den Tag als Zahl (0=Sonntag bis 6=Samstag)
    http://de.selfhtml.org/javascript/objekte/math.htm#ceil@title=ceil() Liefert die nächstgrößere Ganzzahl der als Parameter übergebenen Zahl.
    Es wird also von der Anzahl der Tage am Montag 7, am Dienstag 6, ...am Sonntag 1 abgezogen, das Ergebnis durch 7 geteilt und daraus die nächsthöhere Ganzzahl gebiltet. Warum genau das so gemacht wird, erschließt sich mir aus dem Codeschnipsel nicht ganz, da bräuchte ich den Rest.

    mfG

    --
    Selfcode: ie:} fl:{ br:> va:) ls:< fo:( rl:? n4:# ss:| de:] js:| ch:? sh:( mo:? zu:)
    "And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."
    (Terry Pratchett)
  3. Hi!

    Auch wenn es mit deinem Problem herzlich wenig zu tun hat: das Jahr 2000 war ein Schaltjahr, da es durch 400 teilbar ist - das müsste in

    }
    else if (month == 2 && year % 4 == 0 && year % 100 != 0)
    {
      numdays = 29;
    }
    else
    {
      numdays = 28;
    }

    noch ergänzt werden.

    Gruß aus Frankfurt

    Martin