我试图弄清楚如何使用SmartGWT的TimeItem、Calendar和DateItem。由于所有这些组件都将它们的数据转换为客户端的时区,所以我陷入了困境。为了论证起见,让我们以TimeItem为例。
我有一个DynamicForm,它的内部有一个TimeItem,如果将值设置为(Java.Util.Date)12:00,则dynamicform显示19:30。如果您通过TimeItem.getValue获得该值,它将返回(com.smartgwt.client.util.LogicalTime)13:30。下面是代码示例
DateTimeFormat timeFormatter = DateTimeFormat.getFormat("HHmmss");
layout = new VLayout();
form = new DynamicForm();
item = new TimeItem("TIME","TIME");
form.setItems(item);
layout.addMember(form);
Button btn = new Button("put");
btn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Date parse = timeFormatter.parse("120000");
System.out.println(parse.toString());// prints out Tue Aug 20 12:00:00 VET 2013
form.getField("TIME").setValue(parse); // sets 19:30 seen by the user
//form.getField("TIME").setValue("120000");
}
});
Button btn2 = new Button("get");
btn2.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Object value = form.getField("TIME").getValue();
System.out.println(value.toString());// prints out Thu Jan 01 13:30:00 VET 1970
//However if the value is set using a simple string,
//(like so "form.getField("TIME").setValue("120000");")
//this line
//prints out Thu Jan 01 06:00:00 VET 1970
}
});
layout.addMember(btn);
layout.addMember(btn2);
layout.draw();我的计算机时区设置为:(UTC+02:00)伊斯坦布尔,如果这样可以清除任何东西的话
提前感谢您的帮助。
发布于 2014-08-31 08:01:33
这真的很有趣,我的一个朋友告诉我,这是因为Windows上的一些令人讨厌的行为。我不知道为什么,也不知道怎么做,但解决方案如下。如果我的时区设置为+2伊斯坦布尔,上面的bug可以被复制,但是如果我将我的机器上的时区设置更改为雅典+2,那么bug就消失了。我所做的就是改变我的设置,使我的时区设置为雅典+2。希望这对将来的任何人都有帮助。
发布于 2013-08-25 23:50:03
你是否使用了以下方法(可能是解决其他问题的方法)?
DateUtil.setDefaultDisplayTimezone("00:00");默认情况下,SmartGWT使用浏览器时区呈现日期/时间值。
setDefaultDisplayTimezone()用于全局设置UTC偏移量,该偏移量在日期/时间格式化期间使用。
但是,DateTimeFormat是一个GWT类,不受setDefaultDisplayTimezone() (即SmartGWT )的影响。
默认情况下,GWT使用客户端的本地时区。
根据代码注释,VET是“委内瑞拉标准时间”,即"UTC-04:30小时“。
当不指定时区而解析"120000“时,GWT将其解析为”12:00:00UTC-04:30“。
这将由SmartGWT按照setDefaultDisplayTimezone()值转换回setDefaultDisplayTimezone(),从而显示"19:30:00 UTC+00:00“。
不使用setDefaultDisplayTimezone()或使用setDefaultDisplayTimezone("-04:30");时
System.out.println(parse.toString()); // => 12:00:00 VET
form.getField("TIME").setValue(parse); // => 12:00当使用DateUtil.setDefaultDisplayTimezone("00:00");时
System.out.println(parse.toString()); // => 12:00:00 VET
form.getField("TIME").setValue(parse); // => 19:30如果在UTC+00:00中必须将默认时区设置为SmartGWT,则可以使用类似于以下内容的内容
Date parse = DateTimeFormat.getFormat("HHmmss Z").parse("120000 +00:00");
System.out.println(parse.toString()); // => 19:30:00 VET
form.getField("TIME").setValue(parse); // => 12:00不过,要注意DST的变化等等。
另外,根据SmartClient支持的说法
Stored datetime values are milliseconds since epoch.
They do not *have a* timezone, they are *rendered in* a timezone.https://stackoverflow.com/questions/18339321
复制相似问题