2011-08-25 70 views
0

我注意到,當使用java和axis時,wsdl datetime被轉換爲帶本地機器時區信息的Calendar對象。我處於這種情況,我需要知道在datetime字段中傳遞的GMT偏移量,但似乎它使用某種DateFormat來解析它變成日期,該日期將其標準化爲GMT時間,然後將其轉換到具有本地計算機時區的日曆對象。是否有一種簡單的方法將日曆對象設置爲WSDL XML字段中指定的TimeZone GMT偏移量?或者有沒有一種方法可以自己訪問該字符串字段來執行我自己的解析?Axis Web服務日期時間到Java日曆

感謝, BBB

回答

0

我已經打了類似的問題,但它有總是了,因爲我已經返回日曆對象上使用的getTime(),然後使用它的日期格式。問題出在getTime()方法中。

如果您直接詢問Calendar對象,您可以完全按照Web服務發送它的方式獲取信息。

特別是在時區周圍,假設Calendar對象是c。

c.get(Calendar.ZONE_OFFSET) 

會以毫秒爲單位獲取時區偏移量。然後,您可以隨意使用該值

下面是我用於我的情況的代碼,其中我需要將它重新取回到xsd:datetime格式的字符串中。毫無疑問,有更好的方法來編寫它,所以如果有人讀這個,並可以改進代碼,我會很感激。

public String calendarToXsdDateTimeString(Calendar c){ 
     StringBuffer outputStringBuffer = new StringBuffer(); 
     //2011-08-22T11:21:57 
     outputStringBuffer.append(c.get(Calendar.YEAR)); 
     outputStringBuffer.append("-"); 
     outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.MONTH)+1)); 
     outputStringBuffer.append("-"); 
     outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.DAY_OF_MONTH))); 
     outputStringBuffer.append("T"); 
     outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.HOUR_OF_DAY))); 
     outputStringBuffer.append(":"); 
     outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.MINUTE))); 
     outputStringBuffer.append(":"); 
     outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.SECOND))); 
     outputStringBuffer.append(getTimeZoneFromCalendar(c)); 
     return outputStringBuffer.toString(); 
    } 

    public String prefixZeroIfRequired(int value){ 
     if(value<10 && value >=0){ 
      return "0"+value; 
     } 
     else if(value <0 && value > -10){ 
      String s = value+""; 
      String s1 = s.charAt(0)+"0"+s.charAt(1); 
      return s1; 
     } 
     else{ 
      return ""+value; 
     } 

    } 

    private String getTimeZoneFromCalendar(Calendar c){ 
     StringBuffer outputStringBuffer = new StringBuffer(); 
     if(c.get(Calendar.ZONE_OFFSET) >= 0){ 
      outputStringBuffer.append("+"); 
     } 
     outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.ZONE_OFFSET)/1000/60/60)); 
     outputStringBuffer.append(":"+Math.abs(c.get(Calendar.ZONE_OFFSET)/1000/60)%60); 
     return outputStringBuffer.toString(); 
    } 
+0

正是這種返回日曆對象它不斷擁有當地的時區。這導致我對軸如何進行轉換的猜測。來自webservice的XML具有事件發生的時區,但是當我檢查日曆對象軸時,它給我它只有本地時區。 – bittramp

+0

@bitramp你如何獲得時區?如果您檢查上面的代碼,您會注意到我沒有使用getTimeZone(),我計算了ZONE_OffSET中的時區 –

1

我不舒服,如果這是正確的。 我的情況是,我從webservice獲取日期時間,Axis將它轉換爲日曆,比從webservice收到的值多1h。

如:

2015-11-19T12:00:00 from webservice 

    2015-11-19T13:00:00 got from parsed Axis object 

c.get(Calendar.ZONE_OFFSET)= 3600000

您可以創建正確的日期時間只是一個日期:

Date correctDate = new Date(c.getTime().getTime() - c.get(Calendar.ZONE_OFFSET));