Date 当url具有GWT.codesvr时,GWT的行为不同
我使用eclipse创建了一个简单的GWT示例,我只向GreetingService添加了一个自动生成的方法Date 当url具有GWT.codesvr时,GWT的行为不同,date,gwt,Date,Gwt,我使用eclipse创建了一个简单的GWT示例,我只向GreetingService添加了一个自动生成的方法 Date greetServer2() ; 它的实现如下所示: public Date greetServer2(){ // TODO Auto-generated method stub // String s = "2014/04/08"; DateFormat inputFormatter = new SimpleDateFormat("y
Date greetServer2() ;
它的实现如下所示:
public Date greetServer2(){
// TODO Auto-generated method stub
//
String s = "2014/04/08";
DateFormat inputFormatter = new SimpleDateFormat("yyyy/MM/dd");
Date date=null;
try {
date = inputFormatter.parse(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
在客户端,我只是在弹出窗口中显示日期:
greetingService.greetServer2(new AsyncCallback<Date>() {
public void onFailure(Throwable caught) {
// Show the RPC error message to the user
...
}
public void onSuccess(Date result) {
Window.alert(result.toString());
}
});
弹出窗口显示“2014年4月8日星期二00:00:00 CLST”
但如果我在没有gwt.codesvr参数的情况下访问:
http://127.0.0.1:8888/HelloGWT.html
弹出窗口显示“2014年4月7日星期一23:00:00 GMT-400”
我的GWT是2.5.1,我的JDK是1.7.0_25
有什么线索吗
提前感谢。一个结果来自Java代码,另一个结果由浏览器生成。不同之处在于时区。如果希望结果一致,则不应使用date.toString(),而应使用
日期格式显示日期,并向其传递时区
请记住,您的用户可能处于不同的时区,并且他们都将根据浏览器设置看到不同的“时间”(甚至是不同的日期,如您的示例中所示),除非您在代码中指定时区
更新:
处理时区有不同的策略。例如,您可以将所有日期保存为长值(date.getTime()
),以保持一致性。然后,使用日期格式和时区显示它
如果您想确保您的日期恰好在选定时区的午夜开始,请在保存或使用它之前进行调整。我就是这样做的:
public static Long toMidnight(Long date, TimeZone timeZone) {
return date - date % (24 * 60 * 60 * 1000) +
timeZone.getOffset(new Date(date)) * 60 * 1000;
}
嗨,客户端(浏览器)和服务器都在同一台笔记本电脑上。我使用的时区是(UTC-04:00圣地亚哥)。实际上,我之所以写这个例子是因为我确实遇到了一些时区问题,我尝试调试它,但是gwt应用程序在正常运行和调试模式下的行为不同,这会导致很多混乱。然后使用DateFormat并传递时区。使用date.toString()
不会帮助您发现问题-您有相同的日期,只是Java和JavaScript显示不同。感谢您的回复,我使用它来格式化日期:ateTimeFormat f=DateTimeFormat.getFormat(“yyyy.MM.dd G HH:MM:ss vvv”);TimeZoneConstants t=(TimeZoneConstants)GWT.create(TimeZoneConstants.class);TimeZone tz=TimeZone.createTimeZone(t.americaSantiago());窗口警报(f.format(result,tz));现在两种情况都返回相同的日期字符串,但它是2014-04-07 23:00:00,如果我需要它是2014-04-08 00:00:00,我该怎么办?一个结果来自一个试图模拟JavaScript行为的插件
:实际上,不是。在DevMode中,Java代码在Java中运行,因此您直接使用Java.util.date#toString()
。在prod模式下,您可以从GWT运行模拟版本。请参阅(顺便说一句,这有点过时)
public static Long toMidnight(Long date, TimeZone timeZone) {
return date - date % (24 * 60 * 60 * 1000) +
timeZone.getOffset(new Date(date)) * 60 * 1000;
}