2015-06-18 12 views
5

lubił poniżejJava8 LocalDateTime do XMLGregorianCalender Usuń "+05 30" część

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

Chcę wyjście jako 2015-06-18 11:59:15:135, ale kiedy ustawić xcal do tag XML, który zaczyna XMLGregorianCalender, to pokazuje jak 2015-06-18T11:59:15.135+05:30.

Jak mogę usunąć porcję +05:30?

+1

Czy wypróbowałeś 'DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.toString())' używając reprezentacji leksykalnej w ISO-8601? –

+0

@Meno Hochschild: Nie, nie zrobiłam. Ale teraz próbowałem i działa dobrze. Dziękuję Ci bardzo. Czy możesz proszę Opublikuj tę odpowiedź, aby móc oznaczyć ją jako rozwiązaną i wybrać jako rozwiązanie. – Raj

Odpowiedz

7

użyć tego kodu:

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

Objaśnienie:

Kod korzysta z danej factory method spodziewa się leksykograficznego reprezentacji lokalnej datownik w ISO-8601-PDF. A ponieważ LocalDateTime nie odnosi się do żadnej strefy czasowej, jej wyjście przez toString() nie może zawierać przesunięcia strefy czasowej. Wynik: XMLGregorianCalendar uważa przesunięcie strefy czasowej jako "nie ustawiono".

Korekta:

Oryginalny kod nie specjalnie martwić o ISO-wariantu sformatowanym wyjściu currentUTCTime.toString(). Jednak java.time-API daje wyjście bez sekund lub nanosekund, jeśli te części są równe zeru. Jest to całkowicie legalne w ISO, ale konsorcjum W3C uczyniło część drugą nieobowiązkową. Klasa XMLGregorianCalendar ściśle przestrzega tej odbiegającej specyfikacji. Dlatego pokazany hack powyżej za pomocą prostego konkatenacji ciąg w tym specjalnym przypadku krawędzi. Wielkie dzięki za komentarz Dave'a. Nawiasem mówiąc, użycie opcji currentUTCTime.format(DateTimeFormatter.ISO_DATE_TIME) sugerowanej w tym komentarzu jest również możliwe (zamiast pokazanego hacka).

+1

To nie działa. To, czego potrzebujesz, to DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.format (DateTimeFormatter.ISO_DATE_TIME)). XMLGregorianCalendar.newXMLGregorianCalendar (String) wymaga, aby jego argumenty zawierały sekundy. Jeśli sekundy == 0 LocalDateTime.toString() pominie sekundy i poprzednie: separator całkowicie powoduje, że metoda fabryki kalendarzy rzuci wyjątek IllegalArgumentException. – Dave

+0

@Dave Teraz poprawiłem moją odpowiedź. –

+0

Byłoby lepiej użyć formatyzatora niż instrukcji if, – JodaStephen

Powiązane problemy