Vergleich Datum mit Feiertag funktioniert nicht ?

Status
Nicht offen für weitere Antworten.

spidermobile

Bekanntes Mitglied
Hallo zusammen,

ich habe im Forum eine Ermittlung für Feiertage gefunden. Diese möchte ich nun implementieren. Ich übergeben einen String, formatieren diesen und stelle dann den Vergleichg an (Siehe Testausgaben). Wenn ich mir die Ausgaben ansehe, sieht alles gut aus, allerdings scheint etwas an der Formatierung zu fehlen, da der Feiertag nicht mit "true" zurückgegeben wird.

Was habe ich falsch gemacht?

Code:
package project;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class Feiertage {

	private int jahr;
	private String datum;
	private DateFormat formatDay;
	
	public Feiertage() {
		super();
	}

	public boolean isFeiertag(String datum)
	  {
		this.datum = datum;
		
		Date datumFormat = null; 
		formatDay = new SimpleDateFormat("dd.MM.yyyy");
		
		try {
			datumFormat = formatDay.parse(datum);
			System.out.println("[INFO   ]: Datum konvertiert nach: " + datumFormat );

		}
			catch(Exception ex) {
			System.out.println("[WARNUNG]: Datumskonvertierung fehlgeschlagen!");
		}
		
	    Calendar tmp_datum = new GregorianCalendar();
 	    tmp_datum.setTime(datumFormat);

	    int jahr = tmp_datum.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, 3);
	    GregorianCalendar gc_erster_mai = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 4, 1);
	    GregorianCalendar gc_drei_koenige = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 0, 6);
		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_ostersonntag.getTime().equals(tmp_datum) ||
		   gc_ostermontag.getTime().equals(tmp_datum) || 
		   gc_karfreitag.getTime().equals(tmp_datum) || 
		   gc_christihimmelfahrt.getTime().equals(tmp_datum) ||
		   gc_pfinstsonntag.getTime().equals(tmp_datum) ||
		   gc_pfinstmontag.getTime().equals(tmp_datum) || 
		   gc_frohnleichnahm.getTime().equals(tmp_datum) || 
		   gc_weihnachten_1.getTime().equals(tmp_datum) || 
		   gc_weihnachten_2.getTime().equals(tmp_datum) || 
		   gc_weihnachten_3.getTime().equals(tmp_datum) || 
		   gc_silvester.getTime().equals(tmp_datum) || 
		   gc_neujahr.getTime().equals(tmp_datum) || 
		   gc_wiedervereinigung.getTime().equals(tmp_datum) || 
		   gc_erster_mai.getTime().equals(tmp_datum) || 
		   gc_drei_koenige.getTime().equals(tmp_datum))
	    {
	      return true;
	    }
	    else
	    {
	      return false;
	    }
	   
	   
	  }

}
 
mir fällt nur auf das im dicken vergleich unten
ein Date mit einem Calender verglichen wird?
warum das keinen fehler produziert weiß ich net, aber jedenfalls kommt auch keiner wenn man das .getTime() da rausschneidet..

wie soll man denn das ding aufrufen um es zu testen??
 
Hallo Solour,

ja das ist ja mein Problem. Da ich diese Klasse nicht entwickelt habe (hab Sie hier im Forum gefunden) 🙂 , kenne ich mich leider auch nicht so mit dem Code aus. Aufrufen tu ich diese im Moment nur testwiese aus einer anderen klasse :

Code:
private String mainEinDatum;
...
System.out.println("Feiertag: " + feiertage.isFeiertag(mainEinDatum));
...

Wie muss ich denn den Vergleich am Besten formulieren?
 
Hi,

ja und vielen Dank auch. :applaus:

Ich hatte ein Problem mit dem Konvertieren. Nun habe ich es so gelöst und es funktioniert.

Code:
.compareTo

war wohl die Lösung?


