2011-08-25 36 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));