SmartGWT时区

时间:2013-08-20 15:39:49

标签: java gwt datetime timezone smartgwt

我正在试图弄清楚如何使用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)伊斯坦布尔,如果可以清除任何内容

提前感谢您的帮助。

2 个答案:

答案 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.