我们向客户端公开了一个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();
我想知道如何保留客户端发送的日期。
答案 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();
}