Calendar Neujahr

Sakura26

Mitglied
Hallo allerseits,

mein Kollege ist aus der Firma weg gegangen und nun muss ich sein Projekt weiter führen. Ich habe jetzt damit ein Problem, weil an manchen Stellen keine Kommentare vorhanden sind und ich nicht weiß was an den Code-Fragment getan wird.

Ich brauche Hilfe mit der Ausgabe der Feiertage

Code:
	public static Vector<DateX> getHolidays(int year)
	{
		int jahr = 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_mariaehimmelfahrt = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 7, 15);
		GregorianCalendar gc_wiedervereinigung = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 9, 3);
		GregorianCalendar gc_allerheiligen = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 10, 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);
		
		
		Vector<DateX> dates = new Vector<DateX>();
		
		dates.add(new DateX(gc_ostermontag.getTimeInMillis(),"Ostermontag"));
		dates.add(new DateX(gc_karfreitag.getTimeInMillis(),"Karfreitag"));
		dates.add(new DateX(gc_rosenmontag.getTimeInMillis(),"Rosemontag"));
		dates.add(new DateX(gc_christihimmelfahrt.getTimeInMillis(),"Christi Himmelfahrt"));
		dates.add(new DateX(gc_pfinstsonntag.getTimeInMillis(),"Pfingstsonntag"));
		dates.add(new DateX(gc_pfinstmontag.getTimeInMillis(),"Pfingstmontag"));
		dates.add(new DateX(gc_frohnleichnahm.getTimeInMillis(),"Frohenleichnahm"));
		dates.add(new DateX(gc_mariaehimmelfahrt.getTimeInMillis(),"Mariä Himmelfahrt"));
		dates.add(new DateX(gc_weihnachten_1.getTimeInMillis(),"Weihnachten"));
		dates.add(new DateX(gc_weihnachten_2.getTimeInMillis(),"1. Weihnachtsfeiertag"));
		dates.add(new DateX(gc_weihnachten_3.getTimeInMillis(),"2. Weihnachtsfeiertag"));
		dates.add(new DateX(gc_silvester.getTimeInMillis(),"Silvester"));
		dates.add(new DateX(gc_neujahr.getTimeInMillis(),"Neujahr"));
		dates.add(new DateX(gc_wiedervereinigung.getTimeInMillis(),"Wiedervereinigung"));
		dates.add(new DateX(gc_allerheiligen.getTimeInMillis(),"Allerheiligen"));
	
		
		
		return dates;
	}

Mein Problem ist bei der Ausgabe des Neujahr, wieso funktioniert dieser nicht. Ist etwas an der Berechnung falsch? Google hat auch nichts gebracht....Vielen Dank im vorraus.
 
Zuletzt bearbeitet von einem Moderator:

Sakura26

Mitglied
Ja den Thread habe ich mir auch schon angeschaut und gemerkt das es der selbe Code ist, nein das ist der aber nicht. Er hat wahrscheinlich den Code von den Thread kopiert.
 
S

SlaterB

Gast
allgemein kann man Calendar in Java schon manche Ungenauigkeit zusprechen, im Programm unten etwa
liefert die Ausgabe von gc_neujahr
Code:
java.util.GregorianCalendar[time=?,areFieldsSet=false,
[..]
ERA=?,YEAR=2012,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=1,
[..]
HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
also ein paar Lücken,
getTimeInMillis() sollte aber einen guten Wert liefern, bei dem Aufruf wird dann der Rest nachgerechnet,
hole diesen raus, schaue ihn dir an, vergleiche ihn mit denen der anderen Dati

wenn er nicht gerade -1 oder 0 ist oder ähnlich komisches, warum sollte dieser dann ein Problem sein?
was mit deinem unbekannten DateX los ist kann ohne weitere Infos/ Code nun niemand erahnen,
vielleicht arbeitet das in einer anderen Zeitzone und findet dann 0:00 am 1. Tag des Jahres nicht gut,
rutscht ins Vorjahr,

probiere mal 3 Stunden draufzuaddieren oder nimm den 2. Januar

was ist überhaupt das Problem? keine Fehlermeldung gepostet

-----

im Übrigen kannst du für das Neujahr auf die ganzen Berechnungen verzichten,
> GregorianCalendar gc_neujahr = new GregorianCalendar(year, 0, 1);
mit dem Parameter year müsste genauso gehen,
damit kommst du an die Millisekunden-Zeit für diesen Tag,
ob richtig oder nicht kannst du ja selber nachrechnen, auch andere Wege nehmen,
etwa Silvester des Vorjahres + 1 Tage bzw. ohne Calendar die entsprechenden Millisekunden addieren


> ich nicht weiß was an den Code-Fragment getan wird.
fällt also weg, so bedenklich es überhaupt ist von 1. Semester Uni/ Ausbildung abgesehen

-----
Java:
public class Test
{
    public static void main(String[] args)
    {
        getHolidays(2012);
    }

    public static void getHolidays(int year)
    {
        int jahr = 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_mariaehimmelfahrt = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 7, 15);
        GregorianCalendar gc_wiedervereinigung = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 9, 3);
        GregorianCalendar gc_allerheiligen = new GregorianCalendar(gc_ostersonntag.get(Calendar.YEAR), 10, 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);
        
//        System.out.println(new Date(gc_neujahr.getTimeInMillis()));        
        System.out.println(gc_silvester);
        System.out.println(gc_neujahr);
        System.out.println(gc_neujahr.getTimeInMillis());
        System.out.println(gc_neujahr.getTime());
        System.out.println(gc_neujahr.getTimeInMillis());
        System.out.println(new Date(gc_neujahr.getTimeInMillis()));        
    }
}

