java 8 Nashorn引擎无法比较日期

时间:2016-07-22 14:08:02

标签: javascript java date java-8 nashorn

我想用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

但是,由于其他一些要求,我不想将日期转换为长日期。请建议我犯错的地方。

谢谢

1 个答案:

答案 0 :(得分:1)

在纳什诺恩,new java.util.Date()new Date()生成完全不同的对象。这是有道理的,因为任何一个对象的功能都有很大不同。 Nashorn内部使用jdk.nashorn.internal.objects.NativeDate

后来的原生JS可以安全地与<>进行比较。对于前者,比较将纯粹按内存中的地址进行。

为了处理越来越多的运算符,我建议在填充引擎的全局上下文时将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"