# Vergleichen von 2 Calendar-Objekten, warum nicht gleich?



## LinuxUser03 (23. Juni 2009)

Hallo an die Gemeinde,

ich bastel im Moment an einem Programm um Messdierpläne automatisch zu erstellen. Dabei erstelle ich in einer Klasse Zeitraum für ein übergebenes (Gregorian)Calendarobjekt, das den Anfangs-Zeitpunkt bestimmt, und eins das den End-Zeitpunkt bestimmt eine Arraylist von Messe-Objekten. Jedes Messeobjekt hat als Eigenschaften ein Calendarobjekt, das den Tag, mit Uhrzeit enthält und einen int in der die benötigte Anzahl an Messdienern bestimmt wird.

Nun will ich es ermöglichen eine Messe zu löschen, weil immer wieder mal Messen ausfallen. Dabei übergebe ich ein Cal. Objekt, mit dem Zeitpunkt, und überprüfe ob das in der Arraylist von Zeitraum drin ist, dann löschen.. nur leider sind die Objekte nie gleich. Wenn ich mir die toString ausgaben von einem Messe-CalendarObjekt, und die des für den Vergleich gebauten ansehe, erkenne ich immer wieder Unterschiede bei "Day_Of_Week", "Day_Of_Week_In_Month usw.

Hier einmal der Codeschnipsel, wo ich das vergleichsobjekt baue:

```
private Calendar stringToCal(String str){
			//Input in der Form "dd:MM:JJJJ hh:mm"
			//Erstmal in Uhrzeit und Datum zerteilen
			String[] Split1 = new String[2];
			Split1= str.split(" ");
			//Dann das Datum zerlegen
			String[] Datum = new String[3];
			Datum = Split1[0].split("\\.");
			//Dann die Uhrzeit
			String[] Zeit = new String[2];
			Zeit = Split1[1].split(":");
			
			Calendar cal = Calendar.getInstance();
			cal.set(Calendar.DATE, Integer.parseInt(Datum[0]));
			cal.set(Calendar.MONTH, Integer.parseInt(Datum[1])-1);
			cal.set(Calendar.YEAR, Integer.parseInt(Datum[2]));
			cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(Zeit[0]));
			cal.set(Calendar.MINUTE, Integer.parseInt(Zeit[1]));
			cal.set(Calendar.SECOND,0);
			cal.set(Calendar.MILLISECOND,0);
		return cal;
	}
```
Ich hole mir den String aus der Anzeigetabelle, (Die Selektierte Zeile) und will den wieder als Calendar objekt zusammenbauen.

Das übergebe ich dann an die vergleichsmethode von der Zeitraum-Klasse:

```
public void delMesse(Calendar cal){
		//Die System outs sind teilweise unterschiedlich!
		System.out.println(Zeitraum.get(0).getCal().toString());
		System.out.println(cal.toString());
		if (Zeitraum.contains(cal)){
			System.out.println(true);
		}
}
```

Eine Beispielausgabe, villeicht ist das hilfreich:

```
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2009,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=156,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=30,SECOND=0,MILLISECOND=0,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2009,MONTH=5,WEEK_OF_YEAR=26,WEEK_OF_MONTH=4,DAY_OF_MONTH=2,DAY_OF_YEAR=174,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=7,HOUR_OF_DAY=18,MINUTE=30,SECOND=0,MILLISECOND=0,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
```

das Zusammenbauen habe ich auch schonmal mit einem DateFormat versucht, so:

```
private Calendar stringToCal(String str){
			Date d = new Date();
			Calendar cal = Calendar.getInstance();
			DateFormat formatter = DateFormat.getDateTimeInstance();
			try {
				d = formatter.parse(str);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			cal.setTime(d);
			cal.set(Calendar.MILLISECOND,0);
		return cal;
	}
```

Aber auch das geht nicht.


Das wahr jetzt viel Text, ich hoffe mein Problem ist klar geworden.

Villeicht hat jemand von euch eine Idee?

Danke, Lg LinuxUser03


----------



## LinuxUser03 (23. Juni 2009)

Mhhh.. also ich habe jetzt noch etwas rumgebastelt. Jetzt schreibe ich einfach Calendar Objekte in meine Tabelle. Schon sind beide Objekte gleich. Naja.. so geht ja. Nur ist die toString von Calendar zimlich unhandlich. wie bekomme ich da eine vernünftige Ausgabe?

sorry, dass ich schon wieder poste, aber langsam verzweifel ich. Die Strings sind augenscheinlich gleich, wenn ich sie mir untereinander ausgeben lasse, erkenne ich keine Abweichung.
Wenn ich die Strings allerdings über equals vergleiche, schlägt dieser vergleich immer fehl.
Daraus folgt das auch das direkte Vergleichen der Objekte fehlschlägt.
Ideen?
Von welchen Faktoren hängt es denn ab, dass die equals von Calendar eine gleichheit angibt. Oder hat jemand eine andere Idee des Vergleiches?
ICh könnte natürlich auch die einzelnen Daten aus dem Calendar Objekt auslesen, und einzeln vergleichen, aber das ist ja nicht Sinn der erfindung.


confusede grüße LinuxUser03


----------



## vfl_freak (24. Juni 2009)

Moin,

wenn das "equal" fehlschlägt, würde ich schon davon ausgehen, dass die zu vergleichenden Objekte NICHT gleich sind ! !  



> Die Strings sind augenscheinlich gleich


Aha, und wie hast Du dieses festgestellt?

Ich könnte mir vorstellen, dass sie sich bspw. durch nicht sichtbare Zeichen (Steuerzeichen oder auch ein Blank) unterscheiden!

Versuch' doch mal, nicht das gesamte Kalender-Objekt, sondern die einzelnen Komponenten (Datum, Uhrzeit etc.) zu vergleichen! Vielleicht hilft das bei der Fehlersuche ....

Gruß
Klaus


----------



## zeja (24. Juni 2009)

Wenn du einen String wieder in ein Datum haben willst benutze bitte das SimpleDateFormat und bastle da nicht selber rum.

Schöner wäre es aber wenn du das Datumsobjekt direkt im Tabellenmodell liegen hast. Mit einem Renderer kannst du ja die Anzeige entsprechend bestimmen.


----------



## LinuxUser03 (24. Juni 2009)

Ok, ich schau mal nach, wie ich das mit dem Renderer hinbekomme...

Wegen der gleichheit: Ich habe mir die Strings auf der Konsole ausgeben lassen, und sie dann händisch verglichen. Ich umgehe das ganze dann aber, in dem ich Versuche das Datumsobjekt in die Tabelle zu bekommen.

Lg LinuxUser03


----------



## {Eve} (4. Juli 2009)

Hi,

vielleicht hilft dir das weiter:

```
Calendar a = Calendar.getInstance();
Calendar b = Calendar.getInstance();
   
a.compareTo(b);
```


----------



## LinuxUser03 (6. Juli 2009)

Hallo Eve,

danke, aber ich habe es mitlerweile anders geregelt, villeicht etwas unsauber, aber es geht. In meiner Tabellenklasse speichere ich einfach das komplette Messe-Objekt, dass in der Tabelle angezeigt wird, so kann ich ohne Umweg alle Daten abfragen, ohne "rumbasteln" zu müssen. Wenn ich alles soweit fertig habe, setze ich mich villeicht nocheinmal hin, und versuche es anders, aber nach knapp 1,5 Wochen Entwicklungsstillstand, weil ich damit nicht weiterkam war ich es leid


Lg Markus


----------