Code:
	    if((gc_ostersonntag.compareTo(tmp_datum) == 0) ||
		   (gc_ostermontag.compareTo(tmp_datum) == 0) || 
		   (gc_karfreitag.compareTo(tmp_datum) == 0) || 
		   (gc_christihimmelfahrt.compareTo(tmp_datum) == 0) ||
		   (gc_pfinstsonntag.compareTo(tmp_datum) == 0) ||
		   (gc_pfinstmontag.compareTo(tmp_datum) == 0) || 
		   (gc_frohnleichnahm.compareTo(tmp_datum) == 0) || 
		   (gc_weihnachten_1.compareTo(tmp_datum) == 0) || 
		   (gc_weihnachten_2.compareTo(tmp_datum) == 0) || 
		   (gc_weihnachten_3.compareTo(tmp_datum) == 0) || 
		   (gc_silvester.compareTo(tmp_datum) == 0) || 
		   (gc_neujahr.compareTo(tmp_datum) == 0) || 
		   (gc_wiedervereinigung.compareTo(tmp_datum) == 0) || 
		   (gc_erster_mai.compareTo(tmp_datum) == 0) || 
		   (gc_drei_koenige.compareTo(tmp_datum) == 0))
	    {
	      return true;
	    }
	    else
	    {
	      return false;
	    }
[/code]
 
wäre es nicht einfacher/besser hier gleich folgendes zu schreiben?

Code:
       return ((gc_ostersonntag.compareTo(tmp_datum) == 0) ||
         (gc_ostermontag.compareTo(tmp_datum) == 0) ||
         (gc_karfreitag.compareTo(tmp_datum) == 0) ||
         (gc_christihimmelfahrt.compareTo(tmp_datum) == 0) ||
         (gc_pfinstsonntag.compareTo(tmp_datum) == 0) ||
         (gc_pfinstmontag.compareTo(tmp_datum) == 0) ||
         (gc_frohnleichnahm.compareTo(tmp_datum) == 0) ||
         (gc_weihnachten_1.compareTo(tmp_datum) == 0) ||
         (gc_weihnachten_2.compareTo(tmp_datum) == 0) ||
         (gc_weihnachten_3.compareTo(tmp_datum) == 0) ||
         (gc_silvester.compareTo(tmp_datum) == 0) ||
         (gc_neujahr.compareTo(tmp_datum) == 0) ||
         (gc_wiedervereinigung.compareTo(tmp_datum) == 0) ||
         (gc_erster_mai.compareTo(tmp_datum) == 0) ||
         (gc_drei_koenige.compareTo(tmp_datum) == 0));
 
Der Thread ist schon etwas älter, aber wenn man nach Feiertagen sucht stößt man immer wieder auf diesen Thread, daher die Info:
Bei der Berechnung vom Ostersonntag ist ein Fehler drin, als Monat kommt immer März raus, also dieses Jahr kommt statt 8. April 8.März raus! Damit stimmen dann auch alle anderen Feiertage die vom Ostersonntag ausgehend berechnet werden nicht mehr!

Zeile 62-68:
Code:
if (tag > 31)
       {
         tag = tag % 31;
         monat = 3;
       }
       if (tag <= 31)
         monat = 2;

ersetzen durch:
Code:
if (tag > 31)
       {
         tag = tag % 31;
         monat = 3;
       } else {
         monat = 2;
       }


Gruß
Nova
 
Doch, da ist ein Unterschied
Beispiel tag=39:
if (tag > 31) liefert true und der Schleifenrumpf wird ausgeführt
dort wird tag = tag%31 gerechnet, d.h. tag ist nun immer kleiner als 31 (in diesem Fall 8)
if (tag <= 31)
ist somit immer true und "monat" wird von 3 auf 2 geändert
Sprich die erste if-Abfrage beeinflusst die zweite.

Wenn man aber mit else arbeitet wird monat nur dann auf 2 gesetzt wenn tag VORHER <= 31 war


Gruß
Nova
 
Guten Morgen,

ich hänge mich jetzt mal an diesen Thread, weil ich genau das gleiche Problem habe. Der Codeschnipsel zur Feiertagsberechnung und dem Vergleich funktioniert bei mir einfach nicht. Ich erhalte als Datum für Ostersonntag den 23.02.08 anstatt den 23.03.08 mit folgendem Code:

