我正在试图弄清楚如何使用SmartGWT的TimeItem,Calendar和DateItem。我被困住了,因为所有这些组件都将其数据转换为客户端的时区。为了论证,让我们采用TimeItem。
我有一个DynamicForm,如果你将值设置为(Java.Util.Date),则内部有一个TimeItem,动态表格显示为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)伊斯坦布尔,如果可以清除任何内容
提前感谢您的帮助。
答案 0 :(得分:2)
这真的很有趣,我的一位朋友告诉我,这是由于Windows上的一些令人讨厌的行为。我不知道为什么或如何,但解决方案如下。如果我的时区设置为+2伊斯坦布尔,则可以重现上述错误,但是如果我将我的机器上的时区设置更改为雅典+2,则错误消失...所以我所做的就是更改我的设置以便我的时区设置为雅典+2。希望这有助于将来的任何人。
答案 1 :(得分:1)
您是否使用了以下内容(可能作为其他问题的解决方法)?
DateUtil.setDefaultDisplayTimezone("00:00");
默认情况下,SmartGWT使用浏览器时区来渲染日期/时间值
setDefaultDisplayTimezone()
用于全局设置在日期/时间格式化期间使用的UTC偏移量。
但是,DateTimeFormat
是一个GWT类,不受setDefaultDisplayTimezone()
的影响,即SmartGWT。
GWT by default uses the client’s local time zone
根据代码评论,VET为“委内瑞拉标准时间”,即“UTC-04:30小时”。
解析“120000”而未指定时区时,GWT将其解析为“12:00:00 UTC-04:30”。
这将由SmartGWT根据setDefaultDisplayTimezone()
值转换回UTC + 00:00,从而显示“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
如果SmartGWT中的默认时区必须设置为UTC + 00:00,则可以使用类似以下的内容
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 support
Stored datetime values are milliseconds since epoch.
They do not *have a* timezone, they are *rendered in* a timezone.