我使用以下代码在webservice
中设置XMLGregorianCalendar字段SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
Date dateOfBirth = null;
try {
dateOfBirth = format.parse(adult.getDob_day() + "-" + adult.getDob_month() + "-"
+ adult.getDob_year() + " 00:00:00");
} catch (Exception e) {
log.error("Error while parsing dateOfBirth. Cause " + e.getMessage());
e.printStackTrace();
}
passenger.setDateOfBirthField(convertToXMLCalendar(dateOfBirth));
convertToXMLCalendar方法如下
private XMLGregorianCalendar convertToXMLCalendar(Date date) {
XMLGregorianCalendar xmlCalendar = null;
GregorianCalendar calendar = new GregorianCalendar();
if (date != null) {
try {
calendar.setTime(date);
xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
} catch (Exception e) {
log.error("Error while converting to XMLGregorianCalendar. Cause " + e.getMessage());
// e.printStackTrace();
}
}
return xmlCalendar;
}
我的服务器位置时区是+03:00。但在少数随机场景中,时区在SOAP请求中以+04:00发送。
<ns7:dateOfBirthField>1955-08-27T00:00:00.000+04:00</ns7:dateOfBirthField>
因此,服务接收的日期比实际日期少一天。如果我发送03-06-2014 00:00:00它到达服务02-06-2014 11:00:00。
如果我将时间设置为12:00:00而不是00:00:00,则会解决问题。但是这个时区改变的原因是什么?
答案 0 :(得分:1)
您的SimpleDateFormat
没有指定时区,因此它使用您当地的时区。我建议:
Calendar
传递给convertToXMLCalendar
而不是date
......如果您需要(见下文)dateOfBirth
值只是一个日期,诚实的,例如1955-08-27
。这样你根本就没有指定时区。 事实上,鉴于您已获得年/月/日,我只是直接从这些值创建XMLGregorianCalendar:
XMLGregorianCalendar calendar = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(adult.getDob_year(),
adult.getDob_month(),
adult.getDob_day(),
DatatypeConstants.FIELD_UNDEFINED); // No time zone
然后您代表的是date
而不是dateTime
,这适合您的数据。
答案 1 :(得分:0)
您的日历未指定时区。我相信,只需修改convertToXMLCalendar方法,我们就可以摆脱这个问题
private static XMLGregorianCalendar convertToXMLCalendar(Date date) {
XMLGregorianCalendar xmlCalendar = null;
GregorianCalendar calendar = new GregorianCalendar();
// You can set GMT time zone or Default or whatever
//TimeZone myzone = TimeZone.getTimeZone("GMT");
TimeZone myzone = TimeZone.getDefault();
calendar.getInstance(myzone);
if (date != null) {
try {
calendar.setTime(date);
xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
} catch (Exception e) {
e.printStackTrace();
}
}
return xmlCalendar;
}