2011-10-12 58 views
1

這是我第一次在Java中使用XML進行強化工作。代碼使用JAXB生成類然後解析。我有一個XML與日期...被JAXB從我的XML生成Java解析XML日期 - 排除時間

的類。它生成領域的以下內容:

@XmlElement(name = "CoverStartDate", required = true) 
protected XMLGregorianCalendar coverStartDate; 

在我的邏輯,我有以下

xxxx.setCoverStartDate(xmlGregorianCalendar(theDate) 

有它看起來像這樣的方法的XMLGregorianCalendar:

GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
gregorianCalendar.setTime(date); 
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); 

我返回XML這是生成的,具有指定時間的日期。我只想要日期(年 - 月 - 日)。

有什麼建議嗎?

感謝

回答

2

使用DatatypeFactory.newXMLGregorianCalendarDate(...),而不是簡單地使用任何的DatatypeFactory.newXMLGregorianCalendar(...)方法。

我不知道theDate在你的代碼片段中,但是如果你使用Date對象,你可以使用下面的代碼。

public static XMLGregorianCalendar setCoverStartDate(Date date) throws DatatypeConfigurationException { 
    Calendar calendar = Calendar.getInstance(); 
    date.setTime(date.getTime()); 
    return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(
     calendar.get(Calendar.YEAR), 
     calendar.get(Calendar.MONTH) + 1, 
     calendar.get(Calendar.DAY_OF_MONTH), 
     getTimeZone(calendar)); 
    } 

    public static int getTimeZone(Calendar calendar) { 
    return (int) TimeUnit.MINUTES.convert(calendar.get(Calendar.ZONE_OFFSET), TimeUnit.MILLISECONDS); 
    } 

(注意calendar'sCalendar.ZONE_OFFSET是以毫秒爲單位和newXMLGregorianCalendarDate(...)方法需要以分鐘爲單位的時區值,因而它需要被轉換。)

(還要注意,Calendar's個月索引是基於0,而XMLGregorianCalendar's月份爲1)。

如果這樣不起作用,那麼用於生成JAXB類的XML模式可能是錯誤的:也許它沒有指定使用xs:date XML模式類型(可能它使用改爲)。

只有最後一個建議:手工創建您的JAXB類。然後,您可以在類的字段上指定@XmlSchemaType這樣的註釋,從而爲您提供更多控制權。

+0

對於'@ XmlSchemaType',獲取更多關於如何使用日期/時間屬性的更多信息,請參閱:http:// blog。bdoughan.com/2011/01/jaxb-and-datetime-properties.html –

+0

這很棒。我實現了它,它看起來好多了。現在,而不是我的XML看起來像這樣: 2011-01-01T00:00:00.000 + 02:00。它看起來像這樣: 2011-01-01 + 02:00。還有什麼我可以做的更多來擺脫時區...所以它只顯示日期部分? – user990855

+0

好吧...對不起,我想通了。我使用DatatypeConstants.FIELD_UNDEFINED作爲時區設置。 – user990855

0

您需要使用格式化爲僅日期部分,忽略了時間DateFormatter。

喜歡的東西:(new SimpleDateFormat("yyyy MMMM dd")).format(theDate));