Javascript java 8 Nashorn引擎无法比较日期

Javascript java 8 Nashorn引擎无法比较日期,javascript,java,date,java-8,nashorn,Javascript,Java,Date,Java 8,Nashorn,我想用Java8Nashorn引擎比较两个日期。但是,它没有正确地比较日期 我的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); as

我想用Java8Nashorn引擎比较两个日期。但是,它没有正确地比较日期

我的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
日期开始=新日期();
Calendar cal=Calendar.getInstance();
计算添加(日历日期,1);
Date end=cal.getTime();
发动机。放置(“启动”,启动);//引擎是脚本引擎
引擎。放置(“结束”,结束);
assertTrue((布尔)engine.eval(“开始<结束”)//这个断言失败了
//如果我将日期改为long,它就会起作用
engine.put(“start”,start.getTime());
engine.put(“end”,end.getTime());
assertTrue((布尔)engine.eval(“开始<结束”)//现在这就行了
但是,由于其他一些要求,我不想将date转换为long。请指出我犯错误的地方

感谢Nashnorn中的

,并生成完全不同的对象。这是有道理的,因为两个对象的功能差别很大。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)");
打印
“函数日期(){[本机代码]}:2016年7月23日星期六19:05:53 GMT-0400(EDT)”

然而

engine.put("javaStart", new Date());
engine.eval("print(javaStart.constructor + ':' + javaStart)");
打印
“未定义:2016年7月23日星期六19:05:53 EDT”