1

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

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

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

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

4

2 回答 2

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 中显示原始时间或转换后的时间(到本地时间)一个,这将取决于场景。

我建议你阅读这篇文章

于 2012-12-27T14:06:33.963 回答
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();

}
于 2013-04-25T15:30:31.020 回答