2015-10-17 181 views
22

基于讨论converting string representation of unknown date-format to Date in java,我想在我的App-Engine项目中使用JavaScript Date函数。但是,ScriptEngine不适用于App-Engine。所以我需要一点帮助转换到犀牛。这里是ScriptEngine的代码,我需要转换:使用Rhino代替ScriptEngine在Java中运行Javascript代码

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

,我已经取代"TestScript"null""

+0

你忘了添加错误跟踪吗? – Filip

+1

不,我把它拿出来是因为它不相关。我只是不知道如何正确编写代码。无关因为我得到不同的错误或没有错误取决于我的尝试。但最终,我决不会让犀牛产生结果。显然,知道Rhino如何工作的人,将ScriptEngine版本翻译成Rhino没有任何问题。 – learner

回答

0

你应该首先尝试这样,看看它的工作原理:

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

而且根据this所有你需要做的下一个是通过dateInUnknownFormat变量像这样,没有所需的Java字符串连接(上下文是足够聪明,大概考虑到Java方法的访问变量作为全局变量在JavaScript范围):

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

+0

我有一个类似的问题,所以我尝试应用你的解决方案,我得到了'java.lang.NumberFormatException:对于输入字符串:“undefined”'。这是与你的确切的代码块有''var date = new Date()。getTime();'' –

+0

你在发布之前测试了这段代码吗?这是行不通的。 – learner

1

在由次执行脚本e JavaScript引擎,你只需要使用new Date(dateString).getTime()(你也可以使用"var date = new Date(dateString); date.getTime()";)来计算你想要的值。您不应将结果存储在变量中。

我还做了两个补充你的方法:

  • 要评估的结果转换为字符串,你应该使用Context.toString(obj)。由于这里的结果实际上是一个数字,我们可以直接使用Context.toNumber(obj),它返回double,并将其转换为long
  • 我添加了一个finally块,它从Context退出。

工作代码:

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 

附注:这是用犀牛1.7.7测试。