sencillos para otro llamar insertar funcion externo ejemplos desde codigos codigo archivo javascript java google-app-engine rhino scriptengine

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 directamente Context.toNumber(obj) , que devuelve un double y convertirlo a long .
  • Añadí un bloque finally que sale del Context .

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.