2012-12-24 52 views
1

我們有一個JAX-WS SEI暴露給我們的客戶端,請求中有一個XMLGregorianCalendar字段。問題出在客戶端用UTC發送日期時,服務層中的代碼將日期轉換爲當地時區,導致日期錯誤。JAX-WS SEI - 如何保留客戶端發送的日期值

例如,當運行在EST中的客戶端將2012-12-27-05:00發送到運行在CST中的服務器時,在服務器上將其轉換爲2012-12-26。我們希望2012-12-27的價值。我有以下代碼將XMLGregorianCalendar轉換爲日期。

Date convertedDate = xmlGregorianCalendar.toGregorianCalendar().getTime(); 

我想知道如何保留客戶端發送的日期。

回答

2

在「getTime」方法中,實際做過本地時區轉換的人員是您自己的代碼。正如你在調試中看到的,你的「xmlGregorianCalendar」仍然有客戶端發送的原始時間和時區(至少如果Web服務參數類型是「XmlGregorianCalendar」,就好像它是「Date」一樣,轉換確實發生在代碼背後的服務層)。

我遇到了同樣的問題,即使我在這裏試圖幫助你,我還沒有找到一個好的解決方案。但我找到了一個:

import java.util.Calendar; 
import java.util.Date; 
import javax.xml.datatype.XMLGregorianCalendar; 

... 

public Date webserviceDateToJavaDateKeepingOriginalTime(XMLGregorianCalendar webserviceDate) { 

    Calendar calendar = Calendar.getInstance(); 
    calendar.set(
      webserviceDate.getYear(), 
      webserviceDate.getMonth(), 
      webserviceDate.getDay(), 
      webserviceDate.getHour(), 
      webserviceDate.getMinute(), 
      webserviceDate.getSecond()); 

    return calendar.getTime(); 
} 

現在,它解決了我的問題,保持客戶端的時間。我相信在將來我會被迫做一些事情,比如在數據庫中存儲客戶端時區以及日期和時間,這樣我就可以在UI中顯示原始時間或轉換後的數據(本地時間),這將取決於場景。

我建議你閱讀this post

+0

@Solomon你已經回答了,因爲我也一樣。 –

0

我發現很久以前的答案,但忘了發佈我的答案。我現在發佈,因爲它可能對未來的其他人有幫助。

我評論我上面的代碼並添加以下,

private Date getDate(XMLGregorianCalendar xmlGregorianCalendar) { 

    /* 
    * Date convertedDate = xmlGregorianCalendar.toGregorianCalendar() 
    * .getTime(); return convertedDate; 
    */ 

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
    cal.set(xmlGregorianCalendar.getYear(), 
      xmlGregorianCalendar.getMonth() - 1, xmlGregorianCalendar 
        .getDay()); 
    return cal.getTime(); 

}