Gaußsche wochentagsformel

Status
Nicht offen für weitere Antworten.
K

key

Gast
Hallo,

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

Die Formel selbst ist

Code:
     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:

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

Top Contributor
Compilierbaren code posten. Und ein Beispiel, wo's schiefgeht. Aber vermutlich hast du nur die Montas-Umrechnung von der Wikipedia-Seite ignoriert.
Code:
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

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

aus Uraltcode von mir kopiert:
Code:
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
Code:
m_tf = julianMonths.get((int)m_tf);
bei dir einfügst sollte es funktionieren.
 
K

key

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

Nocheinmal vielen Dank und noch einen schönen Abend
key
 

Marco13

Top Contributor
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 )
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben