otro - Usar Rhino en lugar de ScriptEngine para ejecutar código JavaScript en Java
llamar javascript desde html (2)
Deberías probarlo primero así y ver si funciona:
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));
}
Y de acuerdo con this todo lo que necesita hacer es pasar la variable dateInUnknownFormat
como tal, no se requiere concatenación de cadenas Java (el contexto es lo suficientemente inteligente como para considerar las variables accesibles del método java como variables globales en el alcance de JavaScript):
String script = "var date = new Date(dateInUnknownFormat).getTime();";
Basado en la discusión que convierte la representación de cadenas de formato de fecha desconocida a Date en java , quiero usar la función de Date
JavaScript en mi proyecto de App-Engine. Sin embargo, ScriptEngine no funciona en App-Engine. Entonces necesito un poco de ayuda para convertirme a Rhino. Aquí está el código de ScriptEngine que necesito convertir:
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();
Lo siguiente no ha funcionado
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;
}
y ya he reemplazado "TestScript"
con null
y ""
.
En el script que ejecuta el motor de JavaScript, solo necesita calcular el valor que desea utilizando la new Date(dateString).getTime()
(también podría usar "var date = new Date(dateString); date.getTime()";
). No debe almacenar el resultado dentro de una variable.
También hice dos adiciones a su método:
- Para convertir el resultado de la evaluación en una Cadena, debe usar
Context.toString(obj)
. Como aquí, el resultado es en realidad un número, podemos usar directamenteContext.toNumber(obj)
, que devuelve undouble
y convertirlo along
. - Añadí un bloque
finally
que sale delContext
.
Código de trabajo:
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();
}
}
Muestra:
System.out.println(parseDateUsingRhino("2015-10-25T15:06:42.000Z")); // prints 1445785602000
Nota al pie: esto fue probado con Rhino 1.7.7.