XMLGregoriancalendar中的时区错误

时间:2014-06-03 07:28:41

标签: java web-services gregorian-calendar

我使用以下代码在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,则会解决问题。但是这个时区改变的原因是什么?

2 个答案:

答案 0 :(得分:1)

您的SimpleDateFormat没有指定时区,因此它使用您当地的时区。我建议:

  • 根本不解析值。您已经获得了个人日,月和年 - 因此请直接使用日历!
  • Calendar传递给convertToXMLCalendar而不是date ......如果您需要(见下文)
  • 如果您真的想要将日历的时区指定为UTC ...虽然从根本上说我希望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;
}