Я сталкивался с похожими проблемами, но всегда был, потому что я использовал getTime () для возвращенного объекта Calendar, а затем использовал для него средство форматирования даты. Проблема заключается в методе getTime ().
Если вы напрямую запросите объект Calendar, вы сможете получить информацию именно так, как ее отправляет веб-служба.
Конкретно вокруг часового пояса, предполагая, что объект 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();
}