2016-07-22 13 views
1

Java 8 Nashornエンジンと2つの日付を比較すると仮定します。しかし、それは正確に日付を比較していません。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 

ため、私はいくつかの他の要件をlongに日付を変換する必要はありませんが。間違いをどこにしているのかをお伝えください。

おかげ

答えて

1
Nashnornにおいて

、とnew Date()完全に異なるオブジェクトを生成します。どちらのオブジェクトの機能性も大きく異なるため、理にかなっています。 Nashornは内部的にjdk.nashorn.internal.objects.NativeDateを使用しています。

ネイティブJSは、<>と安全に比較できます。前者の場合、比較は純粋にメモリ内のアドレスによって行われます。

大小の演算子で作業するには、エンジンのグローバルコンテキストを設定するときにJavaの日付をNativeDateに変換することをおすすめします。それをやっての

可能な方法の1つは、

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"

だろう