# XMLGregorianCalender parsen



## pemberton (16. Jul 2008)

Hallo,

ich habe ein Problem beim Umwandeln von long in XMLGregorianCalendar.

In meinem Projekt bearbeite ich einen Datumswert in verschiedenen Formaten:


1. als XMLGregorianCalendar-Objekt in einer XML-Datei.
2. als Long (Datumswert in Millisekunden) zur Ermittlung von Zeitspannen
3. als Date zum setzen und holen des Datums im JXDatePicker
4. als String zum Anzeigen des Datums in einer Editbox (Format von XMLGregorianCalendar.toString() )
Für das umwandeln in die verschiedenen Formate habe ich separate Methoden erstellt. Folgende Methode hat ein Problem:


```
public static XMLGregorianCalendar getXMLGregorianCalendarFromLong(long mSec_)
	{
		try
		{
			 // Rückgabewert
		     DatatypeFactory df = DatatypeFactory.newInstance();
			 XMLGregorianCalendar calendarXML = df.newXMLGregorianCalendar();  

			 Date date = new Date(mSec_);

			 System.out.println();
			 System.out.println("mSec_ : "+ new Date(mSec_).toLocaleString());
			 System.out.println("mSec_ : "+ date.toLocaleString());

			 //01.06.2008 13:07:55			 	System.out.println(date.toLocaleString());
			 //0000000000111111111122222222222
			 //0123456789012345678901234567890
			 
			 calendarXML.setYear(   Integer.parseInt( date.toLocaleString().substring(6, 10) ) );
			 calendarXML.setMonth(  Integer.parseInt( date.toLocaleString().substring(3,  5) ) ); 
			 calendarXML.setDay(    Integer.parseInt( date.toLocaleString().substring(0,  2) ) );
			 calendarXML.setHour(   Integer.parseInt( date.toLocaleString().substring(11, 13) ));
			 calendarXML.setMinute( Integer.parseInt( date.toLocaleString().substring(14, 16) ));
			 calendarXML.setSecond( Integer.parseInt( date.toLocaleString().substring(17, 19) ));
			 calendarXML.setTimezone(				  date.getTimezoneOffset()) ;
			 
			 System.out.println("xmlGC : "+ new Date(calendarXML.toGregorianCalendar().getTimeInMillis()).toLocaleString()); 
			 System.out.println("    --> "+calendarXML.toString());
			 return calendarXML;
	    }
	    catch (Exception ex)  
	    {
	    	System.out.println("Fehler beim parsen des Datums."+ex.getMessage());
	    	return null;
	    }
	}
```

Ausgabe in der Console:

```
mSec_ : 01.06.2008 13:07:55
mSec_ : 01.06.2008 13:07:55
xmlGC : 01.06.2008 17:07:55
    --> 2008-06-01T13:07:55-02:00
```

Hier bekomme ich eine Differenz von + 4 Stunden, wenn ich das XMLGregorianCalendar-Objekt wieder in Mikrosekunden umwandle. Hat jemand eine Idee woher das kommen kann? 4 Stunden sind nicht so einfach durch Sommer/ Winterzeit zu erklären.
Ich weiss zwar, das die Methode "toLocaleString() als 'deprecated' eingestuft ist, aber ich habe bisher keine besser Möglichkeit für die Umwandlung gefunden.

Kann mir jemand bei diesem Problem helfen?

Vielen Dank im Voraus

pemberton


----------



## Gelöschtes Mitglied 5909 (16. Jul 2008)

probier mal des ganze über GregorianCalendar zu machen


```
long milis = ...;
GrecorianCalendar calendar = new GregorianCalendar();
calendar.setTime(new Date(milis));
calendar.set(Calendar.HOUR, 3);
calendar.get(Calendar.ERA);
calendar.get(Calendar.YEAR);
calendar.get(Calendar.MONTH);
calendar.get(Calendar.WEEK_OF_YEAR);
calendar.get(Calendar.WEEK_OF_MONTH);
calendar.get(Calendar.DATE);
calendar.get(Calendar.DAY_OF_MONTH);
calendar.get(Calendar.DAY_OF_YEAR);
calendar.get(Calendar.DAY_OF_WEEK);
.....
```

da kannste dann auch die TimeZone setzen usw


----------



## pemberton (17. Jul 2008)

Hallo raiL,

danke für deine Antwort, aber leider verstehe ich nicht ganz wie du das meinst? Ich finde leider keine Methode, wie ich aus dem GregorianCalendar-Objekt ein XMLGregorianCalendar-Objekt machen kann.

calendarXML = calendar.getXMLGregorianCalendar();

so etwas in der art...

-
pemberton


----------



## Gelöschtes Mitglied 5909 (17. Jul 2008)

du machst das hier


```
calendarXML.setYear(   Integer.parseInt( date.toLocaleString().substring(6, 10) ) );
          calendarXML.setMonth(  Integer.parseInt( date.toLocaleString().substring(3,  5) ) );
          calendarXML.setDay(    Integer.parseInt( date.toLocaleString().substring(0,  2) ) );
          calendarXML.setHour(   Integer.parseInt( date.toLocaleString().substring(11, 13) ));
          calendarXML.setMinute( Integer.parseInt( date.toLocaleString().substring(14, 16) ));
          calendarXML.setSecond( Integer.parseInt( date.toLocaleString().substring(17, 19) ));
```


verwende statt dem substring kram des was ich oben geschrieben hab, die halbe Date Klasse ist deprecated


----------



## pemberton (17. Jul 2008)

Hallo raiL,

vielen Dank, jetzt funktioniert es!

Gruß pemberton



```
DatatypeFactory df = DatatypeFactory.newInstance();
    XMLGregorianCalendar gcXML = df.newXMLGregorianCalendar();  
			
    GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTime(new Date(System.currentTimeMillis()));

    gcXML.setYear(	    gc.get(Calendar.YEAR)); 
    gcXML.setMonth(	    gc.get(Calendar.MONTH)+1 ); 
    gcXML.setDay(	    gc.get(Calendar.DAY_OF_MONTH)); 
    gcXML.setHour(	    gc.get(Calendar.HOUR_OF_DAY)); 
    gcXML.setMinute(	    gc.get(Calendar.MINUTE)); 
    gcXML.setSecond(	    gc.get(Calendar.SECOND)); 
    gcXML.setTimezone(   gc.get(Calendar.DST_OFFSET) /60/1000           // Sommerzeit
		 + gc.get(Calendar.ZONE_OFFSET) /60/1000 ) ;     // Zeitzone
```


----------

