使用Rhino代替ScriptEngine在Java中运行Javascript代码

使用Rhino代替ScriptEngine在Java中运行Javascript代码,javascript,java,google-app-engine,rhino,scriptengine,Javascript,Java,Google App Engine,Rhino,Scriptengine,基于以上讨论,我想在我的appengine项目中使用JavaScriptDate函数。但是,ScriptEngine不能在应用程序引擎上工作。所以我需要一点帮助来转换成犀牛。以下是我需要转换的ScriptEngine代码: ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine engine = scriptEngineManager.getEngineByName("JavaScript

基于以上讨论,我想在我的appengine项目中使用JavaScript
Date
函数。但是,ScriptEngine不能在应用程序引擎上工作。所以我需要一点帮助来转换成犀牛。以下是我需要转换的ScriptEngine代码:

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();
以下几点不起作用

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

我已经用
null
替换了
“TestScript”
,您应该先这样尝试,看看它是否有效:

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

并且根据您接下来需要做的所有事情,通过java > > DeNeNunNoNetry> <代码>变量,这样就不需要java串连接(上下文足够智能,可以将Java方法的可访问变量看作JavaScript范围中的全局变量):


String script=“var date=new date(dateInUnknownFormat).getTime();”

在JavaScript引擎执行的脚本中,您只需要使用
新日期(dateString).getTime()
(您也可以使用
“var Date=new Date(dateString);Date.getTime()”;
)计算所需的值。不应将结果存储在变量中

我还对您的方法添加了两项内容:

  • 要将计算结果转换为字符串,应使用
    Context.toString(obj)
    。因为这里的结果实际上是一个数字,所以我们可以直接使用
    Context.toNumber(obj)
    ,它返回一个
    双精度
    ,并将其转换为
    长型
  • 我最后添加了一个
    块,该块从
    上下文退出
工作代码:

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

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

旁注:这是用Rhino 1.7.7测试的。

你忘记添加错误跟踪了吗?没有。我把它拿出来了,因为它不相关。我只是不知道如何正确地编写代码。不相关的原因是,根据我的尝试,我会得到不同的错误或没有错误。但最终,我无法让Rhino产生结果。很明显,了解Rhino工作原理的人在将ScriptEngine版本转换为Rhino时不会遇到任何问题。我遇到了类似的问题,因此我尝试应用您的解决方案,得到了
java.lang.NumberFormatException:对于输入字符串:“undefined”
。这就是你的代码块,它有
“var date=new date().getTime();”
你在发布之前测试过这段代码吗?它不起作用。