JAX-WS SEI - 如何保留客户端发送的日期值

时间:2012-12-24 15:14:48

标签: jax-ws

我们向客户端公开了一个JAX-WS SEI,请求中有一个XMLGregorianCalendar字段。问题是当客户端使用UTC发送日期时,服务层中的代码会将日期转换为其本地时区,从而导致错误的日期。

例如,当在EST中运行的客户端将2012-12-27-05:00发送到在CST中运行的服务器时,在服务器上它将转换为2012-12-26。我们希望价值为2012-12-27。我有以下代码将XMLGregorianCalendar转换为Date。

Date convertedDate = xmlGregorianCalendar.toGregorianCalendar().getTime();

我想知道如何保留客户端发送的日期。

2 个答案:

答案 0 :(得分:2)

在“getTime”方法中,实际上转换为本地时区的是您自己的代码。正如您在调试中看到的那样,您的“xmlGregorianCalendar”仍然具有客户端发送的原始时间和时区(至少如果Web服务参数类型为“XmlGregorianCalendar”,就好像它是“Date”一样,转换确实会发生在代码背后的服务层。)

我遇到过同样的问题,即使我在这里试图帮助你,我还没有找到一个很好的解决方案。但我找到了一个:

import java.util.Calendar;
import java.util.Date;
import javax.xml.datatype.XMLGregorianCalendar;

...

public Date webserviceDateToJavaDateKeepingOriginalTime(XMLGregorianCalendar webserviceDate) {

    Calendar calendar = Calendar.getInstance();
    calendar.set(
            webserviceDate.getYear(),
            webserviceDate.getMonth(),
            webserviceDate.getDay(),
            webserviceDate.getHour(),
            webserviceDate.getMinute(),
            webserviceDate.getSecond());

    return calendar.getTime();
}

到现在它解决了我的问题,保持了客户的时间。我相信未来我会被迫做一些事情,比如在数据库中存储客户端时区以及它的日期和时间,所以我将能够在UI中显示原始时间或转换后(到本地)时间)一,这取决于情景。

我建议你阅读this post

答案 1 :(得分:0)

我很久以前找到了答案,但忘记发布我的答案了。我现在正在发帖,因为它可能对将来的其他人有所帮助。

我评论了上面的代码并添加了下面的内容,

private Date getDate(XMLGregorianCalendar xmlGregorianCalendar) {

    /*
     * Date convertedDate = xmlGregorianCalendar.toGregorianCalendar()
     * .getTime(); return convertedDate;
     */

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.set(xmlGregorianCalendar.getYear(),
            xmlGregorianCalendar.getMonth() - 1, xmlGregorianCalendar
                    .getDay());
    return cal.getTime();

}