3

我试图弄清楚如何使用 SmartGWT 的 TimeItem、Calendar 和 DateItem。我被困住了,因为所有这些组件都将它们的数据转换为客户的时区。为了论证的缘故,让我们以 TimeItem 为例。

如果您将值设置为 (Java.Util.Date)12:00,动态表单显示 19:30,我有一个 DynamicForm,其中有一个 TimeItem。如果您通过 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) 伊斯坦布尔,如果这样可以清除任何东西

预先感谢您的任何帮助。

4

2 回答 2

2

这真的很有趣,我的一个朋友告诉我这是由于 Windows 上的一些烦人的行为。我不知道为什么或如何,但解决方案如下。如果我的时区设置为 +2 伊斯坦布尔,则可以重现上述错误,但是如果我将机器上的时区设置更改为雅典 +2,错误就会消失,所以......我所做的只是更改我的设置,以便我的时区设置为雅典+2。希望这对将来的任何人都有帮助。

于 2014-08-31T08:01:33.967 回答
1

您是否使用过以下(可能作为其他问题的解决方法)?

DateUtil.setDefaultDisplayTimezone("00:00");

默认情况下,SmartGWT 使用浏览器时区来呈现日期/时间值。
setDefaultDisplayTimezone()用于全局设置 UTC 偏移量,用于日期/时间格式化。

但是,DateTimeFormat是一个 GWT 类,不受setDefaultDisplayTimezone()SmartGWT 的影响。
GWT 默认使用客户端的本地时区

根据代码注释,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 支持

Stored datetime values are milliseconds since epoch.
They do not *have a* timezone, they are *rendered in* a timezone.
于 2013-08-25T23:50:03.843 回答