2015-10-17 5 views
22

Basierend auf der Diskussion converting string representation of unknown date-format to Date in java, möchte ich die JavaScript-Funktion Date in meinem App-Engine-Projekt verwenden. ScriptEngine funktioniert jedoch nicht mit App-Engine. Also brauche ich ein wenig Hilfe, um zu Rhino zu konvertieren. Hier ist der Scriptcode ich konvertieren müssen:Verwenden von Rhino anstelle von ScriptEngine zum Ausführen von JavaScript-Code in Java

ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); 
ScriptEngine engine = scriptEngineManager.getEngineByName("JavaScript"); 
String script = "var date = new Date('" + dateInUnknownFormat + "'); var timestamp = date.getTime();"; 
engine.eval(script); 
long timestamp = ((Double) engine.get("timestamp")).longValue(); 

Die folgende nicht funktioniert hat

private static long parseDateUsingRhino(String dateInUnknownFormat){ 
    Context mozillaJsContext = Context.enter(); 
    Scriptable scope = mozillaJsContext.initStandardObjects(); 
    String script = "var date = new Date('" + dateInUnknownFormat + "'); var timestamp = date.getTime();"; 
    Object obj = mozillaJsContext.evaluateString(scope, script, "TestScript", 1, null); 
    Double timeDouble = Double.parseDouble((String) obj); 
    long timestamp = timeDouble.longValue(); 
    return timestamp; 
} 

und ich habe bereits ersetzt "TestScript" mit null und "".

+0

Haben Sie vergessen, die Fehlerspur hinzuzufügen? – Filip

+1

Nein. Ich nahm es heraus, weil es irrelevant war. Ich weiß einfach nicht, wie man den Code richtig schreibt. Die Irrelevanz liegt daran, dass ich verschiedene Fehler oder keine Fehler bekomme, je nachdem, was ich versuche. Aber am Ende kann ich Rhino nie dazu bringen, ein Ergebnis zu erzielen. Jemand, der weiß, wie Rhino funktioniert, wird kein Problem damit haben, die ScriptEngine-Version in Rhino zu übersetzen. – learner

Antwort

0

Sie sollten es zuerst versuchen, wie diese und sehen, ob es funktioniert:

private static long parseDateUsingRhino(String dateInUnknownFormat){ 
     Context mozillaJsContext = Context.enter(); 
     Scriptable scope = mozillaJsContext.initStandardObjects(); 
     String script = "var date = new Date().getTime();"; 
     Object result = mozillaJsContext.evaluateString(scope, script, "", 1, null); 
     return Long.valueOf(Context.toString(result)); 
    } 

Und nach this alles, was Sie als nächstes tun müssen, ist, passieren die dateInUnknownFormat Variable wie so, keine Java-String-Verkettung erforderlich (Kontext ist intelligent genug, um wahrscheinlich die Java-Methode der zugänglichen Variablen als globale Variablen in dem JavaScript-scope) zu berücksichtigen:

String script = "var date = new Date(dateInUnknownFormat).getTime();";

+0

Ich habe ein ähnliches Problem und so versuche ich, Ihre Lösung anzuwenden und ich bekomme 'java.lang.NumberFormatException: Für Eingabe-String:" undefined "'. Und das ist mit Ihrem genauen Code-Block, der hat "var date = new Date(). GetTime();" –

+0

haben Sie diesen Code vor dem Posten getestet? Es funktioniert nicht. – learner

1

im Skript, das von th ausgeführt wird e JavaScript-Engine, Sie müssen nur den gewünschten Wert mit new Date(dateString).getTime() berechnen (Sie könnten auch "var date = new Date(dateString); date.getTime()"; verwenden). Sie sollten das Ergebnis nicht in einer Variablen speichern.

Ich habe auch zwei Ergänzungen zu Ihrer Methode:

  • das Ergebnis der Auswertung in eine Zeichenfolge zu konvertieren, sollten Sie Context.toString(obj) verwenden. Da hier das Ergebnis tatsächlich eine Zahl ist, können wir direkt Context.toNumber(obj) verwenden, die eine double zurückgibt, und es in long umwandeln.
  • Ich habe einen finally Block hinzugefügt, der aus dem Context austritt.

Arbeitscode:

private static long parseDateUsingRhino(String dateInUnknownFormat) { 
    Context mozillaJsContext = Context.enter(); 
    try { 
     Scriptable scope = mozillaJsContext.initStandardObjects(); 
     String script = "new Date('" + dateInUnknownFormat + "').getTime()"; 
     Object obj = mozillaJsContext.evaluateString(scope, script, "TestScript", 1, null); 
     return (long) Context.toNumber(obj); 
    } finally { 
     Context.exit(); 
    } 
} 

Probe:

System.out.println(parseDateUsingRhino("2015-10-25T15:06:42.000Z")); // prints 1445785602000 

Randbemerkung: Das mit Rhino 1.7.7 getestet.