来自 API 的 GWT Long 类型用于日期解析?
GWT Long type from API for Date parsing?
我正在尝试反序列化一个 json api,它将时间戳作为 long 类型发送。我的覆盖图如下所示:
public class OverlayTest extends JavaScriptObject {
public final native Long getTimestamp() /*-{ return this.timestamp; }-*/;
}
这似乎有效 - 当我使用 getter 打印到控制台时,我得到了 long 值。我正在尝试将其传递到 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 不能直接这样做 - 是否有一些解决方法,或者这是不可能的?
谢谢
类型 java.lang.Long
(或 long
)在 GWT 中被模拟,因为 JS 无法正确处理这种类型 - JS 中的所有数字实际上都是 Java 双精度数,只有大约 54位精度,而 long
/Long
需要 64 位。如果 GWT 允许您将数字传入和传出 JS,那么您将失去精度。
在您的 GWT 代码中,一个包含三个数字的对象用于正确表示一个 long。任何希望看到数字的 JS 代码都会对看到该对象感到非常惊讶,并且 Java 代码会对看到数字而不是包装对象感到惊讶。
因此,要么将 double
s 和 int
s 传入和传出 JSNI。在日期传递毫秒的情况下,int
将在 2038 年左右之前正常工作。也许到那时我们的浏览器中会有合理大小的数字。
即使您的 JS 代码中有一个非常长的数字,它也会被静默截断以使其适合 JS 可以正确表示的内容,因此您不会丢失任何内容。如果你能把数据一直保存在 long
中会更好,但是如果数字通过 JS(而不是作为字符串),那么数字足够大就会丢失精度。但当然,如果您的数字不会变得那么大,double
或 int
就足够了。
(我不知道为什么它看起来工作正常 - 猜测是模拟对象有一个很好的 toString
,但没有具体说明你是如何得到它的 'work',我不确定发生了什么。)
我正在尝试反序列化一个 json api,它将时间戳作为 long 类型发送。我的覆盖图如下所示:
public class OverlayTest extends JavaScriptObject {
public final native Long getTimestamp() /*-{ return this.timestamp; }-*/;
}
这似乎有效 - 当我使用 getter 打印到控制台时,我得到了 long 值。我正在尝试将其传递到 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 不能直接这样做 - 是否有一些解决方法,或者这是不可能的?
谢谢
类型 java.lang.Long
(或 long
)在 GWT 中被模拟,因为 JS 无法正确处理这种类型 - JS 中的所有数字实际上都是 Java 双精度数,只有大约 54位精度,而 long
/Long
需要 64 位。如果 GWT 允许您将数字传入和传出 JS,那么您将失去精度。
在您的 GWT 代码中,一个包含三个数字的对象用于正确表示一个 long。任何希望看到数字的 JS 代码都会对看到该对象感到非常惊讶,并且 Java 代码会对看到数字而不是包装对象感到惊讶。
因此,要么将 double
s 和 int
s 传入和传出 JSNI。在日期传递毫秒的情况下,int
将在 2038 年左右之前正常工作。也许到那时我们的浏览器中会有合理大小的数字。
即使您的 JS 代码中有一个非常长的数字,它也会被静默截断以使其适合 JS 可以正确表示的内容,因此您不会丢失任何内容。如果你能把数据一直保存在 long
中会更好,但是如果数字通过 JS(而不是作为字符串),那么数字足够大就会丢失精度。但当然,如果您的数字不会变得那么大,double
或 int
就足够了。
(我不知道为什么它看起来工作正常 - 猜测是模拟对象有一个很好的 toString
,但没有具体说明你是如何得到它的 'work',我不确定发生了什么。)