Code:
    public static boolean isHoliday(Integer holidayInt, Date date) {
        String validity = "";
        if (holidayInt == 2) {
            validity = "CH";
        } else {
            validity = "D-BW";
        }

        Calendar tmp_date = new GregorianCalendar();
        tmp_date.setTime(date);

        int year = tmp_date.get(Calendar.YEAR);

        int a = year % 19;
        int b = year % 4;
        int c = year % 7;
        int month = 0;

        int m = (8 * (year / 100) + 13) / 25 - 2;
        int s = year / 100 - year / 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 day = 21 + d + e + 1;

        if (day > 31) {
            day = day % 31;
            month = 3;
        } else {
            month = 2;
        }

// Deutschland / Baden-Württemberg
        GregorianCalendar gc_ostersonntag = new GregorianCalendar(year, month, day);
        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_christihimmelfahrt = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR),
                gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 39));
        GregorianCalendar gc_pfingstsonntag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR),
                gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 49));
        GregorianCalendar gc_pfingstmontag = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR),
                gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 50));
        GregorianCalendar gc_fronleichnam = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR),
                gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 60));
        GregorianCalendar gc_tag_der_deutschen_einheit = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 9, 3);
        GregorianCalendar gc_tag_der_arbeit = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 4, 1);
        GregorianCalendar gc_drei_koenige = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 0, 6);
        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);
        GregorianCalendar gc_allerheiligen = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 10, 1);

// Schweiz

        GregorianCalendar gc_auffahrt = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR),
                gc_ostersonntag.get(Calendar.MONTH), (gc_ostersonntag.get(Calendar.DATE) + 39));
        GregorianCalendar gc_bundesfeier = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 7, 1);

        if (validity.equals("D-BW") && (
                (gc_ostermontag.compareTo(tmp_date) == 0) ||
                (gc_karfreitag.compareTo(tmp_date) == 0) ||
                (gc_pfingstsonntag.compareTo(tmp_date) == 0) ||
                (gc_pfingstmontag.compareTo(tmp_date) == 0) ||
                (gc_fronleichnam.compareTo(tmp_date) == 0) ||
                (gc_christihimmelfahrt.compareTo(tmp_date) == 0) ||
                //(gc_weihnachten_1.compareTo(tmp_date) == 0) ||
                (gc_weihnachten_2.compareTo(tmp_date) == 0) ||
                (gc_weihnachten_3.compareTo(tmp_date) == 0) ||
                //(gc_silvester.compareTo(tmp_datum) == 0) ||
                (gc_neujahr.compareTo(tmp_date) == 0) ||
                (gc_tag_der_deutschen_einheit.compareTo(tmp_date) == 0) ||
                (gc_tag_der_arbeit.compareTo(tmp_date) == 0) ||
                (gc_drei_koenige.compareTo(tmp_date) == 0) ||
                (gc_allerheiligen.compareTo(tmp_date) == 0))) {
            return true;
        } else if (validity.equals("CH") && (
                (gc_auffahrt.compareTo(tmp_date) == 0) ||
                (gc_bundesfeier.compareTo(tmp_date) == 0))) {
            return true;
        } else {
            return false;
        }
    }

Kann mir jemand von euch sagen, was ich falsch gemacht habe? Gibt es vielleicht eine Alternative zur Feiertagsberechnung?

Liebe Grüße
Susanne
 
erstmal den Code lesbarer machen:
statt x-mal
gc_ostersonntag.get(Calendar.YEAR)
zu schreiben definiere dir eine Variable
osYear,
genauso bei anderen Wiederholungen

-------

und einfach so 'funktioniert nicht' ist keine Frage,
was geht nicht?
Compiler-Fehler, Exception zur Laufzeit oder nur falsche Ergebnisse?
was bekommst du an Feiertagen raus,
stimmen die oder nicht?

fange mit EINEM Feiertag an, nicht mit 20 auf einmal,
und ist Unterscheidung nach BW/ Schweiz wirklich in der ersten Version schon nötig?
verrückt..


edit:
oh, bei dem Layout habe ich den ersten Satz überlesen 😉
also ein konkretes Datum ist falsch,
wie wird das berechnet?
schreibe doch mal ein kurzes Programm nur mit diesem Datum, dann sieht man auch was..
 
Hallo SlaterB,

na, entschuldige, dass ich das Codebeispiel vom Forum hier verwende :roll:

