Jeena Paradies: Monat in Tabellenform erstellen

Hallo,

Ich möchte einen Monat mit Hilfe einer Tabelle als Kalender erstellen, das Ergebnis soll dann in etwa so aussehen:

December 2006
 Su  Mo  Tu  We  Th  Fr  Sa
                      1   2
  3   4   5   6   7   8   9
 10  11  12  13  14  15  16
 17  18  19  20  21  22  23
 24  25  26  27  28  29  30
 31

Zur Verfügung steht mir Ruby und dort die Klasse Date. Irgendwie fehlt mir der Überblick wie ich so einen Monat Programmiertechnisch umsetzen kann dass das mit den Wochentagen auch passt.

Klar ist mir dass das mit zwei Schleifen gehen muss aber wie das komplette aussehen soll, da komme ich nicht drauf, hat vielleicht jemand Lust mir da auf die Sprünge zu helfen?

Grüße
Jeena Paradies

  1. Hallo Jeena,

    December 2006
    Su  Mo  Tu  We  Th  Fr  Sa

    Warum fängst Du mit Sonntag an? Wenn das ein hebräischer oder islamischer Kalender wäre, wäre das ja in Ordnung, aber beim gregorianischen Kalender finde ich das schlichtweg eine Unart. ;-)

    Klar ist mir dass das mit zwei Schleifen gehen muss aber wie das komplette aussehen soll, da komme ich nicht drauf, hat vielleicht jemand Lust mir da auf die Sprünge zu helfen?

    Nein, Du brauchst nur _eine_ Schleife, dazu gleich mehr.

    Erst einmal musst Du wissen, wie viele Tage in dem Monat sind, das kannst Du z.B. kurz selbst programmieren (die sind ja fest bzw. Februar hat alle 4 Jahre einen Tag mehr, alle 100 Jahre wieder nicht und alle 400 Jahre doch wieder) oder schauen, ob die Date-Klasse von Ruby Dir eine Funktion dafür bietet.

    Danach legst Du ein Date-Objekt für den ersten dieses Monats an. Du lässt Dir den Wochentag azurückgeben. Wenn es ein Montag ist, machst Du gar nichts, wenn es kein Montag ist, schreibst Du N leere Tabellenzellen, mit N = Anzahl der Tage bis zum nächsten Montag, bei Sonntag z.B. N = 1, bei Dienstag N = 6, etc.

    Danach programmierst Du eine Schleife, die folgendes macht:

    - Gib eine Tabellenzelle mit der aktuellen Tagesnummer aus.
     - Wenn Du gerade das letzte Datum des Monats ausgegeben hast, schließe
       die Tabelle ab und beende die Schleife.
     - Wenn der Wochentag ein Sonntag war, füge danach ein </tr><tr> ein
       (oder wenn's kein HTML ist halt was entsprechendes)
     - Erhöhe das Datum um eins

    Damit solltest Du Deinen Kalender bekommen.

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. Hallo,

      Vielen Dank, hat super geklappt :-)

      Grüße
      Jeena Paradies

    2. Hallo,

      Erst einmal musst Du wissen, wie viele Tage in dem Monat sind, das kannst Du z.B. kurz selbst programmieren (die sind ja fest bzw. Februar hat alle 4 Jahre einen Tag mehr, alle 100 Jahre wieder nicht und alle 400 Jahre doch wieder)

      Da mir das zu komplizert erschien ...

      oder schauen, ob die Date-Klasse von Ruby Dir eine Funktion dafür bietet.

      ... habe ich mir mit der Date-Klasse folgende Methode gebaut:

      # Calculates the amount of days in a month  
      def days_in_month (m=Time.now.month, y=Time.now.year)  
        require 'date'  
        return Date.new(m.year, m.month + 1) - m if m.kind_of? Date  
        if m.kind_of? Integer and m >= 1 and m <= 12 and y.kind_of? Integer  
          return (Date.new(m == 12 ? y.to_i + 1 : y, m == 12 ? 1 : m + 1) - Date.new(y, m)).to_i  
        end  
        raise TypeError, 'expected numeric (1 to 12 for m) or date'  
      end
      

      Grüße
      Jeena Paradies

      1. Hallo Jeena,

        Erst einmal musst Du wissen, wie viele Tage in dem Monat sind, das kannst Du z.B. kurz selbst programmieren (die sind ja fest bzw. Februar hat alle 4 Jahre einen Tag mehr, alle 100 Jahre wieder nicht und alle 400 Jahre doch wieder)
        Da mir das zu komplizert erschien ...

        Deine Methode ist aber ineffizent, da sie die Date-Klasse dazu bringt, lauter unnötige Berechnungen durchzuführen. Ich habe Dir Deine Methode mal umgeschrieben, dass sie nur noch elementare Berechnungen durchführt und nicht mehr mit Date rumrechnet.

        def days_in_month(m = Time.now.month, y = Time.now.year)  
            require 'date'  
            return days_in_month(m.month, m.year) if m.kind_of? Date  
            if m.kind_of? Integer and m >= 1 and m <= 12 and y.kind_of? Integer  
                odd = m % 2;  
                return (m == 2) ? (28 + ((y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) ? 1 : 0)) : ((m <= 7) ? (30 + odd) : (31 - odd));  
            end  
            raise TypeError, 'expected numeric (1 to 12 for m) or date'  
        end
        

        Gilt natürlich nur für den gregorianischen Kalender.

        Viele Grüße,
        Christian

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
  2. Tach Jeena,

    Klar ist mir dass das mit zwei Schleifen gehen muss aber wie das komplette aussehen soll, da komme ich nicht drauf, hat vielleicht jemand Lust mir da auf die Sprünge zu helfen?

    In diesem SVG-Beispiel ist eine JS-Kalenderfunktion enthalten, welche die gegebene Struktur abbildet, allerdings beim Montag beginnt.

    Man liest sich,
    svg4you