# jollyday: prüfen, ob Datum = Feiertag



## chrissy (8. Nov 2011)

Hallo,  

ich möchte gerne prüfen, ob ein Tag, in einem bestimmten Land ein Feiertag ist. Dabei bin ich im Netz auf Jollyday gestossen. 
Nun gibt es dort eigentlich auch die Möglichkeit mit  isHoliday ein Datum auf Feiertage zu überprüfen.
Ich habe folgenden Code, der einfach erstmal nur alle Feiertage für Deutschland / Ba-Wü ausgibt und am Ende ein Datum auf Feiertag überprüft.
Das Datum wird auch als Feiertag aufgelistet, allerdings wird immer "false" ausgegeben. Wenn ich mit isHoliday überprüfe.


```
LocalDate testDate = new LocalDate(2011, 12, 25);
    
HolidayManager manager = HolidayManager.getInstance(HolidayCalendar.GERMANY);
    
Set<Holiday> holidays = manager.getHolidays(2011, "bw");
for(Holiday h : holidays)
{
    System.out.println(h.getDate() + " " + h.getDescription());
}  
    
System.out.println(manager.isHoliday(testDate, "bw"));
```

Kennt jemand vielleicht dieses Package und kann mir weiterhelfen???

Danke
chrissy


----------



## MarderFahrer (8. Nov 2011)

Meine erste Frage wäre, was genau ist testDate? Also die Klasse LocalDate? Denn was ich von der Klasse HolidayManager gesehen habe, benötigt die Methode isHoliday() als ersten Parameter ein normales Objekt der Klasse java/util/calendar. 

Mein erster Tip würde also in die Richtung gehen, dass der Manager immer false zurückgibt, weil er mit testDate nicht umgehen kann. Warum auch immer. Man könnte einmal den Manager testen, indem man ihm ein "Original Calendar Objekt" übergibt um zu sehen, ob damit die gewünschte Ausgabe erzielt wird.


----------



## chrissy (9. Nov 2011)

Hallo MarderFahrer,

das stimmt so nicht ganz ... der HolidayManager erwartet bei isHoliday ein Calendar-Object ODER ein LocalDate.

```
public boolean isHoliday(Calendar c,  String... args)

Calls isHoliday with JODA time object.

See Also:
        Manager.isHoliday(LocalDate c, String... args)

public boolean isHoliday(org.joda.time.LocalDate c, String... args)

Show if the requested date is a holiday.

Parameters:
        c - The potential holiday.
        args - Hierarchy to request the holidays for. i.e. args = {'ny'} -> New York holidays 
Returns:
        is a holiday in the state/region
```

Ich habe nun aber mal sicherheitshalber mit einem Calendar-Object getestet, wobei das Ergebnis das gleiche ist, es wird immer "false" zurückgeliefert.

Weitere Ideen?

Danke


----------



## HoaX (9. Nov 2011)

Prüf mal ob 12 als Monat wirklich der Dezember ist. Bei Calendar ist er das nämlich nicht.


----------



## turtle (9. Nov 2011)

Gibt bei mir true

```
Calendar testDate = GregorianCalendar.getInstance();
		testDate.set(2011, 11, 25);

		HolidayManager manager = HolidayManager
				.getInstance(HolidayCalendar.GERMANY);

		Set<Holiday> holidays = manager.getHolidays(2011, "bw");
		for (Holiday h : holidays) {
			System.out.println(h.getDate() + " " + h.getDescription());
		}
		System.out.println(manager.isHoliday(testDate, "bw"));
```


----------



## HoaX (9. Nov 2011)

Jaja, auf den Monat-Parameter fällt am Anfang so gut wie jeder rein...


----------



## chrissy (10. Nov 2011)

Hallo, danke für die vielen Hinweise. Der Code von turtle funktioniert bei mir auch. Allerdings stellt sich mir noch die Frage, warum mein LocalDate nicht funktioniert. 
Da an meine Funktion ein LocalDate übergeben wird, möchte ich dieses auch ohne großes umwandeln nutzen.
Ich habe nun mal überpüft, wie das beim LocalDate mit dem Monat ist ...

```
LocalDate testDate1 = new LocalDate(2011, 12, 25);
System.out.println(testDate1.monthOfYear().getAsText());
```

und die Ausgabe ist "Dezember", also sollte ja eigentlich beim isHoliday "true" zurückkommen. Wenn dazu vielleicht noch jemand eine Idee hat, wäre das nett, ansonsten muss ich halt mein LocalDate in ein Calendar umwandeln.

Danke
chrissy


----------



## MarderFahrer (10. Nov 2011)

Ich denke, ich weiß jetzt den Grund. Intern wird das Calendar Objekt in ein LocalDate Objekt gewandelt. Dummerweise wird dort aber anhand des Jahres entweder Julian Chronology oder Gregorian Chronology benutzt beim erstellen des neuen LocalDates.

Und wenn man sich den Default Konstruktor von LocalDate anschaut, so sieht man, dass per default "ISOChronology" beim erstellen des LocalDates genutzt wird. Dieser Unterschied ist der Grund, warum in deinem Fall "false" zurückgegeben wird.

Das lässt sich ganz leicht testen, indem du zusätzlich die Chronology vorgibst. Also ungefähr so:

```
LocalDate testDate = new LocalDate(2011, 12, 25, GregorianChronology.getInstance());
```

Das ist der identische Aufruf aus deinem ursprünlichen Code, nur mit einem zusätzlichen Parameter erweitert. Und damit sollte dann auch "true" zurückgegeben werden.

Das Problem ist also, dass in der Klasse LocalDate per Default eine andere Chronology benutzt wird als hinterher in der Klasse des HolidayManagers gebraucht wird zur überprüfung des date Objektes.


----------



## chrissy (10. Nov 2011)

Hallo Marderfahrer,

danke für deine gründliche Recherche, soweit bin ich gar nicht vorgedrungen ...
Jetzt funktioniert's.

chrissy


----------

