# bewegliche Feiertage berechnen



## JavaMaus1 (1. Apr 2011)

Hallo liebe Forums Gemeinde,

ich stehe gerade vor der Herausforderung die beweglichen Feiertage in Baden-Württemberg berechnen zu müssen. Das mit dem Osterdatum hat geklappt. Jetzt stehe ich vor der Herausforderung Christi Himmelfahrt berechnen zu wollen. Dies ist immer 39 Tage nach Ostern und immer im Marz oder im April. Leider versteht meine Software, in die ich das genze integrieren muss nichts von Klassen, daher sieht der Code etwas befremdlich aus.... aber ich bin zuversichtlich, ihr werdet es verstehen....

Hat jm. ne Idee wie man das Datum von Himmelfahrt berechen könnte? Habe kein Date Format sondern nur getrennte Integer für Tag, Monat und Jahr... 

Danke schon jetzt! :applaus:

[Java]
/*------------------------------------------------------------------------*/
/*Ermittlung der variablen Feiertage*/

/*Ostersonntag (OS)*/
int OS_a; int OS_b; int OS_c;  int OS_d; int OS_e;  int OS_f; int OS_g;  int OS_h; int OS_i; int OS_j; int OS_k; int OS_l; int OS_x;

	 		OS_a = jahr%19;
			OS_b = jahr/100;
			OS_c = jahr%100;
			OS_d = OS_b/4;
			OS_e = OS_b%4;
			OS_f = (OS_b+8)/25;
			OS_g = (OS_b-OS_f+1)/3;
			OS_h = (19*OS_a+OS_b-OS_d-OS_g+15)%30;
			OS_i = OS_c/4;
			OS_j = OS_c%4;
			OS_k = (32+2*OS_e+2*OS_i-OS_h-OS_j)%7;
			OS_l = (OS_a+11*OS_h+22*OS_k)/451;
			OS_x = OS_h+OS_k-7*OS_l+114;
			Ostermonat = OS_x/31;
			Ostertag = (OS_x%31)+1;
if (Ostermonat == monat && Ostertag == tag)
	{bez ="Ostersonntag"; bEMail=true;}

/*Karfreitag*/
if (Ostermonat == monat && Ostertag - 2 == tag)
	{bez ="Karfreitag"; bEMail=true;}

/*Ostermontag*/
if (Ostermonat == monat && Ostertag + 1 == tag)
	{bez ="Ostermontag"; bEMail=true;}

/*Christi Himmelfahrt (CH) - immer 39 Tage nach Ostern*/

/*??*/

[/code]


----------



## Quaxli (1. Apr 2011)

JavaMaus1 hat gesagt.:


> ...
> Hat jm. ne Idee wie man das Datum von Himmelfahrt berechen könnte? Habe kein Date Format sondern nur getrennte Integer für Tag, Monat und Jahr...
> ...
> [/code]



Heißt das, daß Du die Integer verwenden mußt, z. B. wg. einer Hausaufgabe oder nicht weißt welche Klasse Du heranziehen sollst?


----------



## JavaMaus1 (1. Apr 2011)

Ne, ich könnte sie benutzen, wenn die Software, in die ich den Code integriere, Konstruktoren o.ä. kennen würde. Leider kann die das nicht - das macht alles etwas komplex - sonst hätte man sich ja mit Simpledateformat behelfen können - das funktioniert aber leider nicht.... :-/


----------



## MarderFahrer (1. Apr 2011)

> Jetzt stehe ich vor der Herausforderung Christi Himmelfahrt berechnen zu wollen. Dies ist immer 39 Tage nach Ostern und immer im Marz oder im April.



Dieses Jahr ist Himmelfahrt am 2.6.2011. Oder bezog sich das "März oder im April" auf Ostern?

Nichtsdestotrotz, Ostern ist immer im April oder März. Wenn du das Datum hast, könntest du prüfen welcher Monat es im Einzelfall ist. Daran kann man auch ablesen wie viele Tage dieser Monat hat. März immer 31, April immer 30. Dann müsste man nur noch vom Ostertag 39 Tage dazu zählen. Und auf diese Weise kommt man dann beim Tag/Monat von Himmelfahrt an.


----------



## jgh (1. Apr 2011)

aber wir reden schon noch über java...deine übergabe-parameter sind halt integers, oder?
dann könnte man das bspw so rechnen, da du ja -wie auch immer- dein Ostersonntag gegeben hast:


```
public static void main(String[] args) {
		// das ist ja wie auch immer von dir gegeben:
//		dieses Jahr fällt Ostersonntag auf den 24.April 
		int osterSonntag = 24;
		int osterMonat = 4;
		int osterJahr = 2011;

		Calendar cal = new GregorianCalendar();
		cal.set(Calendar.DAY_OF_MONTH, osterSonntag);
		// btw Januar ist der 0. Monat, deswegen -1
		cal.set(Calendar.MONTH, osterMonat - 1);
		cal.set(Calendar.YEAR, osterJahr);
		// die 39 Tage addieren
		cal.add(Calendar.DAY_OF_YEAR, 39);

		int tagHimmelfahrt = cal.get(Calendar.DAY_OF_MONTH);
// hier die Addition des einen Monats für die übliche Darstellung nicht vergessen
		int monatHimmelfahrt = (cal.get(Calendar.MONTH)) + 1;
		int jahrHimmelfahrt = cal.get(Calendar.YEAR);

		// kurze Kontrollausgabe
		System.out.println("Himmelfahrt ist am " + tagHimmelfahrt + "."
				+ monatHimmelfahrt + "." + jahrHimmelfahrt);
	}
```

[XML]Ausgabe:
Himmelfahrt ist am 2.6.2011[/XML]


----------



## Quaxli (1. Apr 2011)

Oben steht aber, daß keine Klassen verwendet werden können. Da bleibt wohl nur, das Ganze zu Fuß auszukaspern.


----------



## jgh (1. Apr 2011)

> ...Leider versteht meine Software, in die ich das genze integrieren muss nichts von Klassen, daher sieht der Code etwas...



ich hatte das so verstanden, dass irgendeine Software die Feiertage benötigt und zwar als getrennte integer für tag/monat/jahr, und somit eine Übergabe als Date oder was auch immer nicht funktioniert.

Aber gut...evtl hast du Recht...wir werden es sehen


----------



## JavaMaus1 (1. Apr 2011)

So, danke erstmal für eure Hilfen.
Quaxli hat recht.... habe mal via Fußweg agiert :-/ Der Weg war lang... für euch nochmal der Code (ist besoimmt nicht der schönste, aber funktioniert nach den ersten tests ganz gut...


```
/*Christi Himmelfahrt (CH)*/
int CH_OS_MonatResttage;
int CH_b;

	/*Resttage des Monats ermitteln: ausschließlich März oder April*/
	if (Ostermonat ==3)
		CH_OS_MonatResttage = 31;
	else 
		CH_OS_MonatResttage = 30;

	CH_b = 39 - (CH_OS_MonatResttage - Ostertag);

	if (CH_b > 30 && Ostermonat == 3)
		{CH_tag = CH_b - 30; CH_monat = 5;}
	else if (CH_b < 30 && Ostermonat == 3)
		{CH_tag = CH_b; CH_monat = 4;}

	if (CH_b > 31 && Ostermonat == 4)
		{CH_tag = CH_b - 31; CH_monat = 6;}
	else if (CH_b < 30 && Ostermonat == 4)
		{CH_tag = CH_b; CH_monat = 5;}

if (CH_monat == monat && CH_tag == tag)
	{bez ="ChristiHimmelfahrt"; bEMail=true;}
```


----------

