Announcement

Collapse
No announcement yet.

Fehler bei Wochentagsberechnung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehler bei Wochentagsberechnung

    Hallo,

    ich würde gern den Wochentag zu einem gegebenen Datum bestimmen. natürlich funktioniert das mit der Calendar-Klasse einwandfrei, für ein Projekt müsste ich das allerdings "manuell" implementieren. Ich habe dazu folgenden Code erstellt:

    Code:
    import java.util.*;
    
    public class Test
    {
      public String getDayOfWeek(Date date)
      {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
    
        // Tag, Monat, Jahr des Datums ermitteln
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int month = cal.get(Calendar.MONTH);
        int year = cal.get(Calendar.YEAR);
    
        // die Tagesziffer berechnen
        int digit1 = day % 7;
    
        // die Monatsziffer bestimmen
        int digit2 = 0;
        switch (month)
        {
          case 0:    // Januar
            digit2 = 0;
            break;
          case 1:    // Februar
            digit2 = 3;
            break;
          case 2:    // März
            digit2 = 3;
            break;
          case 3:    // April
            digit2 = 6;
            break;
          case 4:    // Mai
            digit2 = 1;
            break;
          case 5:    // Juni
            digit2 = 4;
            break;
          case 6:    // Juli
            digit2 = 6;
            break;
          case 7:    // August
            digit2 = 2;
            break;
          case 8:    // September
            digit2 = 5;
            break;
          case 9:    // Oktober
            digit2 = 0;
            break;
          case 10:   // November
            digit2 = 3;
            break;
          case 11:   // Dezember
            digit2 = 5;
            break;
        }
    
        // die Jahresziffer berechnen
        int y = Integer.parseInt(Integer.toString(year).substring(2));
        int digit3 = (y + y/4) % 7;
    
        // die Jahrhundertziffer berechnen
        int a = Integer.parseInt(Integer.toString(year).substring(0, 2));
        int digit4 = (3 - (a % 4)) * 2;
    
        // die Schaltjahreskorrektur bestimmen
        int digit5 = 0;
        if (isLeapYear(year)) digit5 = 6;
    
        // Wochentag bestimmen
        int weekday = (digit1 + digit2 + digit3 + digit4 + digit5) % 7;
    
        // Name des Wochentages festlegen
        String dayName = "";
        switch (weekday)
        {
          case 0: dayName = "Sonntag"; break;
          case 1: dayName = "Montag"; break;
          case 2: dayName = "Dienstag"; break;
          case 3: dayName = "Mittwoch"; break;
          case 4: dayName = "Donnerstag"; break;
          case 5: dayName = "Freitag"; break;
          case 6: dayName = "Samstag"; break;
        }
    
        return dayName;
      }
    
      private boolean isLeapYear(int year)
      {
        return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
      }
    
      public static void main(String[] args)
      {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_MONTH, 24);
        cal.set(Calendar.MONTH, 11);
        cal.set(Calendar.YEAR, 2012);
        Test t = new Test();
        System.out.println(t.getDayOfWeek(cal.getTime()));
      }
    }
    Natürlich lässt sich der Quelltext noch optimieren, z. B. die Switches durch Arrays ersetzen oder mehrere Berechnungen in einer Formel zusammenfassen. Mir geht's allerdings erstmal nur um's Prinzip. Das Problem ist nämlich, dass Heiligabend dieses Jahr an einem Montag ist und nicht an einem Sonntag, wie diese Methode ausgibt. Ich vermute, dass es am Schalttag liegt, alleerdings dachte ich, dass der bei der Schaltjahreskorrektur (digit5) bereits berücksichtigt ist. Wie müsste ich das Ganze modifizieren?

    Vielen Dank und viele Grüße

  • #2
    korrigiere doch einfach

    digit5=7;

    Schau doch da nach, woher du den Algorithmus hast bsp.

    http://5dspace-time.org/Calendar/Algorithm.html


    http://www.techlabs4u.com/2011/09/ja...iven-date.html

    http://en.wikipedia.org/wiki/Determi...ay_of_the_week
    Zuletzt editiert von Christian Marquardt; 25.05.2012, 16:38.
    Christian

    Comment


    • #3
      Hallo Christian,

      erstmal vielen Dank für deine Antwort. leider funktioniert das so auch nicht. Wenn du nämlich beispielsweise den 28. Februar 2012 einstellst, wird nun ebenfalls ein falscher Wochentag erreichnet.

      Viele Grüße

      Comment


      • #4
        Erscheint nachvollziehar, da die Erhöhung wohl nut ab 29.2 statffinden sollte, da erst ab diesem Zeitpunkt ein Tag hinzukommt
        Christian

        Comment

        Working...
        X