2015-06-18 5 views
5

wie unten Did,Java8 Local zu XMLGregorianCalender entfernen "+05: 30" Portion

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); 

ich die Ausgabe als 2015-06-18 11:59:15:135 will, aber wenn ich den xcal zu einen XML-Tag gesetzt, die XMLGregorianCalender nimmt, zeigt es wie 2015-06-18T11:59:15.135+05:30.

Wie kann ich den +05:30 Teil entfernen?

+1

Haben Sie versucht, 'DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.toString())' in ISO-8601 die lexikalische Darstellung verwendet? –

+0

@Meno Hochschild: Nein, ich habe nicht. Aber jetzt versucht und es funktioniert gut. Vielen Dank. Kannst du bitte diese Antwort posten, damit ich sie als gelöst markieren und als Lösung auswählen kann. – Raj

Antwort

7

Mit diesem Code:

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‌​); 

Erläuterung:

Der Code nutzt die gegebenen factory method eine lexikographische Darstellung eines lokalen Zeitstempel in ISO-8601-Format erwartet. Und da sich eine LocalDateTime nicht auf eine Zeitzone bezieht, kann ihre Ausgabe über toString() keinen Zeitzonenversatz enthalten. Ergebnis: XMLGregorianCalendar berücksichtigt den Zeitzonenoffset als "nicht gesetzt".

Korrektur:

Der ursprüngliche Code hat über die ISO-Variante von formatierten Ausgabe von currentUTCTime.toString() nicht besonders stören. Die java.time-API erzeugt jedoch eine Ausgabe ohne Sekunden oder Nanosekunden, wenn diese Teile gleich Null sind. Dies ist in der ISO völlig legal, aber das W3C-Konsortium hat den zweiten Teil nicht optional gemacht. Und die Klasse XMLGregorianCalendar folgt genau dieser abweichenden Spezifikation. Daher der oben gezeigte Hack mit einer einfachen String-Verkettung in diesem speziellen Edge-Case. Vielen Dank an Daves Kommentar. Übrigens ist auch die Verwendung von , wie in diesem Kommentar vorgeschlagen, möglich (anstelle des gezeigten Hacks).

+1

Dies funktioniert nicht. Was Sie wollen, ist DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.format (DateTimeFormatter.ISO_DATE_TIME)). XMLGregorianCalendar.newXMLGregorianCalendar (String) erfordert, dass das Argument des Arguments Sekunden enthält. Wenn seconds == 0 LocalDateTime.toString() ignoriert die Sekunden und das vorangehende: separator verursacht vollständig, dass die Kalenderfactory-Methode eine IllegalArgumentException auslöst. – Dave

+0

@Dave Habe jetzt meine Antwort angepasst. –

+0

Es wäre besser, einen Formatierer als den If-Statement-Hack zu verwenden – JodaStephen

Verwandte Themen