edit:
alle Aufrufe gc_ostersonntag.get(Calendar.YEAR) usw. sind unnütz, die Variable jahr/ year wäre viel kürzer und klarer..
 
Zuletzt bearbeitet von einem Moderator:

Sakura26

Mitglied
edit:
alle Aufrufe gc_ostersonntag.get(Calendar.YEAR) usw. sind unnütz, die Variable jahr/ year wäre viel kürzer und klarer..

Ich weiß werde ich auch dementsprechend ändern, muss gerade versuchen den Code zu kapieren. Es ist nicht gerade wenig bei 60 Klassen. :D Vielen Dank für deine Hilfe.

edit: Ich bekomme keine Fehlermeldung, das Problem ist einfach nur das der 1 nicht als Feiertag angezeigt wird. Der 1. Januar wird gar nicht beachtet...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> Der 1. Januar wird gar nicht beachtet...

was tausende andere Ursache haben kann, vielleicht wird von der dates-Liste das letzte Element in einer fehlerhaften Schleife ignoriert oder oder oder,


man kann auch etwas testen,
z.B. in einer Schleife i = 1 bis 10
mit new GregorianCalendar(2012,0,i)
die Tage 1. Januar bis 10. Januar erzeugen, davon DateX und diese weiterreichen,
wie sieht es damit aus, 2. Janur bis 10. Januar erkannt, erster immer noch nicht?
 

Sakura26

Mitglied
> Der 1. Januar wird gar nicht beachtet...

was tausende andere Ursache haben kann, vielleicht wird von der dates-Liste das letzte Element in einer fehlerhaften Schleife ignoriert oder oder oder,


man kann auch etwas testen,
z.B. in einer Schleife i = 1 bis 10
mit new GregorianCalendar(2012,0,i)
die Tage 1. Januar bis 10. Januar erzeugen, davon DateX und diese weiterreichen,
wie sieht es damit aus, 2. Janur bis 10. Januar erkannt, erster immer noch nicht?

So habe es mit deinen Vorschlag versucht, der 1 Januar bis zum 6 Januar werden komplett von der Schleife ignoriert. Ich habe in den anderen Klassen geschaut die diese Methode aufrufen und die scheinen alle korrekt zu sein. ???:L
 
S

SlaterB

Gast
also ich kann deinem Smily nur beipflichten und habe nichts weiter vorzuschlagen, wird ja nur schlimmer

nur Code, vollständige Programme, haben Aussagen
 

Sakura26

Mitglied
Hiermit werden die Feiertage grafisch dargestellt:

