2015-05-18 13 views
6

Quando faccio come qui di seguito,Rimozione parte "Z" da XMLGregorianCalender

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
calendar.setTime(startTime); // startTime Date 
DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar); 

ottengo in uscita come 2015-04-15T11:04:30.000Z.

Voglio che sia come 2015-04-15T11:04:30.000.

C'è un modo per raggiungere questo obiettivo?

risposta

1

farlo come seguire

DatatypeFactory df; 
try { 
    df = DatatypeFactory.newInstance(); 
    return df.newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")); 
} catch (DatatypeConfigurationException e) { 
    // throw new SomeRuntimeException(e); 
} 

o estendere nuova classe da XMLGregorianCalendar, ignorare toXMLFormat e quindi delegare tutti gli altri metodi per l'istanza contenuta.

class CustomXMLGregorianCalendar extends XMLGregorianCalendar 
{ 
    XMLGregorianCalendar calendar; 

    CustomXMLGregorianCalendar(XMLGregorianCalendar calendar){ 
     this.calendar = calendar; 
    } 

    public String toXMLFormat() { 
     String text = calendar.toXMLFormat(); 
     int pos = text.indexOf('Z'); 

     return pos < 0 ? text : text.substring(0,pos); 
    } 

    public void setTimezone(int offset){ calendar.setTimezone(offset); } 
    // ... 
} 
2

Questo perché il Locale fuso orario, per ottenere ciò che è necessario trasformare la data utilizzando SimpleDateFormat:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

UPDATE quando si commento:

I tried formatting it to a String then again parsing it to a Date. Then setting time in Calender object. Does not work. Still i get output as "2015-04-15T11:04:30.000Z"

Si deve capire che Calendar o Date gli oggetti sono memorizzati nel proprio formato, un'altra cosa è come li stampi, quindi in questo caso, per vedere 2015-04-15T11:04:30.000Z nelloLa rappresentazionenon ha importanza, quello che ti serve è avere la data corretta 2015-04-15 allo 11:04:30 mostrare questo nel formato desiderato è solo per rendere user-friendly il tuo output.

L'output che si ottiene è da Calendar.toString() e il metodo doc dice:

Return a string representation of this calendar. This method is intended to be used only for debugging purposes, and the format of the returned string may vary between implementations. The returned string may be empty but may not be null.

Quindi, al fine di memorizzare la data e l'ora, l'oggetto Calendar è corretto. Per stamparlo, devi trasformarlo in un String.

+0

ho provato la formattazione a una stringa poi di nuovo l'analisi ad una data. Quindi impostare l'ora nell'oggetto Calender. Non funziona. Ancora ottengo l'uscita come "2015-04-15T11: 04: 30.000Z". – Raj

+0

Il metodo'toString() 'di Calendar ha una sua implementazione !!! devi sovrascriverlo se vuoi cambiarlo, o semplicemente stampare una stringa formattata, non devi preoccuparti di come viene memorizzata ... –

+1

Grazie.Ho imparato molto da quella spiegazione. – Raj

8

risposta accettata o il mio Java sembra essere superata perché ho ricevuto questo errore: The method newXMLGregorianCalendar(String) in the type DatatypeFactory is not applicable for the arguments (SimpleDateFormat)

e non volevo prolungare, così ho risolto rimuovendo fuso orario:

xmlCalendar.setTimezone(DatatypeConstants.FIELD_UNDEFINED); 
2

Se si desidera rimuovere solo "Z" dall'oggetto XMLGregorianCalendar, chiamare questo metodo.

xmlDate.setTimezone (DatatypeConstants.FIELD_UNDEFINED)

0

ho avuto quella situazione ed è stato risolto, usando questa linea:

XMLGregorianCalendar dateNew = DatatypeFactory.newInstance().newXMLGregorianCalendar("2017-09-06T21:08:14");