Was nicht funktioniert, habe ich oben geschrieben: Ich erhalte als Datum für Ostersonntag den 23.02.08 anstatt den 23.03.08 mit folgendem Code:

Nicht mehr, nicht weniger - reicht aber schon, um nicht in die korrekte Abfrage reinzulaufen. Das siehst Du sicher ein, oder?

Edit: Ah, da haben sich unsere Postings überschnitten. Also nochmal gekürzt:

Code:
    public static boolean isHoliday(Integer holidayInt, Date date) {
        String validity = "";
        if (holidayInt == 2) {
            validity = "CH";
        } else {
            validity = "D-BW";
        }

        Calendar tmp_date = new GregorianCalendar();
        tmp_date.setTime(date);

        int year = tmp_date.get(Calendar.YEAR);

        int a = year % 19;
        int b = year % 4;
        int c = year % 7;
        int month = 0;

        int m = (8 * (year / 100) + 13) / 25 - 2;
        int s = year / 100 - year / 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 day = 21 + d + e + 1;

        if (day > 31) {
            day = day % 31;
            month = 3;
        } else {
            month = 2;
        }

// Deutschland / Baden-Württemberg
        GregorianCalendar gc_ostersonntag = new GregorianCalendar(year, month, day);
        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.compareTo(tmp_date) == 0) ||
                (gc_neujahr.compareTo(tmp_date) == 0)) {
            return true;
        } else {
            return false;
        }
    }

Als Datum übergebe ich den 01.01.2008 - der ja als Neujahr eigentlich ein Feiertag sein sollte. Aber wie gesagt: die Abfrage liefert mit ein false.

Wie das falsche Datum berechnet wird, sollte eigentlich meinem Codebeispiel zu entnehmen sein.

Liebe Grüße
Susanne
 
Hast du beachten das die monate von 0-11 gehen, d.h. wenn er dir 23.02. rausspuckt ist es der 23. März!
Mit der oben von mir geposteten Codeänderung bekomme ich korrekt den 23.03. als Ostersonntag raus.


Gruß
Nova
 
Vermutlich hast du bei dem Date-Objekt das du übergibst einen Fehler gemacht.
Dort musst du Month auf 2 setzen und nicht auf 3 wenn du März haben willst!
month=0 ist januar, month=1 ist Februar,...month=11 ist dezember
 
immer noch ist das alles Unfug, wenn ich mal wieder so drastisch sprechen darf? 😉
es ist absolut unersichtlich was nicht funktionert,
z.B. verrätst du gar nicht welches Objekt du übergibts, das falsch raus kommt usw.,
vorhin ging es um Ostern, nun um Neujahr?

bei mir funktionierts..
(ohne compare, nur mit Ausgaben, ich nehme mal an compare geht dann auch..)
Code:
public class Test2
{
    public static void main(String[] args)
    {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.DAY_OF_YEAR, 1);
        c.set(Calendar.YEAR, 2008);
        isHoliday(c.getTime());

    }


    public static void isHoliday(Date date)
    {


        Calendar tmp_date = new GregorianCalendar();
        tmp_date.setTime(date);

        int year = tmp_date.get(Calendar.YEAR);

        int a = year % 19;
        int b = year % 4;
        int c = year % 7;
        int month = 0;

        int m = (8 * (year / 100) + 13) / 25 - 2;
        int s = year / 100 - year / 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 day = 21 + d + e + 1;

        if (day > 31)
        {
            day = day % 31;
            month = 3;
        }
        else
        {
            month = 2;
        }

        GregorianCalendar gc_ostersonntag = new GregorianCalendar(year, month, day);
        GregorianCalendar gc_silvester = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 11, 31);
        GregorianCalendar gc_neujahr = new GregorianCalendar(gc_silvester.get(Calendar.YEAR), 0, 1);

        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
        System.out.println(df.format(tmp_date.getTime()));
        System.out.println(df.format(gc_ostersonntag.getTime()));
        System.out.println(df.format(gc_silvester.getTime()));
        System.out.println(df.format(gc_neujahr.getTime()));

    }
}

->
01.01.2008
23.03.2008
31.12.2008
01.01.2008
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben