2015-06-18 14 views
5

Did như dưới đây,Java8 LocalDateTime để XMLGregorianCalender Hủy bỏ "05: 30" Phần

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

Tôi muốn đầu ra như 2015-06-18 11:59:15:135, nhưng khi tôi đặt xcal để một thẻ XML mà mất XMLGregorianCalender, nó cho thấy như 2015-06-18T11:59:15.135+05:30.

Tôi có thể xóa phần +05:30 bằng cách nào?

+1

Bạn đã thử 'DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.toString())' bằng cách sử dụng biểu diễn từ vựng trong ISO-8601? –

+0

@Meno Hochschild: Không, tôi không biết. Nhưng đã thử ngay bây giờ và nó hoạt động tốt. Cảm ơn nhiều. Bạn có thể vui lòng Đăng câu trả lời này để tôi có thể đánh dấu nó là giải quyết và chọn nó như là giải pháp. – Raj

Trả lời

7

Sử dụng mã này:

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

Giải thích:

Mã này làm cho việc sử dụng factory method được mong đợi là một đại diện hoặc null của một dấu thời gian địa phương trong tiêu chuẩn ISO-8601-format. Và vì LocalDateTime không tham chiếu đến bất kỳ múi giờ nào, đầu ra của nó thông qua toString() không thể chứa chênh lệch múi giờ. Kết quả: XMLGregorianCalendar xem xét chênh lệch múi giờ là "chưa được đặt".

Correction:

Mã gốc không đặc biệt bận tâm về các tiêu chuẩn ISO-biến thể của định dạng đầu ra của currentUTCTime.toString(). Tuy nhiên, java.time-API tạo ra đầu ra không có giây hoặc nano giây nếu các phần đó bằng 0. Điều này là hoàn toàn hợp pháp trong ISO, nhưng W3C-consortium đã thực hiện phần thứ hai không bắt buộc. Và lớp XMLGregorianCalendar chặt chẽ theo thông số kỹ thuật lệch này. Vì vậy, các hack được hiển thị ở trên sử dụng nối chuỗi đơn giản trong trường hợp cạnh đặc biệt này. Cảm ơn rất nhiều nhận xét của @ Dave. Nhân tiện, bằng cách sử dụng currentUTCTime.format(DateTimeFormatter.ISO_DATE_TIME) như được đề xuất trong nhận xét này cũng có thể (thay vì hiển thị bản hack).

+1

Tính năng này không hoạt động. Những gì bạn muốn là DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.format (DateTimeFormatter.ISO_DATE_TIME)). XMLGregorianCalendar.newXMLGregorianCalendar (String) yêu cầu đối số của nó có số giây được điền. Nếu giây == 0 LocalDateTime.toString() sẽ bỏ qua các giây và trước của nó: dấu phân tách hoàn toàn làm cho phương thức nhà máy lịch để ném một IllegalArgumentException. – Dave

+0

@Dave Bây giờ đã điều chỉnh câu trả lời của tôi. –

+0

Sẽ tốt hơn nếu sử dụng trình định dạng so với câu lệnh if hack – JodaStephen

Các vấn đề liên quan