Code:
		AsyncCallback <Vector<DateX>> callback2 = new AsyncCallback<Vector<DateX>>()
		{
			@Override
			public void onFailure(Throwable caught)
			{
				caught.printStackTrace();
			}

			@Override
			public void onSuccess(Vector<DateX> result)
			{
				
				if(result != null)
				{
					for(DateX d : result)
					{
						c.addAppointment(createHolidayApp(d));
					}
				}
			}
		};
		
		if(isMonthView())
		{
		
			entryService.getHolidays(c.getDate().getYear()+1900, callback2);
		
		}
		else
		{
			entryService.getHolidays(c.getDate().getYear()+1900, callback2);	
		}
		ready = false;
		c.clearAppointments();
		ready = true;
	}
	
	public Appointment createHolidayApp(DateX d)
	{
		Appointment app = new Appointment();
		app.setAllDay(true);
		app.setReadOnly(true);
		app.setStart(new Date(d.getDate()));
		app.setEnd(new Date(d.getDate()));
		app.setTitle(d.getName()+"");
		app.setStyle(AppointmentStyle.PINK);
		return app;

Die DateX Klasse:

Code:
public DateX(long date, String name)
	{
		this.date = date;
		setName(name);
	}
	
	public void setName(String name)
	{
		this.name = name;
	}
	
	public String getName()
	{
		return this.name;
	}
	
	public String toString()
	{
		
		return name + " " +date;
	}

	public long getDate() {
		return this.date;
 
S

SlaterB

Gast
das Erstellen der Appointment ist wieder etwas, was man mit System.out.println() prüfen könnte,
letztlich aber auch nur ein Zwischenschritt, die eigentlich interessante Stelle ist weiter ausgespart,

noch ist ja nichtmal bekannt was das Ziel ist, eine Swing-GUI, eine WebApp oder irgendwas noch abenteuerliches?
an der letzten Stelle von der Übergabe kann man sich die Daten anschauen,

und wenn 10 Appointment übergeben werden, aber nur 5 davon angezeigt, die sich nicht sichtbar von den anderen 5 unterscheiden,
ist das letztlich Pech, sofern eine Black Box, die nicht weiter zu untersuchen ist,
natürlich ist es immer noch möglich, das weiter zu untersuchen,
der neueste Code ist besser als nix, auch wenn ich daraus leider keine weiteren neuen Schlüsse ziehen kann,

aber um es nochmal grundsätzlich zu erwähnen:
sinnvolle Programmierung setzt kontrollierte Umgebung mit überprüfbaren Eingaben, Zwischen- und Endergebnissen voraus,

an ein unbekanntes Framework Parameter mit unbekannter Bedeutung zu übergeben ist eher Spielerei wie Videorekorder-Aufnahme (warum geht diese Showview-Zahl nicht?), nicht unbedingt ein Java-Thema
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
B Calendar Java Basics - Anfänger-Themen 5
N Erste Schritte Calendar.DAY_OF_YEAR Java Basics - Anfänger-Themen 3
D Unterschied Date - Calendar Java Basics - Anfänger-Themen 1
I iCal Calendar mit Password und Username Java Basics - Anfänger-Themen 0
E Gregorian Calendar übergibt falschen Wochentag Java Basics - Anfänger-Themen 2
P Tag der Zeitumstellung Sommer->Winterzeit (Java Calendar) Problem Java Basics - Anfänger-Themen 5
T Calendar Methode roll(); Java Basics - Anfänger-Themen 2
J Calendar holidays Java Basics - Anfänger-Themen 4
L Datediff calendar Java Basics - Anfänger-Themen 3
D Java Date/Calendar Problem Java Basics - Anfänger-Themen 4
T Heutiges datum OHNE Calendar? Java Basics - Anfänger-Themen 9
M Calendar-Prüfung funktioniert nicht korrekt Java Basics - Anfänger-Themen 6
K Java Calendar Time Java Basics - Anfänger-Themen 10
N Fehler Calendar Java Basics - Anfänger-Themen 4
B Klassen Gregorian Calendar Java Basics - Anfänger-Themen 3
G Gregorian Calendar Eingabeprüfung Java Basics - Anfänger-Themen 4
M Calendar add-Funktion Java Basics - Anfänger-Themen 2
M Probleme mit Calendar Java Basics - Anfänger-Themen 9
0 Calendar - komme nicht weiter mit add Java Basics - Anfänger-Themen 2
lumo Datentypen Calendar to string und retour? Java Basics - Anfänger-Themen 4
S Calendar -- today Java Basics - Anfänger-Themen 4
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
W String zu Calendar parsen Java Basics - Anfänger-Themen 4
P (Arbeitstag-) Calendar - 9 anstatt 24 Stunden Java Basics - Anfänger-Themen 12
B Fehlermeldung für Calendar Java Basics - Anfänger-Themen 20
H Calendar rechnet möglicherweise falsch Java Basics - Anfänger-Themen 6
N Calendar Probleme Java Basics - Anfänger-Themen 5
G Gregorian Calendar aus toString() Ausgabe wiederherstellen Java Basics - Anfänger-Themen 4
A calendar Java Basics - Anfänger-Themen 6
K java.util.Calendar und Objekt Java Basics - Anfänger-Themen 7
C Problem Date / Calendar Java Basics - Anfänger-Themen 3
Paule Problem mit Date und Calendar Java Basics - Anfänger-Themen 3
W Gregorian Calendar Java Basics - Anfänger-Themen 5
S Calendar.set Time, Ermittlung der Anzahl Tage fehlerhaft Java Basics - Anfänger-Themen 9
G Probleme mit Konvertierung und Substraktion im Calendar Java Basics - Anfänger-Themen 4
S Konvertieren von Gregorian Calendar nach Date ? Java Basics - Anfänger-Themen 6
L Gregorian Calendar Problem Java Basics - Anfänger-Themen 7
S Calendar.set Methode Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben