2014-03-13 65 views
1

我試圖從字符串轉換爲XML公曆日期和其總是返回我一個新的實例,請檢查下面字符串的XMLGregorianCalendar問題

輸入日期:: 2014-03-13 15:34我的代碼: 33 0000

所需的輸出日期:: 2014-03-13 15時34分33秒0000

但是,當我轉換使用我低於輸出代碼是2014-03-13T11:34:33.000-04 :00

public static void convertXMLGregorian() throws DatatypeConfigurationException { 
    TimeZone utc = TimeZone.getTimeZone("UTC"); 
    GregorianCalendar gc = new GregorianCalendar(); 

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); 
    XMLGregorianCalendar xc=DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 
    String xcs = df.format(xc.toGregorianCalendar().getTime());   

    XMLGregorianCalendar converted = stringToXMLGregorianCalendar(xcs, df); 
    System.out.println("converted " + converted); 
// output :: 2014-03-13T11:34:33.000-04:00 


// String conversion methods 

private static XMLGregorianCalendar dateToXMLGregorianCalendar(Date date) { 

    try { 

     GregorianCalendar gc = (GregorianCalendar) GregorianCalendar 
       .getInstance(); 

     gc.setTime(date); 

     return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 

    } catch (DatatypeConfigurationException e) { 

     System.out.print(e.getMessage()); 

     return null; 

    } 

} 


private static XMLGregorianCalendar stringToXMLGregorianCalendar(
     String datetime, SimpleDateFormat sdf) { 

    try { 

     Date date = sdf.parse(datetime); 

     return dateToXMLGregorianCalendar(date); 

    } catch (ParseException e) { 

     System.out.print(e.getMessage()); 

     return null; 

    } 

請幫助,提前致謝。

+0

輸入日期和期望輸出日期有什麼不同? – sakura

+0

多數民衆贊成那我期望的輸出不是當前輸出,如果你看到下一行當前輸出是2014-03-13T11:34:33.000-04:00 – user3288434

+1

@ user3288434你得到的預期日期,但在不同的時區。只需更改日曆中的時區,即可獲得*期望的*值。 –

回答

3

請參閱下文,瞭解現有代碼不適用於您的原因以及解決方法。但是,爲了保持UTC偏移做整個事情更簡單地說,我懷疑你只是想用DatatypeFactory.newXMLGregorianCalendar(String)

// This replaces *all* of the code in the question 
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar(datetime); 

唯一的飛行在這裏美中不足的是,它看起來像你的輸入沒有按」 t中有一個T,而規範的XML表示的確如此。這是很容易固定:

// The only place you've got a space is exactly where you want a T. 
datetime = datetime.replace(' ', 'T'); 
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar(datetime); 

原來的答覆

我懷疑這就是問題所在:

GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance(); 

,將創建默認時區日曆

如果你總是希望有一個UTC的偏移量爲0,只需使用:

gc.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

如果你想保留UTC在原文中抵消,這是一個不同的問題 - 你不能用你目前的方法做到這一點,因爲Date不保留這些信息。 (這只是一瞬間。)

順便說一句,我強烈建議你改變你的異常處理策略 - 簡單地返回null並繼續,因爲如果一切順利的話很少是一個好主意。它通常是或者讓異常傳播或者將其包裝在更合適的異常類型(可能是運行時異常)中。

+0

工作就像一個魅力,謝謝,你也有任何建議,以保持偏移量,2007-10-31T05:00:00.000Z是我得到的輸出後,有變化是有辦法改變它像2014年 - 03-13T11:34:33.000-04:00並保留偏移量。 – user3288434

+0

@ user3288434:我剛剛發現我懷疑*會是一個更好的選擇 - 現在將其編輯爲答案。 –

+0

哦是的,規範表示確實需要一個T,取代它解決了我的問題,但是當我試圖獲得偏移量yyyy-MM-dd HH:mm:ssZ它引發了我在解析時區時出錯:'2014-03- 13T19:17:41 + 0000'例外,但它的工作使用了這個yyyy-MM-dd HH:mm:ss格式。 – user3288434

0
System.out.println("converted " + converted); 

這將使用toString()方法進行轉換。你可能想在這裏使用你的SimpleDateFormat?