# Arbeitstage eines Monats herausfinden



## Flow25 (21. Mrz 2005)

Hallo zusammen,

für meine Anwendung benötige ich eine Funktion mit der ich die Arbeitstage (Mo-Fr) eines Monats feststellen kann.
Natürlich kann man dies umständlich über eine Schleife und das Abfragen des Wochentages der Klasse Calendar bzw. GregorianCalendar machen. Aber ich frage mich ob es da nicht eine vorgefertigte Java-Funktion für gibt??

Kann mir da jemand weiterhelfen??

Gruß Flow25


----------



## Campino (21. Mrz 2005)

Ich glaube , außer der


```
Kristallkugel.getWhatTheProgrammerWant();
```

gibt es da keineFunktion für.


----------



## Sky (21. Mrz 2005)

Campino hat gesagt.:
			
		

> Ich glaube , außer der
> 
> 
> ```
> ...



Scheint nicht ganz zu funktionieren, da kommt eine Fehlermeldung 
	
	
	
	





```
cannot resolve symbol: variable Kristallkugel in class Test at line 18, column 4
```
:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:


----------



## Flow25 (21. Mrz 2005)

Ok , wie kann ich das Ganze denn mit GregorianCalendar oder Calendar lösen?

Gruß Flow25


----------



## DP (21. Mrz 2005)

http://www.java-forum.org/de/viewtopic.php?t=15470


----------



## mic_checker (21. Mrz 2005)

Im Prinzip hast du dir die Antwort ja schon selbst gegeben, zumindest eine mögliche:
Du gehst die einzelnen Tage durch und schaust ob es sich dabei um einen Montag ... Freitag handelt.


```
GregorianCalendar cal = new GregorianCalendar(2005,3,1);
        int c=(cal.get(GregorianCalendar.DAY_OF_WEEK));
        switch (c)
        {
        case GregorianCalendar.MONDAY:
            System.out.println("MO");
            break;

        case GregorianCalendar.TUESDAY:
            System.out.println("DI");
            break;
        case GregorianCalendar.WEDNESDAY:
            System.out.println("MI");
            break;
        case GregorianCalendar.THURSDAY:
            System.out.println("DO");
            break;
        case GregorianCalendar.FRIDAY:
            System.out.println("FR");
            break;
        default:
            break;
        }
```

Somit prüfst du ob ein Tag ein Mo-Fr ist, musst dann nur noch weiter gehen....gab schon genug Threads zu GregorianCalendar


----------



## Flow25 (21. Mrz 2005)

Also sorry aber der Link hilft mir nicht wirklich weiter. Dort wird mit einer komplexen Formel der Ostersonntag berechnet. Wie soll ich damit oder mit dessen Hilfe die Anzahl der Arbeitstage eines Monats berechnen ??

Gruß Flow25


----------



## DP (21. Mrz 2005)

werktage = kalendertage - wochenenden - feiertage


----------



## P3AC3MAK3R (21. Mrz 2005)

Es reicht ja nicht, die Anzahl der Wochentage (Mo - Fr) zu summieren. Von der Summe müssen ja auch noch die Feiertage abgezogen werden. Daher vermutlich der Ostersonntag-Link.


----------



## mic_checker (21. Mrz 2005)

Das stimmt natürlich, aber ich ging mal davon aus das er das hinkriegt zusammen mit dem Link von DP direkt oben drüber


----------



## Flow25 (21. Mrz 2005)

@mic_checker: Danke, aber eine kleine Frage habe ich noch:

Die Tage des gewählten Monats müssen ja in einer Schleife durchlaufen werden.
In der Schleife müsste dann die von dir beschriebene Abfrage des Wochentages stattfinden und falls es ein Arbeitstag ist ein Zähler plus eins gesetzt werden. Die Frage ist jedoch wie kann ich die Tage des Monats in einer Schleife durchgehen, ohne zu wissen, wieviele Tage der Monat insgesamt beinhaltet.

Wie finde ich raus, wieviele Tage ein Monat besitzt?

Gruß Flow25


----------



## mic_checker (21. Mrz 2005)

Probiers mal damit:


```
GregorianCalendar cal = new GregorianCalendar(2005, GregorianCalendar.MARCH, 1);
    
int days = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
```


----------



## DP (21. Mrz 2005)

```
int anzahl_tage = new GregorianCalendar(TimeZone.getTimeZone("ECT")).getActualMaximum(Calendar.DAY_OF_MONTH)
```


----------



## Flow25 (21. Mrz 2005)

Ok, das mit den Wochenenden funktioniert. Leider bekomme ich auch mit Hilfe des Links nicht das Berechnen von Feiertagen hin.
Hat jemand noch ein Beispiel wie man ein GregorianCalendar-Object daraufhin überprüft ob es ein Feiertag ist??

Gruß Flow25


----------



## mic_checker (21. Mrz 2005)

Wo liegt dein Problem mit dem Source von DP?


----------



## Flow25 (21. Mrz 2005)

Ich verstehe nicht woher er das GregorianCalendar-Object bekommt. Das Ganze scheint ja irgendwie ne Klasse vom Typ GregorianCalendar zu sein (wegen dem Super()). 
Wie würde denn die gesamte Klasse inklusive Methode isFeiertag() aussehen??

P.S.: Mein Code sieht bisher so aus:



```
int month1 = MonatUmwandeln(monatA.getSelectedItem().toString());
GregorianCalendar cal = new GregorianCalendar();
cal.set(Calendar.MONTH, month1 - 1);
cal.set(Calendar.YEAR, Integer.parseInt(jahrA.getSelectedItem().toString()));
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
//int days = new GregorianCalendar(TimeZone.getTimeZone("ECT")).getActualMaximum(Calendar.DAY_OF_MONTH);
int zaehl = 0;
int Arbeitstage = 0;
while(zaehl <= days)
{
    GregorianCalendar gc = new GregorianCalendar(Integer.parseInt(jahrA.getSelectedItem().toString()), month1, zaehl);
    int wochentag = gc.get(Calendar.DAY_OF_WEEK);
    if (wochentag != gc.SATURDAY && wochentag != gc.SUNDAY)
    {
        //AN DIESER STELLE MÜSSTE ABGEFRAGT WERDEN OB gc EIN FEIERTAG IST, ÜBER isFeiertag()	
        if (isFeiertag(gc) == true)
        {
            Arbeitstage = Arbeitstage + 1;
        }
    }
}
System.out.println("Tage des Monats: " + days);
```

Gruß Flow25


----------



## Flow25 (21. Mrz 2005)

Hallo? Also ich habe die Methode jetzt folgendermaßen umgeschrieben:


```
private boolean isFeiertag(GregorianCalendar gc) 
	{ 
	    int jahr = gc.get(Calendar.YEAR); 
	  
	    int a = jahr % 19; 
	    int b = jahr % 4; 
	    int c = jahr % 7; 
	    int monat = 0; 
	  
	    int m = (8 * (jahr / 100) + 13) / 25 - 2; 
	    int s = jahr / 100 - jahr / 400 - 2; 
	    m = (15 + s - m) % 30; 
	    int n = (6 + s) % 7; 
	  
	    int d = (m + 19 * a) % 30; 
	  
	    if (d == 29) 
	      d = 28; 
	    else if (d == 28 && a >= 11) 
	      d = 27; 
	  
	    int e = (2 * b + 4 * c + 6 * d + n) % 7; 
	  
	    int tag = 21 + d + e + 1; 
	  
	    if (tag > 31) 
	    { 
	      tag = tag % 31; 
	      monat = 3; 
	    } 
	    if (tag <= 31) 
	      monat = 2; 
	  
	    GregorianCalendar gc_ostersonntag = new GregorianCalendar(jahr, monat, tag); 
	    GregorianCalendar gc_ostermontag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 1)); 
	    GregorianCalendar gc_karfreitag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) - 2));    
	    GregorianCalendar gc_rosenmontag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) - 48)); 
	    GregorianCalendar gc_christihimmelfahrt = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 39)); 
	    GregorianCalendar gc_pfinstsonntag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 49)); 
	    GregorianCalendar gc_pfinstmontag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 50)); 
	    GregorianCalendar gc_frohnleichnahm = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 60)); 
	    GregorianCalendar gc_wiedervereinigung = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 9, 1); 
	    GregorianCalendar gc_weihnachten_1 = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 11, 24); 
	    GregorianCalendar gc_weihnachten_2 = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 11, 25); 
	    GregorianCalendar gc_weihnachten_3 = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 11, 26); 
	    GregorianCalendar gc_silvester = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 11, 31); 
	    GregorianCalendar gc_neujahr = new GregorianCalendar(gc_silvester.get(Calendar.YEAR), 0, 1); 

	    if(gc_ostermontag.equals(this) || gc_karfreitag.equals(this) || gc_rosenmontag.equals(this) || gc_christihimmelfahrt.equals(this) || gc_pfinstmontag.equals(this) || gc_frohnleichnahm.equals(this) || gc_weihnachten_1.equals(this) || gc_weihnachten_2.equals(this) || gc_weihnachten_3.equals(this) || gc_silvester.equals(this) || gc_neujahr.equals(this) || gc_wiedervereinigung.equals(this)) 
	    { 
	      return true; 
	    } 
	    else 
	    { 
	      return false; 
	    } 
	    
	    
	  }
