用于日期解析的API的GWT Long类型?

时间:2016-02-23 02:12:32

标签: gwt

我试图反序列化一个json api,它将时间戳作为长类型发送。我的叠加层看起来像这样:

public class OverlayTest extends JavaScriptObject {
    public final native Long getTimestamp() /*-{ return this.timestamp; }-*/;
}

这似乎有用 - 当我使用getter打印到控制台时,我得到了长值。我现在尝试将其传递到Date实例中进行格式化:

OverlayTest item = ...;
Date date = new Date(item.getTimestamp());
// or
Date date = new Date(item.getTimestamp().longValue());

但是我得到了一个TypeError异常:

longValue__J is not a function

输出堆栈跟踪有点严重,因为在我的情况下GWT输出已经编译为javascript。我知道GWT在某种程度上模仿Long支持,因为javascript无法直接执行 - 是否有一些解决方法,或者这是不可能的?

由于

1 个答案:

答案 0 :(得分:3)

类型java.lang.Long(或long)在GWT中被模拟,因为JS无法正确处理这种类型 - JS中的所有数字都是有效的Java双精度数,只有大约54位的精度,而a long / Long需要64位。如果GWT允许您将数字输入和输出JS作为长数,那么您将失去精确度。

在您的GWT代码中,包含三个数字的对象用于正确表示长整数。任何希望看到数字的JS代码都会非常惊讶地看到该对象,并且Java代码会看到一个数字而不是那个包装器对象会感到惊讶。

相反,要么将doubleint传入和传出JSNI。在通过millis约会的情况下,int将工作到2038年左右。也许届时我们的浏览器中会有相当大的数字。

即使你的JS代码中有一个很长的数字,它也会被默默地截断,以便它适合JS正确表示的内容,所以你不会丢失任何东西。如果你可以将数据保持在long整个时间会更好,但如果数字通过JS(除了作为字符串),精度将会丢失,数字足够大。但是,如果您的数字不会变得那么大,doubleint就足够了。

(我不知道为什么它似乎正常工作 - 猜测模拟对象有一个很好的toString,但没有具体说明你如何工作'工作&# 39;我无法确定发生了什么。)

相关问题