我想用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
但是,由于其他一些要求,我不想将日期转换为长日期。请建议我犯错的地方。
谢谢
答案 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"