2015-10-17 28 views
22

In base alla discussione converting string representation of unknown date-format to Date in java, voglio utilizzare la funzione JavaScript Date nel mio progetto App-Engine. Tuttavia, ScriptEngine non funziona su App-Engine. Quindi ho bisogno di un piccolo aiuto per la conversione in Rhino. Ecco il codice ScriptEngine Ho bisogno di convertire:Utilizzo di Rhino anziché di ScriptEngine per eseguire il codice JavaScript 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(); 

La seguente non ha funzionato

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; 
} 

e ho già sostituito con "TestScript"null e "".

+0

Hai dimenticato di aggiungere la traccia di errore? – Filip

+1

No. L'ho tirato fuori perché era irrilevante. Non so come scrivere il codice correttamente. L'irrilevanza è dovuta al fatto che ottengo diversi errori o errori a seconda di ciò che provo. Ma alla fine, non riesco mai a far ottenere a Rhino un risultato. Chiaramente qualcuno che sa come funziona Rhino, non avrà problemi a tradurre la versione ScriptEngine in Rhino. – learner

risposta

0

Si dovrebbe provare prima come questo e vedere se funziona:

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)); 
    } 

E secondo this tutto quello che dovete fare dopo è passare la variabile dateInUnknownFormat in questo modo, non concatenazione di stringhe Java necessari (il contesto è abbastanza intelligente da considerare probabilmente variabili accessibili del metodo Java come variabili globali nel campo di applicazione javascript):

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

+0

Sto riscontrando un problema simile e quindi provo ad applicare la tua soluzione e ottengo 'java.lang.NumberFormatException: For input string:" undefined "'. E questo è con il tuo esatto blocco di codice che ha '" var date = new Date(). GetTime(); "' –

+0

hai testato questo codice prima di postare? Non funziona. – learner

1

nello script che viene eseguito da th Il motore JavaScript, devi solo calcolare il valore che vuoi usando new Date(dateString).getTime() (potresti anche usare "var date = new Date(dateString); date.getTime()";). Non dovresti memorizzare il risultato in una variabile.

Ho anche fatto due aggiunte al tuo metodo:

  • per convertire il risultato della valutazione di una stringa, è necessario utilizzare Context.toString(obj). Poiché qui, il risultato è in realtà un numero, possiamo utilizzare direttamente Context.toNumber(obj), che restituisce un double e trasmetterlo a long.
  • Ho aggiunto un blocco finally che esce dallo Context.

codice di lavoro:

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(); 
    } 
} 

Esempio:

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

Nota a margine: questo è stato testato con Rhino 1.7.7.