# Gaußsche wochentagsformel



## key (27. Mai 2008)

Hallo,

ich habe ein Problem mit der Gaußschen Wochentagsformel (http://de.wikipedia.org/wiki/Gaußsche_Wochentagsformel).

Die Formel selbst ist


```
A = d + [2,6 m – 0,2] + y + [y/4] + [c/4] – 2c
     w = A mod 7
```

was ich auch so benutzt habe. Leider funktioniert sie bei mir aber nicht was ja eigentlich nicht seien kann.

Hier ist mal mein Code:


```
public void wochentag() {
  double d_tf = Double.valueOf(tag_tf.getText()).doubleValue();
  double m_tf = Double.valueOf(monat_tf.getText()).doubleValue();
  //Das Jahr wird als String geholt, da so einzelne zeichen extrahiert werden können (substring)
  String jahr = String.valueOf(jahr_tf.getText());
  
  //Aus dem String "jahr" jeweils die ersten beiden und die letzten beiden Zeichen extrahieren
  String cc_s = jahr.substring(0, 2);
  String yy_s = jahr.substring(2, 4);
  //Die "String Teile" in double formatieren
  double cc_tf = Double.valueOf(cc_s);
  double yy_tf = Double.valueOf(yy_s);
  
  //Der Wochentag wird berechnet (Gaußsche Wochentagsformel)
  double h1 = Math.floor(2.6 * m_tf - 0.2);
  double h2 = Math.floor(yy_tf/4);
  double h3 = Math.floor(cc_tf/4);
  double h4 = 2 * cc_tf;
  double a = d_tf + h1 + yy_tf + h2 + h3 - h4;
  double w = a % 7;
  System.out.println(h1);
  System.out.println(h2);
  System.out.println(h3);
  System.out.println(h4);
  System.out.println(a);
  System.out.println(d_tf);
  System.out.println(yy_tf);
  System.out.println(w);
  
  //w wird in einen int umgewandelt
  int w_int = new Double(w).intValue();
  
  //die zahl wird einem wochentag zugeordnet
  switch (w_int) {
  case 0: ausgabe("Sonntag"); break;
  case 1: ausgabe("Montag"); break;
  case 2: ausgabe("Dienstag"); break;
  case 3: ausgabe("Mittwoch"); break;
  case 4: ausgabe("Donnerstag"); break;
  case 5: ausgabe("Freitag"); break;
  case 6: ausgabe("Samstag"); break;
  }
    
}
```

kann mir da evtl. einer helfen?

Vielen Dank im Voraus
key


----------



## Marco13 (27. Mai 2008)

Compilierbaren code posten. Und ein Beispiel, wo's schiefgeht. Aber vermutlich hast du nur die Montas-Umrechnung von der Wikipedia-Seite ignoriert.

```
class Wochentag
{
    public static void main(String args[])
    {
        wochentag(27, 3, 20, 8);
    }

public static void wochentag(double d_tf, double m_tf, double cc_tf, double yy_tf)
{
/*
  double d_tf = Double.valueOf(tag_tf.getText()).doubleValue();
  double m_tf = Double.valueOf(monat_tf.getText()).doubleValue();
  //Das Jahr wird als String geholt, da so einzelne zeichen extrahiert werden können (substring)
  String jahr = String.valueOf(jahr_tf.getText());

  //Aus dem String "jahr" jeweils die ersten beiden und die letzten beiden Zeichen extrahieren
  String cc_s = jahr.substring(0, 2);
  String yy_s = jahr.substring(2, 4);
  //Die "String Teile" in double formatieren
  double cc_tf = Double.valueOf(cc_s);
  double yy_tf = Double.valueOf(yy_s);
*/
  //Der Wochentag wird berechnet (Gaußsche Wochentagsformel)
  double h1 = Math.floor(2.6 * m_tf - 0.2);
  double h2 = Math.floor(yy_tf/4);
  double h3 = Math.floor(cc_tf/4);
  double h4 = 2 * cc_tf;
  double a = d_tf + h1 + yy_tf + h2 + h3 - h4;
  double w = a % 7;
  System.out.println(h1);
  System.out.println(h2);
  System.out.println(h3);
  System.out.println(h4);
  System.out.println(a);
  System.out.println(d_tf);
  System.out.println(yy_tf);
  System.out.println(w);

  //w wird in einen int umgewandelt
  int w_int = new Double(w).intValue();

  //die zahl wird einem wochentag zugeordnet
  switch (w_int) {
  case 0: System.out.println("Sonntag"); break;
  case 1: System.out.println("Montag"); break;
  case 2: System.out.println("Dienstag"); break;
  case 3: System.out.println("Mittwoch"); break;
  case 4: System.out.println("Donnerstag"); break;
  case 5: System.out.println("Freitag"); break;
  case 6: System.out.println("Samstag"); break;
  }

}
}
```


----------



## Joker (27. Mai 2008)

das ist hier in der Tat der Fehler hier. Zur Umrechnung würde ich eine HashMap<Integer,Integer> empfehlen.

aus Uraltcode von mir kopiert:

```
HashMap<Integer,Integer> julianMonths = new HashMap<Integer,Integer>();
julianMonths.put(3, 1);
julianMonths.put(4, 2);
julianMonths.put(5, 3);
julianMonths.put(6, 4);
julianMonths.put(7, 5);
julianMonths.put(8, 3);
julianMonths.put(9, 7);
julianMonths.put(10, 8);
julianMonths.put(11, 9);
julianMonths.put(12, 10);
julianMonths.put(1, 11);
julianMonths.put(2, 12);
```

wenn du dann noch eine Zeile

```
m_tf = julianMonths.get((int)m_tf);
```
bei dir einfügst sollte es funktionieren.


----------



## key (27. Mai 2008)

vielen Dank, ihr habt mir sehr geholfen. Das war tatsächlich der Fehler.

Nocheinmal vielen Dank und noch einen schönen Abend
key


----------



## Marco13 (28. Mai 2008)

Statt einer HashMap tut's hier auch ein Array. Eine HashMap verwendet man eher, wenn vom Definitionsbereich nur wenige Werte verwendet werden. (Wenn man von einem Objekt auf ein anderes mappen will, ist der Definitionsbereich eben 0....2^31-1 )


----------

