2015-06-18 7 views
5

piaciuto di seguito,Java8 LocalDateTime a XMLGregorianCalender Rimuovi "+05: 30" Porzione

LocalDateTime currentUTCTime = LocalDateTime.now(ZoneId.of("UTC")); 
String reqPattern = currentUTCTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS")); 
System.out.println("Required pattern: " + reqPattern); 
GregorianCalendar calendar = GregorianCalendar.from(currentUTCTime.atZone(ZoneId.systemDefault())); 
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar); 
System.out.println("But Showing As :" + xcal); 

Voglio l'output come 2015-06-18 11:59:15:135, ma quando ho impostato il tag XML xcal a che prende XMLGregorianCalender, mostra come 2015-06-18T11:59:15.135+05:30.

Come posso rimuovere la parte +05:30?

+1

Hai provato 'DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.toString())' utilizzando la rappresentazione lessicale in ISO-8601? –

+0

@Meno Hochschild: No, non l'ho fatto. Ma provato ora e funziona bene. Grazie mille. Potete per favore postare questa risposta così posso contrassegnarla come risolta e sceglierla come soluzione. – Raj

risposta

7

di questo codice:

LocalDateTime currentUTCTime = LocalDateTime.now(); // using system timezone 
String iso = currentUTCTime.toString(); 
if (currentUTCTime.getSecond() == 0 && currentUTCTime.getNano() == 0) { 
    iso += ":00"; // necessary hack because the second part is not optional in XML 
} 
XMLGregorianCalendar xml = 
    DatatypeFactory.newInstance().newXMLGregorianCalendar(iso‌​); 

Spiegazione:

Il codice fa uso del data factory method aspettandosi una rappresentazione lessicografica di un timestamp locale nella norma ISO-8601-formato. E poiché un LocalDateTime non fa riferimento a nessun fuso orario, la sua uscita tramite toString() non può contenere un offset del fuso orario. Risultato: XMLGregorianCalendar considera l'offset del fuso orario come "non impostato".

Correzione:

Il codice originale non si è preoccupato soprattutto per l'ISO-variante di output formattato di currentUTCTime.toString(). Tuttavia, lo java.time-API produce un'uscita senza secondi o nanosecondi se tali parti sono uguali a zero. Questo è perfettamente legale in ISO, ma il consorzio W3C ha reso la seconda parte non opzionale. E la classe XMLGregorianCalendar segue da vicino questa specifica deviante. Di conseguenza, l'incisione mostrata sopra usando la semplice concatenazione di stringhe in questo caso di bordo speciale. Grazie mille per il commento di @Dave. A proposito, è anche possibile utilizzare currentUTCTime.format(DateTimeFormatter.ISO_DATE_TIME) come suggerito in questo commento (invece della modifica mostrata).

+1

Questo non funziona. Quello che vuoi è DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.format (DateTimeFormatter.ISO_DATE_TIME)). XMLGregorianCalendar.newXMLGregorianCalendar (String) richiede che il suo argomento abbia i secondi popolati. Se secondi == 0 LocalDateTime.toString() ometterà i secondi e il suo precedente: separatore causando completamente il metodo factory calendar per lanciare un IllegalArgumentException. – Dave

+0

@Dave Ora ho modificato la mia risposta. –

+0

Sarebbe meglio usare un formatter che l'hack dell'istruzione if – JodaStephen

Problemi correlati