java 8 Nashorn 引擎无法比较日期
java 8 Nashorn engine not able to compare dates
我想用 Java 8 Nashorn 引擎比较两个日期。但是它没有正确比较日期。
我的Java代码:
Date start = new Date();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date end = cal.getTime();
engine.put("start", start); // engine is ScriptEngine
engine.put("end", end);
assertTrue((boolean)engine.eval("start < end")); //This assert is failing
//if I change dates to long it is working
engine.put("start", start.getTime());
engine.put("end", end.getTime());
assertTrue((boolean)engine.eval("start < end")); //This will now work
但是由于其他一些要求,我不想将日期转换为长型。请指出我哪里出错了。
谢谢
在 Nashnorn,new java.util.Date()
and new Date()
产生完全不同的对象。这是有道理的,因为这两个对象的功能差异很大。 Nashorn 内部使用 jdk.nashorn.internal.objects.NativeDate
.
后面的,原生JS,可以和<
、>
比较放心。对于前者,将纯粹通过内存中的地址进行比较。
为了使用 less 和 greater 运算符,我建议在填充引擎的全局上下文时将 Java 日期转换为 NativeDate。
一种可能的方法是
Date start = new Date();
ScriptObjectMirror jsDate = (ScriptObjectMirror) engine.eval("new Date();")
jsDate.callMember("setTime",start.getTime());
engine.put("start", jsDate);
engine.eval("print(start.constructor + ':' + start)");
打印 "function Date() { [native code] }:Sat Jul 23 2016 19:05:53 GMT-0400 (EDT)"
但是
engine.put("javaStart", new Date());
engine.eval("print(javaStart.constructor + ':' + javaStart)");
打印"undefined:Sat Jul 23 19:05:53 EDT 2016"
我想用 Java 8 Nashorn 引擎比较两个日期。但是它没有正确比较日期。
我的Java代码:
Date start = new Date();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date end = cal.getTime();
engine.put("start", start); // engine is ScriptEngine
engine.put("end", end);
assertTrue((boolean)engine.eval("start < end")); //This assert is failing
//if I change dates to long it is working
engine.put("start", start.getTime());
engine.put("end", end.getTime());
assertTrue((boolean)engine.eval("start < end")); //This will now work
但是由于其他一些要求,我不想将日期转换为长型。请指出我哪里出错了。
谢谢
在 Nashnorn,new java.util.Date()
and new Date()
产生完全不同的对象。这是有道理的,因为这两个对象的功能差异很大。 Nashorn 内部使用 jdk.nashorn.internal.objects.NativeDate
.
后面的,原生JS,可以和<
、>
比较放心。对于前者,将纯粹通过内存中的地址进行比较。
为了使用 less 和 greater 运算符,我建议在填充引擎的全局上下文时将 Java 日期转换为 NativeDate。
一种可能的方法是
Date start = new Date();
ScriptObjectMirror jsDate = (ScriptObjectMirror) engine.eval("new Date();")
jsDate.callMember("setTime",start.getTime());
engine.put("start", jsDate);
engine.eval("print(start.constructor + ':' + start)");
打印 "function Date() { [native code] }:Sat Jul 23 2016 19:05:53 GMT-0400 (EDT)"
但是
engine.put("javaStart", new Date());
engine.eval("print(javaStart.constructor + ':' + javaStart)");
打印"undefined:Sat Jul 23 19:05:53 EDT 2016"