```

Mein Problem ist nun an der Stelle if(gc_ostermontag.equals(this) || gc_karfreitag.equals(this) || ... .

Was wird hier mit this abgefragt?? Was muss statt this bei mir stehen??

Gruß Flow25


----------



## DP (21. Mrz 2005)

anstatt this muss da dein übergebenes objekt rein. 

meine methode war aus einer klasse, welche die gregoriancalendar-klasse erbt.


----------



## Flow25 (21. Mrz 2005)

Ok, habe das Ganze jetzt mal mit Januar 2004 getestet. Hier war z.B. der 1. Januar ein Donnerstag, müsste also als Feiertag erkannt werden. Leider gibt mir mein Programm 22 Arbeitstage aus, was den 1. Januar mit einschließt.

Woran liegt das??

P.S.: Meine Codes habt ihr ja prinzipiell schon.

Gruß Flow25


----------



## Flow25 (21. Mrz 2005)

@DP: Sag mal kann es sein, dass du in deiner Ostersonntags-Berechnung Fehler hast.
Aufgefallen ist mir auf jeden Fall, dass du statt dem 03.10 den 01.10 als Tag der dt. Einheit festgelegt hast.
Außerdem wird der Ostersonntag nicht korrekt berechnet. Für 2004 kommt z.B. der 11.03 statt dem 11.04 heraus.

Könntest du bitte den Fehler bei der Berechnung des Ostersonntages aufdecken?
Ich weis nämlich nicht ob der Fehler an der Stelle:


```
if (tag > 31) 
{ 
      tag = tag % 31; 
      monat = 3; 
} 
if (tag <= 31) 
      monat = 2;
```

liegt oder irgendwo in deinen Berechnungs-Formeln...

Gruß Flow25


----------



## Roar (21. Mrz 2005)

sky80 hat gesagt.:
			
		

> Campino hat gesagt.:
> 
> 
> 
> ...



maaaahn kein wunder, du hast ja auch nich die JProphet API installiert :?


----------



## DP (21. Mrz 2005)

naja, dadurch dass die einheit erst am 03.10. war wird es deutschland auch nicht schlagartig besser gehen 

musste halt den gc_einheit auf einen anderen tag setzen...

wann letztes jahr ostern war kann ich auch nicht sagen, habe keinen alten kalender hier.

geh halt alle links durch aus dem besagten post, dann wirste fündig.

ich schaue nachher nochmal wenn ich nen anderen kalender habe.

cu


----------



## Flow25 (22. Mrz 2005)

Hallo zusammen, 

kann mir vielleicht jemand helfen den Buß und Bettag eines Jahres zu berechnen. 
Der Buß und Bettag fällt auf den Mittwoch vor dem Sonntag vor dem ersten Adventssonntag. Offensichtlich ist, dass der erste Adventssonntag drei Wochen vor dem vierten Adventssonntag liegt. Der vierte Adventssonntag wiederum ist der Sonntag vor dem 25. Dezember eines Jahres. 

Kann man das irgendwie mit GregorianCalendar lösen?? 

Angefangen habe ich ja schon: 

GregorianCalendar gc_buss = new GregorianCalendar(); 
gc_buss.set(Calendar.YEAR, gc_ostersonntag.get(Calendar.YEAR)); 
gc_buss.set(Calendar.MONTH, 11); 
gc_buss.set(Calendar.DATE, 25); 

Mir fehlen nun noch die Berechnung des Ganzen. 

Gruß Flow25


----------

