我注意到wsdl datetime,当使用java和axis转换为具有本地机器时区信息的Calendar对象时。我处于这样一种情况,我需要知道在datetime字段中传递的GMT偏移量,但它似乎正在使用某种类型的DateFormat进行解析,这将成为将其标准化为GMT时间的Date,然后将其转换为到具有本地计算机时区的Calendar对象。是否有一种简单的方法可以将Calendar对象设置为在发送的WSDL XML字段中指定的TimeZone GMT偏移量?或者有没有办法可以自己访问该字符串字段来进行自己的解析?
谢谢, BBB
答案 0 :(得分:1)
例如:
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));
答案 1 :(得分:0)
我遇到了类似的问题,但总是,因为我一直在返回的Calendar对象上使用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();
}